2017-05-05 88 views
0

我见过许多程序在初始化阶段这样做的(伪):Do VAOs是否也会自动绑定索引数组?

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绑定到索引)?

回答

2

是的,一个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 
+0

呵呵,有意思。对于非指数的维也纳国际组织来说,这也是不成立的,对吧?我看到你在解除绑定VAO之前解除了绑定VBO **的义务。 – Dean

+1

这是因为'GL_ARRAY_BUFFER'绑定(基本上)是由'glVertexAttribPointer'调用建立的。 – BDL

+0

谢谢。从khronos文档中不难理解。 – Dean