2013-03-15 141 views
4

我試圖通過將紋理座標視爲頂點位置數組來渲染模型的UV貼圖。我爲完美呈現的模型設置了VAO,然後嘗試添加第二個VAO並將紋理座標緩衝區綁定到它。不幸的是它沒有渲染任何東西。VBO可以綁定到多個VAO嗎?

我已經寫了第二套頂點和片段着色器的紫外線地圖編譯得很好。緩衝區的綁定方式與模型VAO和頂點屬性集相同。我可以看到的唯一區別是我不重新指定緩衝區數據。

這是我建立的模型VAO代碼:

// Create model VAO 

glGenVertexArrays(1, &modelVAO); 
glBindVertexArray(modelVAO); 

// Create position buffer 

glGenBuffers(1, &positionBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, positionBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * vertexCount * 4, positions, GL_STATIC_DRAW); 
glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(0); 

// Create normal buffer 

glGenBuffers(1, &normalBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, normalBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * vertexCount * 3, normals, GL_STATIC_DRAW); 
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(1); 

// Create texture coordinate buffer 

glGenBuffers(1, &textureCoordinateBuffer); 
glBindBuffer(GL_ARRAY_BUFFER, textureCoordinateBuffer); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * vertexCount * 2, textureCoordinates, GL_DYNAMIC_DRAW); 
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(2); 

// Unbind model VAO 

glBindVertexArray(0); 

然後,我設置了UV貼圖VAO是這樣的:

// Create new UV map VAO 

glGenVertexArrays(1, &uvMapVAO); 
glBindVertexArray(uvMapVAO); 

// Bind texture coordinate buffer 

glBindBuffer(GL_ARRAY_BUFFER, textureCoordinateBuffer); 
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0); 
glEnableVertexAttribArray(0); 

// Unbind UV map VAO 

glBindVertexArray(0); 

是否有可能使用相同的VBO更多比這樣的一個VAO?

回答

6

Yes。 VAO僅存儲對維也納國際組織的參考資料,以及格式,偏移量等相關數據,詳見glVertexAttribPointerIndex VBOs有略微不同的語義。

+0

這也是我的想法。 'glGetError'也沒有返回任何錯誤,所以它一定是其他地方的問題。 – PeddleSpam 2013-03-15 18:29:22

相關問題