0

glDrawElements と頂点、法線、および texcoordinate インデックスについて質問があります。

ジオメトリ頂点、頂点法線、テクスチャ頂点があり、それぞれに独自のインデックスがあるとします。

これらのインデックスのどれを使用できますか?

このコードがある場合:

glVertexAttribPointer(vertexHandle, 3, GL_FLOAT, GL_FALSE, 0,
        (const GLvoid*) &teapotVertices[0]);
glVertexAttribPointer(normalHandle, 3, GL_FLOAT, GL_FALSE, 0,
        (const GLvoid*) &teapotNormals[0]);
glVertexAttribPointer(textureCoordHandle, 2, GL_FLOAT, GL_FALSE, 0,
        (const GLvoid*) &teapotTexCoords[0]);

glEnableVertexAttribArray(vertexHandle);
glEnableVertexAttribArray(normalHandle);
glEnableVertexAttribArray(textureCoordHandle);

glBindTexture(GL_TEXTURE_2D, thisTexture->mTextureID);
glUniformMatrix4fv(mvpMatrixHandle, 1, GL_FALSE,
        (GLfloat*)&modelViewProjection.data[0] );
glDrawElements(GL_TRIANGLES, NUM_TEAPOT_OBJECT_INDEX, GL_UNSIGNED_SHORT,
        (const GLvoid*) &teapotIndices[0]);

teapotIndices を保持する必要があるのは何ですか?

ありがとう。

4

1 に答える 1

3

あなたの質問を理解しているかどうかわかりません。

TeapotIndices は、頂点をレンダリングする順序を示すインデックスのコレクションである必要があります。

たとえば、3 つの頂点 (三角形) で構成されるオブジェクトがあるとします。

0.0, 0.0, 0.0 //index 0, lower left corner
0.5, 0.5, 0.0 //index 1, top corner
1.0, 0.0, 0.0 //index 2, lower right corner

インデックスのコレクション/配列で、レンダリングする順序を指定します。三角形を反時計回りにレンダリングしたい場合は、インデックスを次のように指定します。

0,2,1

glDrawElements は、最初に左下隅、次に右下隅、最後に上隅を描画します。

もちろん、三角形が 1 つだけ含まれている場合、これはあまり意味がありませんが、最初の三角形を下向きにミラーリングする別の三角形を追加したいとします。これは、最初の三角形の底で接触することを意味します。その頂点に 3 つの頂点を再度指定する代わりに、頂点に異なる頂点を追加するだけで済みます。

0.0, 0.0, 0.0 //index 0, lower left corner for first triangle
0.5, 0.5, 0.0 //index 1, top corner for first triangle
1.0, 0.0, 0.0 //index 2, lower right corner for first triangle
0.5, -0.5, 0.0 //new: index 3, bottom corner of a "mirrored" triangle

そして、インデックスは次のようになります。

0,2,1, 2,0,3
//     ^^^^^ second triangle vertex indices

ほら、新しい頂点が 1 つだけの 2 番目の三角形を追加し、古い頂点の 2 つを新しい三角形に再利用しました。

于 2010-12-10T13:27:25.873 に答える