显示列表

显示列表是 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所示。

Document Image
\[\]

图4-1 使用显示列表绘图