OpenGL渲染功能订单

时间:2018-04-23 00:32:13

标签: c# opengl rendering render

我正在使用OpenGL在Voxel游戏中渲染块的块。每个块都有自己的顶点缓冲区,现有的渲染函数(简化)如下:

foreach (Chunk c in chunks)
{
    glBindBuffer(BufferID.Array, c.handle);
    if (c.dirty)
    {
        glBufferData(BufferID.Array, ... , BufferUsage.StaticDraw);
        c.dirty = false;
    }

    // For position, normal, colour and UV
    glEnableVertexAttribArray(...);
    glVertexAttribPointer(...);

    glUseProgram(shader.Handle);
    glDrawArrays(DrawMode.TriangleStrip, 0, c.vertexBuffer.Length);
}

上面的代码可行,但glEnableVertexAttribArray,glVertexAttribPointer和glUseProgram上的CPU使用率很高。

我可以在循环开始之前调用这些函数,还是必须在每个glBindBuffer之后调用它们?

1 个答案:

答案 0 :(得分:3)

在有顶点阵列对象(VAO)之前,无论何时想要更改内存布局和/或指针,都确实要重做绑定。然后引入了顶点阵列对象,有一段时间人们伤心欲绝,因为有了驱动程序,然后性能仍然有很多不足之处(截至写这篇文章时,这是大约10年前 - 时间过得真快)。从那以后,司机改进了很多。

本质上,VAO存储哪些缓冲区绑定到哪个属性,以及这些绑定的内存布局。 https://www.khronos.org/opengl/wiki/Vertex_Specification#Vertex_Array_Object