2013-05-03 74 views
0

我熟悉IBO,VBO和VAO,同時在一個緩衝區中傳遞頂點,uvs和法線。雖然有些情況下,將它們合併到一個緩衝區中有點困難。OPEN GL:這是使用VBO IBO和VAO的正確方式

因此,我想出了這樣一段代碼:

glGenBuffers(2, &iboID[0]); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID[0]); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertInd.size() * sizeof(unsigned int), &vertInd[0], GL_STATIC_DRAW); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID[1]); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, uvInd.size() * sizeof(unsigned int), &uvInd[0], GL_STATIC_DRAW); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

glGenBuffers(2, &vboID[0]); 
glBindBuffer(GL_ARRAY_BUFFER, vboID[0]); 
glBufferData(GL_ARRAY_BUFFER, tempV.size() * sizeof(glm::vec3), &tempV[0], GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER, vboID[1]); 
glBufferData(GL_ARRAY_BUFFER, tempUV.size() * sizeof(glm::vec2), &tempUV[0], GL_STATIC_DRAW); 

glBindBuffer(GL_ARRAY_BUFFER, 0); 

glGenVertexArrays(1, &vaoID[0]); 
glBindVertexArray(vaoID[0]);  

glBindBuffer(GL_ARRAY_BUFFER, vboID[0]); 
glVertexAttribPointer(_shader->attrib("vert"), 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(_shader->attrib("vert")); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID[0]); 
outputError(); 
glBindBuffer(GL_ARRAY_BUFFER, vboID[1]); 
glVertexAttribPointer(_shader->attrib("vertTexCoord"), 2, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(_shader->attrib("vertTexCoord")); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, iboID[1]); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 
glBindVertexArray(0); 

所以我的問題是:這是這樣做的正確方法嗎? (因爲此刻我看不到任何東西在屏幕上)

回答

1

您試圖指定不同的元素數組(在單獨的IBO中),每個元素數組對應一個頂點屬性。這是行不通的。爲每個屬性定義單獨的VBO是好的,但GL只能有一個元素數組,同時索引全部當前啓用的屬性數組。

+0

哦,我明白了。謝謝你向我說清楚 – 2013-05-04 07:48:33