2012-05-05 149 views
0

如何將紋理附加到VBO?在LWJGL中具有紋理的VBO

我讓它使用colorBuffer,現在我想實現一個紋理。 這是我的繪製方法:

Color.white.bind(); 
glBindTexture(GL_TEXTURE_2D, texture.getTextureID()); 

glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW); 
glVertexPointer(vertexSize, GL_FLOAT, 0, 0L); 




glEnableClientState(GL_VERTEX_ARRAY); 
glTexCoordPointer(3, GL_FLOAT, 0, 0); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glDrawArrays(GL_QUADS, 0, amountOfVertices); 
glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

這完全不顯示任何內容。紋理正確地被覆蓋了,我得到它與直接模式的工作。 如何使其與維也納國際組織合作,我需要做些什麼?

回答

2

看起來像設置texCoordPointer時紋理座標的VBO未被綁定。改變命令的順序應該可行。您也可以在單個VBO中使用texCoord數據重寫頂點。最簡單的解決方案是爲每個維護者分配兩個獨立的維也納組織。

glBindTexture(GL_TEXTURE_2D, texture.getTextureID()); 
// vertices 
glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle); 
glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW); 
glVertexPointer(vertexSize, GL_FLOAT, 0, 0L); 
// texCoords 
glBindBuffer(GL_ARRAY_BUFFER, vboTexCoordHandle); 
glBufferData(GL_ARRAY_BUFFER, textureData, GL_STATIC_DRAW); 
glTexCoordPointer(3, GL_FLOAT, 0, 0); 
// unbind VBO 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

glDrawArrays(GL_QUADS, 0, amountOfVertices); 

glDisableClientState(GL_COLOR_ARRAY); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

注:通常你不想通過調用glBufferData超過每一次VBO創造新的維也納組織每一幀。

+0

啊,所以基本上紋理座標只是緩衝到gfxcars內存的頂點的另一個緩衝區?非常感謝你,那回合做到了!而且我現在也更加了解它。 – Frotty

+0

如何管理多個移動的VBO,然後每次都不調用BufferData? – Frotty