我目前正在设置我的vao:
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
...
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBindVertexArray(0);
我的问题是:我是否需要绑定空缓冲区以防止我的vbo和ibo在我完成vao之后更改或绑定null vao时它还解除当前缓冲区的绑定?例如,我会执行以下操作:
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
答案 0 :(得分:8)
通常,您 不会明确解除缓冲区绑定。保持束缚不应该造成任何伤害。他们不会自发地改变。如果其他代码也在使用缓冲区,那么在对它们进行操作之前,它还是需要绑定它自己的缓冲区。
如果您使用的是现代OpenGL(核心配置文件),那么取消绑定VAO绝对是一种浪费。无论如何,每个顶点设置和绘制操作都必须绑定一个VAO,因此不需要解除之前的VAO绑定,然后不久就绑定不同的VAO。
但是,让我们暂时假设您仍然希望取消绑定缓冲区,以便对应用程序中可能行为不当的代码更加强大,并且您愿意支付性能损失。
GL_ARRAY_BUFFER
和GL_ELEMENT_ARRAY_BUFFER
的答案有所不同。 GL_ELEMENT_ARRAY_BUFFER
绑定是VAO状态的一部分。因此,如果您取消绑定VAO,该缓冲区也将自动解除绑定。
GL_ARRAY_BUFFER
绑定是不是 VAO的一部分。在这种情况下,您必须显式取消绑定缓冲区。