5

I currently do this to setup my vao:

glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo);

...

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBindVertexArray(0);

My question is: do I need to bind null buffers to prevent my vbo and ibo to change after I'm done with my vao or when bind a null vao it also unbinds current buffers? For example, I would do the following:

glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
4

1 回答 1

10

通常,您不必式地取消绑定缓冲区。束缚他们不应该有任何害处。他们不会只是自发地改变。如果其他代码也使用缓冲区,则无论如何都需要绑定自己的缓冲区,然后再对其进行操作。

如果您使用现代 OpenGL(核心配置文件),取消绑定 VAO 绝对是一种浪费。无论如何,每个顶点设置和绘制操作都必须绑定一个 VAO,因此无需取消绑定先前的 VAO,然后很快绑定另一个 VAO。

但是让我们暂时假设您仍然想要解除绑定缓冲区只是为了更健壮地抵抗应用程序中可能出现的行为不端的代码,并且您愿意支付性能损失。

GL_ARRAY_BUFFER和的答案不同GL_ELEMENT_ARRAY_BUFFERGL_ELEMENT_ARRAY_BUFFER绑定是 VAO 状态的一部分。因此,如果您取消绑定 VAO,该缓冲区也将自动取消绑定。

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

于 2014-08-20T22:26:32.587 回答