OpenGL 渲染函数顺序
OpenGL Render Function Order
我正在使用 OpenGL 在 Voxel 游戏中渲染块块。每个chunk都有自己的vertex buffer,现有的render函数(简化)如下:
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 之后调用?
在出现顶点数组对象 (VAO) 之前,无论何时您想要更改内存布局 and/or 指针,您确实都必须重做绑定。然后引入了顶点数组对象,有一段时间人们感到难过,因为当时的驱动程序的性能仍然有很多不足之处(在撰写本文时,这是大约 10 年前的事了——时间过得真快)。从那以后,车手进步很大。
本质上,VAO 存储哪些缓冲区绑定到哪些属性,以及这些绑定的内存布局。 https://www.khronos.org/opengl/wiki/Vertex_Specification#Vertex_Array_Object
我正在使用 OpenGL 在 Voxel 游戏中渲染块块。每个chunk都有自己的vertex buffer,现有的render函数(简化)如下:
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 之后调用?
在出现顶点数组对象 (VAO) 之前,无论何时您想要更改内存布局 and/or 指针,您确实都必须重做绑定。然后引入了顶点数组对象,有一段时间人们感到难过,因为当时的驱动程序的性能仍然有很多不足之处(在撰写本文时,这是大约 10 年前的事了——时间过得真快)。从那以后,车手进步很大。
本质上,VAO 存储哪些缓冲区绑定到哪些属性,以及这些绑定的内存布局。 https://www.khronos.org/opengl/wiki/Vertex_Specification#Vertex_Array_Object