6

テクスチャ座標を頂点位置の配列として扱うことにより、モデルのUVマップをレンダリングしようとしています。完全にレンダリングされるモデルにVAOを設定し、2番目のVAOを追加して、テクスチャ座標バッファーをそれにバインドしてみました。残念ながら、何もレンダリングされません。

UVマップ用の頂点シェーダーとフラグメントシェーダーの2番目のセットを作成しました。これらは、正常にコンパイルされます。バッファは、モデル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 );

このように複数のVAOで同じVBOを使用することは可能ですか?

4

1 に答える 1

8

はいVAOは、 glVertexAttribPointerで指定されているように、フォーマット、オフセットなどの関連データとともに、VBOへの参照を格納するだけです。インデックスVBOのセマンティクスはわずかに異なります。

于 2013-03-15T18:18:50.110 に答える