1

私は次のように、三角形の要素配列バッファーでVBOを使用しようとしています。

 glBindBuffer(GL_ARRAY_BUFFER, g_Buffer[0]);    
 glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
 glNormalPointer(GL_FLOAT, 0, BUFFER_OFFSET(Model->GetNbVertex()*3*sizeof(float)));

 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_Buffer[1]);
 glDrawElements(GL_TRIANGLES, Model->GetNbTriangle()*3, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

しかし、Texture Coordを使用したいのですが、TextCoordが積極的に「インデックス化」されていません

三角形には3つのテキスト座標があります。私はN個の頂点とM個の三角形を持っているので、3NTextCoordではなく3MTextCoordを持っています。したがって、glTexCoordPointerを使用することはできません。これは、頂点にテキスト座標が1つしかないことを期待しているためですが、私の場合はそうではありません。

GPUメモリを爆発させないように、頂点のインデックスを保持したいと思います。

私のテキスト座標のように、頂点のようないくつかの要素に三角形インデックスを使用し、他の要素には使用しない方法がありますか?(私はGLSLを使用しています)

4

2 に答える 2

0

次のことを明確にさせてください

三角形には 3 つのテキスト座標があります。N 個の頂点と M 個の三角形があるため、3N TextCoord ではなく、3M Text Coord があります。

三角形には 3つの頂点があります。頂点は、いくつかの属性で構成されるベクトルです。頂点が単なる位置であるというのはよくある誤解です! 実際、頂点はそれを構成するすべての属性の完全な組み合わせです。また、2 つの頂点の属性が 1 つだけ異なる場合、それらは異なる頂点です。

あなたの場合、属性は

  • 位置
  • テクスチャ座標

したがって、M 個の三角形があると言う場合、これは 3N 個の頂点があることを意味します。ただし、一部の三角形が頂点を共有するというコーナー ケースを除きます。これは、それらがすべての属性を共有することを意味します。

言い換えると、テクスチャ座標は頂点の一部であるため、頂点と同じ数のテクスチャ座標が常に存在します。

アップデート

一部のメッシュ形式は、頂点属性を、位置、法線、テクスチャ座標など、個別にインデックス付けされた属性のリストに分割します。通常、これらのリストは顔から索引付けされます。このようなメッシュ データ構造の内容を描画する場合は、最初にそれを頂点の単一のインデックス付きリストに展開する必要があります。これを行う通常の方法は、メッシュのすべての面を反復処理し、インデックスのタプルをキーとして新しい置換インデックスのリストに使用することです。次に、検出されたキーごとに、さまざまな属性リストから属性が収集され、置換インデックスによってインデックス付けされた単一の頂点になります。

于 2012-12-20T22:13:03.510 に答える
0

だから私は glTexCoordPointer を使用できません。彼は頂点にテキスト座標が 1 つしかないことを期待しているためです...

...テクスチャ単位ごと。さらに 2 つの TU をアクティブ化glTexCoordPointer()し、それぞれを呼び出します。

glVertexPointer( ... );
glNormalPointer( ... );

glActiveTexture( GL_TEXTURE0 + 0 );
glClientActiveTexture( GL_TEXTURE0 + 0 );
glBindTexture( ..., texture1 );
glTexCoordPointer( ..., FIRST_OFFSET );

glActiveTexture( GL_TEXTURE0 + 1 );
glClientActiveTexture( GL_TEXTURE0 + 1 );
glBindTexture( ..., texture2 );
glTexCoordPointer( ..., SECOND_OFFSET );

glActiveTexture( GL_TEXTURE0 + 2 );
glClientActiveTexture( GL_TEXTURE0 + 2 );
glBindTexture( ..., texture3 );
glTexCoordPointer( ..., THIRD_OFFSET );

glDrawElements( ... );

EDIT : ただし、最大限の柔軟性と上位互換性のために、頂点位置と 3 つのテクスチャ座標の両方に汎用頂点属性を使用するだけです。

于 2012-12-20T22:08:35.407 に答える