0

VBO を使用するようにコードを切り替えたところ、突然、スプライト (2 つの三角形の三角形ストリップ) のテクスチャ座標が正しくなくなりました。

VBO を無効にすると、問題が解消されます。

注 - このリンクで指定されているように、頂点とテクスチャの座標データを 4 バイトに揃え ます。

これは頂点データの出力で、次のようになります: x、y、z、0.0f、tu、tv、0.0f、0.0f

    Vertex 0 -0.500000 0.500000 0.000000 0.000000 0.000000 1.000000 0.000000 0.000000 
    Vertex 1 -0.500000 -0.500000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 
    Vertex 2 0.500000 0.500000 0.000000 0.000000 1.000000 1.000000 0.000000 0.000000 
    Vertex 3 0.500000 -0.500000 0.000000 0.000000 1.000000 0.000000 0.000000 0.000000 

これは、VBO を生成する方法です。

m_numVertices = 4
m_stride = 8

glGenBuffers( 1, &m_vboVertices); // Generate our Vertex Buffer Object
glBindBuffer( GL_ARRAY_BUFFER, m_vboVertices); // Bind our Vertex Buffer Object
glBufferData( GL_ARRAY_BUFFER, (m_numVertices * m_stride) * sizeof(float), m_pVertexData, GL_STATIC_DRAW); // Set the size and data of our VBO and set it to STATIC_DRAW
glBindBuffer( GL_ARRAY_BUFFER, 0 );

glGenBuffers( 1, &m_vboIndices );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, m_vboIndices );
glBufferData( GL_ELEMENT_ARRAY_BUFFER, sizeof(GLubyte)*4, m_pIndices, GL_STATIC_DRAW );
glBindBuffer( GL_ELEMENT_ARRAY_BUFFER, 0 );

そして、これは私がスプライトをレンダリングする方法です:

glBindBuffer(GL_ARRAY_BUFFER, m_vboVertices);
glVertexPointer( 3, GL_FLOAT, byteStride, BUFFER_OFFSET(0) );
glTexCoordPointer( 2, GL_FLOAT, byteStride, BUFFER_OFFSET(4) );
glBindBuffer(GL_ARRAY_BUFFER,0); // reset

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_vboIndices );
glDrawElements(GL_TRIANGLE_STRIP, m_numVertices, GL_UNSIGNED_BYTE, BUFFER_OFFSET(0));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0); // reset

BUFFER_OFFSET は次のように定義されます。

#define BUFFER_OFFSET(i) ((char *)NULL + (i))

VBO の場合:http://i.imgur.com/zQ4GA.png

VBO なし:http://i.imgur.com/ByRVz.png

ありがとう。

編集 - コードを少しいじった後、この問題は GL_TRIANGLES を使用して描画するときにも発生するようです。

4

1 に答える 1

0

問題は、glTexCoordPointer オフセットをバイト単位で計算していないことにあるようです。そのはず:

glTexCoordPointer( 2, GL_FLOAT, byteStride, (char*)NULL + (4*sizeof(float)) );

マクロ BUFFER_OFFSET が正しくありませんでした。

この修正を適用すると、問題が解決しました。

于 2012-10-12T06:02:21.787 に答える