VAO 是否也自动绑定索引数组?

Do VAOs also automatically bind indices arrays?

我见过很多程序在初始化阶段这样做(伪代码):

glGenVertexArrays(vao)
glBindVertexArray(vao)

glGenBuffers(vbo)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(into the vbo)

glVertexAttribPointer(instruct the vao on vbo's memory organization)

glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBO
glBindVertexArray(0); // Unbind VAO

glGenBuffers(vbo for indices)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo for indices)
glBufferData(populate indices vbo)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // Unbind vbo for indices

这是正确的做法吗? VAO 是否还存储对索引 vbo 的引用,以便我可以在索引的 vbo 也初始化后解除绑定 vao(并避免在绘图阶段完全绑定索引的 vbo)?

是的,VAO 确实存储了 GL_ELEMENT_ARRAY_BUFFER 绑定。

但请注意,它始终存储解除绑定 VAO 之前的最后状态。因此,如果您在取消绑定 VOA 之前调用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);,则绑定将被删除。在您的情况下,您还在绑定索引缓冲区之前取消绑定 VAO,因此此处没有存储绑定。

正确的代码代码是这样的:

lGenVertexArrays(vao)
glBindVertexArray(vao)

glGenBuffers(vbo)
glBindBuffer(GL_ARRAY_BUFFER, vbo)
glBufferData(into the vbo)

glVertexAttribPointer(instruct the vao on vbo's memory organization)

glBindBuffer(GL_ARRAY_BUFFER, 0); // Unbind VBO

glGenBuffers(vbo for indices)
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo for indices)
glBufferData(populate indices vbo)

glBindVertexArray(0); // Unbind VAO

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); // Unbind vbo for indices