CHDIR "programs\samples\open_gl" '进入当前目录
DIM SHARED AllowSubGL ' =0 时 SUB _GL 不运行
TYPE DONT_USE_GLH_Handle_TYPE
in_use AS _BYTE
handle AS LONG
END TYPE
REDIM SHARED DONT_USE_GLH_Handle(1000) AS DONT_USE_GLH_Handle_TYPE
SCREEN _NEWIMAGE(1024, 768, 32)
backdrop = _LOADIMAGE("xcom_backdrop.jpg") '背景
_PUTIMAGE , backdrop
_FREEIMAGE backdrop
_DONTBLEND
LINE (200, 200)-(500, 500), _RGBA(0, 255, 255, 0), BF '创建一个视窗(按1)
_BLEND
AllowSubGL = 1
DO
'这是我们的程序的主循环
_LIMIT 100
LOCATE 1, 1
c = c + 1: PRINT "Mainloop has done nothing"; c; "times" '主循环运行了多少次
PRINT "Press 1[GL behind], 2[GL on top] or 3[GL only, good for speed] to switch rendering order."
' 按 1[GL 在后面],2[GL 在顶层] 或 3[GL 唯一,速度快] 切换渲染秩序良好。
k$ = INKEY$
IF k$ = "1" THEN _GLRENDER _BEHIND
IF k$ = "2" THEN _GLRENDER _ONTOP
IF k$ = "3" THEN _GLRENDER _ONLY
LOOP UNTIL k$ = CHR$(27)
END
'这是特别命名的过程 "_GL" 它检测qb64对OpenGL命令支持
'它是自动调用的(被),当底层软件认为可更新的时候,
'通常/理想情况下,与您的显示器的刷新率同步
SUB _GL STATIC
'上面使用的是静态的,使在这个过程中的所有变量保持它们的调用之间的值
IF AllowSubGL = 0 THEN EXIT SUB '还没准备好!
'时间就是一切,我们不知道3d渲染器如何快速的调用此过程,我们使用计时器来处理流畅运行问题
T# = TIMER(0.001)
IF ETT# = 0 THEN ETT
# = T#
ET
# = T#
- ETT#
ETT
# = T#
IF sub_gl_called = 0 THEN
sub_gl_called = 1 '我们只需要执行一次下面的代码
i = _LOADIMAGE("xcom256.png", 32)
mytex = GLH_Image_to_Texture(i) '此辅助函数将图像转换为纹理
_FREEIMAGE i
END IF
'这些设置会影响 OpenGL 渲染内容
'!!! 这些设置让 Alpha 显示如何工作,但当 Alpha 选项被禁用时,将快10倍!!!
'***每个设置必须重置,因为自从上次运行后,不能保证设置没有改变***
_glMatrixMode _GL_PROJECTION '选择投影矩阵
_glLoadIdentity '重置投影矩阵
'设置视景体 视野,宽高比, 近裁面(距离), 远裁面(距离)
_gluPerspective 45, _WIDTH(0) / _HEIGHT(0), 1, 100 '为了方便起见,QB64内部支持此GLU命令,但不支持GLU
_glEnable _GL_TEXTURE_2D
_glEnable _GL_BLEND
_glBlendFunc _GL_SRC_ALPHA, _GL_ONE_MINUS_SRC_ALPHA '如何解释α值
_glEnable _GL_DEPTH_TEST '使用 Z 轴缓冲
_glDepthMask _GL_TRUE
_glAlphaFunc _GL_GREATER, 0.5 '不要做任何事情,如果阿尔法不大于0.5(或128)
_glEnable _GL_ALPHA_TEST
_glTexParameteri _GL_TEXTURE_2D, _GL_TEXTURE_MAG_FILTER, _GL_LINEAR
_glTexParameteri _GL_TEXTURE_2D, _GL_TEXTURE_MIN_FILTER, _GL_LINEAR
'**************************************************************************************************************
GLH_Select_Texture mytex
_glMatrixMode _GL_MODELVIEW '选择模型观察矩阵
_glLoadIdentity '重置模型观察矩阵
_glTranslatef 0, 0, -10 '转化为屏幕
_glRotatef rotation1, 0, 1, 0 '自旋,自旋,自旋…
_glRotatef rotation2, 1, 0, 0
_glBegin _GL_QUADS '我们将绘制矩形(四边形)
_glTexCoord2f 0, 0: _glVertex3f 0, 0, 4 '顶点在空间中的位置和纹理位置
_glTexCoord2f 1, 0: _glVertex3f 5, 0, 4
_glTexCoord2f 1, 1: _glVertex3f 5, -5, 4
_glTexCoord2f 0, 1: _glVertex3f 0, -5, 4
_glEnd
RANDOMIZE USING 1 '每次生成相同的随机数集
_glBegin _GL_TRIANGLES 'PNG(几乎)仅消耗其矩形三角区
FOR t = 1 TO 10
_glTexCoord2f 0, 0: _glVertex3f RND * 6 - 3, RND * 6 - 3, RND * 6 - 3
_glTexCoord2f 1, 0: _glVertex3f RND * 6 - 3, RND * 6 - 3, RND * 6 - 3
_glTexCoord2f 0.5, 1: _glVertex3f RND * 6 - 3, RND * 6 - 3, RND * 6 - 3
NEXT
_glEnd
rotation1 = rotation1 + 100 * ET#
rotation2 = rotation2 + 200 * ET#
END SUB
'qb64 open-gl 辅助宏(又名 GLH 宏)
SUB GLH_Select_Texture (texture_handle AS LONG) '将图像句柄转换为纹理句柄
IF texture_handle < 1 OR texture_handle > UBOUND(DONT_USE_GLH_HANDLE) THEN ERROR 258: EXIT FUNCTION
IF DONT_USE_GLH_Handle(texture_handle).in_use = 0 THEN ERROR 258: EXIT FUNCTION
_glBindTexture _GL_TEXTURE_2D, DONT_USE_GLH_Handle(texture_handle).handle
END SUB
FUNCTION GLH_Image_to_Texture (image_handle AS LONG) '将图像句柄转换为纹理句柄
IF image_handle >= 0 THEN ERROR 258: EXIT FUNCTION '不允许屏幕页面
DIM m AS _MEM
m = _MEMIMAGE(image_handle)
DIM h AS LONG
h = DONT_USE_GLH_New_Texture_Handle
GLH_Image_to_Texture = h
_glBindTexture _GL_TEXTURE_2D, DONT_USE_GLH_Handle(h).handle
_glTexImage2D _GL_TEXTURE_2D, 0, _GL_RGBA, _WIDTH(image_handle), _HEIGHT(image_handle), 0, &H80E1&&, _GL_UNSIGNED_BYTE, m.OFFSET
_MEMFREE m
END FUNCTION
FUNCTION DONT_USE_GLH_New_Texture_Handle
handle&& = 0
_glGenTextures 1, _OFFSET(handle&&)
DONT_USE_GLH_New_Texture_Handle = handle&&
FOR h = 1 TO UBOUND(DONT_USE_GLH_Handle)
IF DONT_USE_GLH_Handle(h).in_use = 0 THEN
DONT_USE_GLH_Handle(h).in_use = 1
DONT_USE_GLH_Handle(h).handle = handle&&
DONT_USE_GLH_New_Texture_Handle = h
EXIT FUNCTION
END IF
NEXT
REDIM _PRESERVE DONT_USE_GLH_Handle(UBOUND(DONT_USE_GLH_HANDLE) * 2) AS DONT_USE_GLH_Handle_TYPE
DONT_USE_GLH_Handle(h).in_use = 1
DONT_USE_GLH_Handle(h).handle = handle&&
DONT_USE_GLH_New_Texture_Handle = h
END FUNCTION
2018年01月29日 05点01分
3