2016-12-04 47 views
0

兩個VAO (va01, vao2)可以具有相同的頂點屬性索引號嗎?不同的VAO可以使用先前使用的頂點屬性索引號

GLuint vao1, vao2; 

glGenVertexArrays(1, &vao1); 
glGenVertexArrays(1, &vao2); 

{ 
glBindVertexArray(vao1); 
... 
glBindBuffer(GL_ARRAY_BUFFER, vbo1); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
... 
glBindVertexArray(0); 
} 

{ 
glBindVertexArray(vao2); 
... 
glBindBuffer(GL_ARRAY_BUFFER, vbo2); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0); 
... 
glBindVertexArray(0); 
} 

假設vbo1vbo2這些代碼之前被定義和他們得到了glBufferData了。 vao1vao2是否都具有相同的頂點屬性索引號0?

回答

1

是的,幾個VAO可以設置相同的頂點屬性,指向每個不同的VBO。

假設在這些代碼之前定義了vbo1和vbo2,並且他們得到了glBufferDataalready。 vao1和vao2是否都具有相同的頂點屬性索引號0?

你在這裏混淆了一些事情。 VAO從不關心BufferData。 VAO存儲屬性指針,屬性啓用和GL_ELEMENT_ARRAY_BUFFER_BINDING。他們做而不是存儲任何頂點數據,他們只參考它。和他們做的名字引用VBO - 這意味着你可以這樣做:

glBindBuffer(GL_ARRAY_BUFFER, vbo1); 
glVertexAttribPointer(i, ...); // here, a reference to vbo1 gets part of the attrib pointer for attrib i 
... 
glBindBuffer(GL_ARRAY_BUFFER, vbo1); 
glBufferData(...); // VAO will now point into this buffer storage 

(這也意味着你可以設置指針,你創建的VBO緩衝存儲之前,你只需要擁有創建了VBO對象)。也許你在this answer找到我的插圖很有幫助。

相關問題