显示列表是 OpenGL 预编译存储一组绘图命令的技术,用于重复调用,避免重复发送命令的开销。
创建显示列表
用Gl.glGenLists()函数生成显示列表的ID号,用Gl.glNewList(listID, Gl.GL_COMPILE)…Gl.glEndList结构创建显示列表。典型代码如下所示。
code.vb.net
' 生成列表ID
Dim listID As Integer = Gl.glGenLists(1)
' 开始编译
Gl.glNewList(listID, Gl.GL_COMPILE)
' 要存储的OpenGL命令
Gl.glColor3f(1.0F, 0.0F, 0.0F)
Gl.glBegin(Gl.GL_TRIANGLES)
Gl.glVertex2f(0.0F, 0.5F)
Gl.glVertex2f(-0.5F, -0.5F)
Gl.glVertex2f(0.5F, -0.5F)
Gl.glEnd()
Gl.glEndList()
调用显示列表
显示列表创建以后,就可以调用绘图。使用Gl.glCallList(listID)函数调用ID号为listID的显示列表。也可以进行批量调用。
code.vb.net
' 调用单个列表
Gl.glCallList(listID)
' 批量调用多个列表
Dim lists() As Integer = {listIDlistID + 1, listID + 2}
Gl.glListBase(base)
Gl.glCallLists(3, Gl.GL_UNSIGNED_INT, lists)
列表模式
显示列表可以有两种不同的编译模式,如表4-1所示。
表4-1 显示列表的编译模式
| 模式 | 说明 |
|---|---|
| GL_COMPILE | 仅编译,不执行 |
| GL_COMPILE_AND_EXECUTE | 编译并立即执行 |
显示列表示例
本例用显示列表绘制多个图形元素,代码如下所示:
code.vb.net
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim scene As Integer
scene = Gl.glGenLists(1)
Gl.glNewList(scene, Gl.GL_COMPILE)
Gl.glClear(Gl.GL_ACCUM_BUFFER_BIT)
DrawAll()
Gl.glEndList()
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT Or Gl.GL_DEPTH_BUFFER_BIT)
Gl.glPushMatrix()
Gl.glCallList(scene)
Gl.glPopMatrix()
SimpleOpenGlControl1.SwapBuffers()
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Me.Dispose()
End Sub
运行代码,生成包含直线段、矩形和圆的图形,如图4-1所示。
\[\]
图4-1 使用显示列表绘图