【发布时间】:2017-03-19 05:26:57
【问题描述】:
我正在关注basic tutorial on OpenGL 3.0。我不清楚为什么/如果我必须绑定、启用和取消绑定/禁用每帧的所有顶点缓冲区和纹理。
对我来说,似乎有太多 gl**** 调用,我想这有一些开销。例如here 你会看到每一帧都有几个块,比如:
// do this for each mesh in scene
// vertexes
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertex_buffer);
glVertexAttribPointer( 0, 3, GL_FLOAT,GL_FALSE,0,(void*)0);
// normals
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, normal_buffer );
glVertexAttribPointer( 1, 3, GL_FLOAT,GL_FALSE,0,(void*)0);
// UVs
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, uv_buffer );
glVertexAttribPointer( 2, 2, GL_FLOAT,GL_FALSE,0,(void*)0);
// ...
glDrawArrays(GL_TRIANGLES, 0, nVerts );
// ...
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(2);
想象一下,您不仅有一个,而是 100 个不同的网格,每个网格都有自己的 VBO,用于顶点、法线、UV。我真的应该为他们每个人的每一帧都做这个程序吗?当然我可以将这种复杂性封装到一些函数/对象中,但我担心这个 gl**** 函数调用的开销。
这台机器的某些部分不可能从per frame loop 移动到scene setup 吗?
另外I read VAO 是一种如何将一个对象的相应 VBO 打包在一起的方法。并且绑定 VAO 会自动绑定相应的 VBO。所以我在想每个网格(不是实例)可能有一个 VAO 应该如何完成 - 但根据 this answer 似乎不是这样?
【问题讨论】:
-
优化该代码的第一步是一组缓冲区 + 每个“对象”一个 VAO。 第二 优化该代码的步骤是一组缓冲区 + 每个“共享相同顶点属性格式的对象组”一个 VAO(通过拥有更大的缓冲区,在其中组合多个对象)。跨度>
-
如果您只有 100 个对象,那么切换每个对象的 VAO 甚至应该不会接近性能瓶颈。