将 OpenGL 绘制列表转换为顶点数组或 VBO

Posted

技术标签:

【中文标题】将 OpenGL 绘制列表转换为顶点数组或 VBO【英文标题】:Converting OpenGL draw lists to vertex arrays or VBOs 【发布时间】:2011-07-29 20:06:29 【问题描述】:

我正在尝试使用在 OpenGL 3.0+ 中不推荐使用的绘制列表转换程序,以使用顶点数组或 VBO,但我没有找到任何有关如何进行转换的示例。

现在程序中的内容是这样的(可能是 Python,但我真正感兴趣的是适当的 OpenGL 调用——例如,它也可以是 C++):

dl = glGenLists(1)
glNewList(dl, GL_COMPILE)
glBindTexture(GL_TEXTURE_2D, texture)
glBegin(GL_QUADS)
glTexCoord2f(0, 0)
glVertex2f(0, 0)
glTexCoord2f(0, 1)
glVertex2f(0, height)
glTexCoord2f(1, 1)
glVertex2f(width, height)
glTexCoord2f(1, 0)
glVertex2f(width, 0)
glEnd()
glEndList()

我们将纹理映射到一个矩形上。然后我们在某处绘制它:

glCallList(dl)

如何将其转换为使用顶点数组? VBO?

【问题讨论】:

【参考方案1】:

这是一些 Java 代码,在 C 中,FloatBuffers 是数组。

public VBO createVBO(List<Vec2> vertexList, List<Vec2> texelList)
    FloatBuffer vertexBuffer = FloatBuffer.allocate(vertexList.size()*3);
    FloatBuffer texelBuffer = FloatBuffer.allocate(texelList.size()*2);
    for(Vec2 point : vertexList)
        vertexBuffer.put(point.x);
        vertexBuffer.put(point.y);
        vertexBuffer.put(0);
    
    vertexBuffer.flip();
    for(Vec2 point : texelList)
        texelBuffer.put(point.x);
        texelBuffer.put(point.y);
    
    texelBuffer.flip();

    int[] vbo = new int[2];
    gl.glGenBuffers(1, vbo, 0);
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[0]);
    gl.glBufferData(GL.GL_ARRAY_BUFFER, vertexBuffer.capacity()*4, vertexBuffer, GL2.GL_STATIC_DRAW);
    gl.glGenBuffers(1, vbo, 1);
    gl.glBindBuffer(GL2.GL_ARRAY_BUFFER, vbo[1]);
    gl.glBufferData(GL.GL_ARRAY_BUFFER, texelBuffer.capacity()*4, texelBuffer, GL2.GL_STATIC_DRAW);

    return new VBO(vbo[0], vbo[1], vertexList.size());


public void renderVBO(VBO vbo)
    gl.glEnableClientState(GL2.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL2.GL_TEXTURE_COORD_ARRAY);

    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.vertices);
    gl.glVertexPointer(3, GL.GL_FLOAT, 0, 0);    
    gl.glBindBuffer(GL.GL_ARRAY_BUFFER, vbo.texels);
    gl.glTexCoordPointer(2, GL.GL_FLOAT, 0, 0);

    gl.glDrawArrays(GL.GL_TRIANGLE_FAN, 0, vbo.length);

    gl.glDisableClientState(GL2.GL_VERTEX_ARRAY);
    gl.glDisableClientState(GL2.GL_TEXTURE_COORD_ARRAY);

【讨论】:

以上是关于将 OpenGL 绘制列表转换为顶点数组或 VBO的主要内容,如果未能解决你的问题,请参考以下文章

我的OpenGL学习进阶之旅介绍顶点缓冲区对象VBO和元素数组缓冲区对象EBO,并对比使用VBO和不使用VBO绘制三角形的效果

OpenGL:尝试使用 VBO(顶点缓冲区对象)绘制线条,它不显示

VBO:未绘制数组

管理 OpenGL VBO 和颜色

OpenGL中的动态VBO

OpenGL顶点数组对象不记录VBO和IBO绑定