2012-05-05 14 views
0

テクスチャをVBOに接続するにはどうすればよいですか?LWJGLのテクスチャを持つVBO

私はcolorBufferで作業していましたが、今はテクスチャを実装したいと思います。 これは私のdrawメソッドです:

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); 

まったく何も表示されません。テクスチャが正しくラオニングされ、イミディエイトモードで動作します。 VBOで動作させるには何が必要ですか?

答えて

2

テクスチャ座標のVBOは、texCoordPointerの設定時にバインドされていないようです。あなたのコマンドの順番を変えると効果があります。また、単一のVBOでtexCoordデータで頂点をオーバーライドします。最も簡単なソリューションは、それぞれに2つの別々のVBOを持つことです。

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); 

注:通常、あなたが複数回VBOあたりよりglBufferDataを呼び出して新しいVBOsに各フレームを作成する必要はありません。

+0

ああ、基本的にTexture Coordinatesは、gfxcarsメモリにバッファされる頂点の別のバッファです。さて、ありがとう、それは試合しました!私はもう少し理解しています。 – Frotty

+0

毎回BufferDataを呼び出さずにVBOを1つ以上動かす方法はありますか? – Frotty

関連する問題