5

OpenGL ES を使用して、Blender からエクスポートされたいくつかのオブジェクトを表示しています。Blender は、頂点のリスト、面インデックスのリスト、および 2D テクスチャ座標のリストを提供します。Blender 内では、一般に OpenGL を信じていますが、テクスチャ座標はインデックス配列で記述された各頂点にマップされます。

2 つの質問があるとします。

  1. OpenGL ES では、テクスチャ座標がインデックス バッファではなく、頂点バッファのみにマップされることを理解する必要があります (「テクスチャの適用」セクションを参照)。これは事実ですか、または代わりにテクスチャ座標をインデックス バッファにバインドする方法はありますか?

  2. 上記が当てはまる場合、インデックス バッファーを使用することで得られるものはありますか? 結局、テクスチャを適切にマッピングするには、インデックス バッファで保存されたすべての冗長性を備えた頂点バッファを書き出す必要があります。パフォーマンスの向上はまだありますか、それともテクスチャ データに対してインデックス バッファーは冗長ですか?

4

1 に答える 1

11

1) OpenGL ES では、テクスチャ座標がインデックス バッファではなく、頂点バッファのみにマップされることを理解する必要があります。

右、テクスチャ座標はインデックス データではなく頂点データ (バッファまたは CPU 空間) に相対的です。インデックス メカニズムは、テクスチャリングから独立しています。

3 つの頂点 (それぞれ 3 つのコンポーネント) で構成されるこの頂点配列があるとします。

float vdata[] = {x0,y0,z0, x1,y1,z1, x2,y2,z2};

そして、この texcoord 配列は、3 つの座標 (それぞれ 2 つのコンポーネント) で構成されています。

float tdata[] = {u0,v0,    u1,v1,    u2,v2};

このデータを OpenGL に宣言するときは、頂点 0 (x0,y0,z0) をテクスチャ座標 0 (u0,v0) に、頂点 1 をテクスチャ座標 1 に、というように関連付けます。最後に、対応するテクスチャの部分を 3 つの頂点/3 つのテクスチャ座標で構成された三角形にマップします。

これは従来の OpenGL 画像ですが、頂点が 4 つのポリゴンの場合です。

代替テキスト
(ソース: glprogramming.com )

インデックス データ (バッファリングされているかどうかに関係なく) は、頂点を間接的に指定する方法であり、連続した方法ではありません。前の例で、三角形を 2 回レンダリングしたい場合は、次のようなインデックス配列を指定します。

unsigned int idata[] = {0,1,2, 0,1,2};

したがって、1) に対応するために、インデックス データは texcoords または色、法線などの他の頂点属性から独立しているため、texcoords をインデックス データにバインドしても意味がありません。

2)結局、テクスチャを適切にマッピングするには、インデックス バッファで保存されたすべての冗長性を備えた頂点バッファを書き出す必要があります。パフォーマンスの向上はまだありますか、それともテクスチャ データに対してインデックス バッファーは冗長ですか?

通常、メッシュのインデックス作成は、同じ頂点を再利用する際の冗長性を排除する方法であり、その結果、メモリ フットプリントのコストが削減されます。ほとんどの場合、多くの冗長性があると思います。

もちろん、3D 立方体を使用する場合、同じテクスチャ座標または法線を共有する頂点はありませんが、それは代表的なモデルではありません! ゲーム/CAD アプリケーションのメッシュのほとんどは、多くの頂点冗長性を備えた連続サーフェスであり、多くのインデックス作成に役立つと思います。

次に、インデックスがある場合、GPU は頂点前後のキャッシュを使用してレンダリングを高速化できます。メモリ帯域幅については、グラフィックス ドライバがインデックスを pci-express メモリ (DMA) に配置し、ビデオ メモリ帯域幅を消費しないため、インデックスを持つことはほとんど無料です。

全体として、頂点の繰り返しがほとんどなくても、インデックス バッファーを使用したパフォーマンスが悪いとは思いませんが、通常は、さまざまな OpenGL 実装に対してチェックし、独自のテストを作成する必要があります。

于 2009-09-26T23:34:07.153 に答える