vao外面的OpenGL glBindBuffer(0)?

时间:2014-08-20 19:18:31

标签: opengl vao

我目前正在设置我的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);

1 个答案:

答案 0 :(得分:8)

通常,您 不会明确解除缓冲区绑定。保持束缚不应该造成任何伤害。他们不会自发地改变。如果其他代码也在使用缓冲区,那么在对它们进行操作之前,它还是需要绑定它自己的缓冲区。

如果您使用的是现代OpenGL(核心配置文件),那么取消绑定VAO绝对是一种浪费。无论如何,每个顶点设置和绘制操作都必须绑定一个VAO,因此不需要解除之前的VAO绑定,然后不久就绑定不同的VAO。

但是,让我们暂时假设您仍然希望取消绑定缓冲区,以便对应用程序中可能行为不当的代码更加强大,并且您愿意支付性能损失。

GL_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFER的答案有所不同。 GL_ELEMENT_ARRAY_BUFFER绑定是VAO状态的一部分。因此,如果您取消绑定VAO,该缓冲区也将自动解除绑定。

GL_ARRAY_BUFFER绑定是不是 VAO的一部分。在这种情况下,您必须显式取消绑定缓冲区。