2017-05-05 64 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

相關問題