いくつかの頂点データがあります。位置、法線、テクスチャ座標。おそらく.objファイルまたは他の形式からロードしました。多分私は立方体を描いています。ただし、頂点データの各部分には独自のインデックスがあります。OpenGL / Direct3Dを使用してこのメッシュデータをレンダリングできますか?
2 に答える
最も一般的な意味では、いいえ。OpenGLとDirect3Dは、頂点ごとに1つのインデックスのみを許可します。インデックスは、頂点データの各ストリームからフェッチします。したがって、コンポーネントのすべての一意の組み合わせには、独自の個別のインデックスが必要です。
したがって、各面に独自の法線がある立方体がある場合は、位置と法線のデータを大量に複製する必要があります。立方体には8つの固有の位置と6つの固有の法線しかない場合でも、24の位置と24の法線が必要になります。
最善の策は、データが大きくなることを単に受け入れることです。非常に多くのモデル形式で複数のインデックスが使用されます。レンダリングする前に、この頂点データを修正する必要があります。Open Asset Importerなどの多くのメッシュ読み込みツールが、この修正を実行します。
ほとんどのメッシュは立方体ではないことにも注意してください。ほとんどのメッシュは、頂点の大部分で滑らかであり、法線/テクスチャ座標などが異なる場合があります。したがって、これは単純な幾何学的形状でよく発生しますが、実際のモデルでかなりの量の頂点が重複することはめったにありません。
GL3.xおよびD3D10
D3D10 / OpenGL 3.xクラスのハードウェアの場合、修正の実行を回避し、複数のインデックス付き属性を直接使用することができます。ただし、これによりレンダリングパフォーマンスが低下する可能性があることに注意してください。
以下の説明ではOpenGLの用語を使用しますが、Direct3Dv10以降には同等の機能があります。
アイデアは、頂点シェーダーからさまざまな頂点属性に手動でアクセスすることです。頂点属性を直接送信する代わりに、渡される属性は実際にはその特定の頂点のインデックスです。次に、頂点シェーダーはインデックスを使用して、1つ以上のバッファーテクスチャを介して実際の属性にアクセスします。
属性は、複数のバッファーテクスチャに保存することも、すべて1つに保存することもできます。後者を使用する場合、シェーダーは、バッファー内の対応する属性の開始インデックスを見つけるために、各インデックスに追加するオフセットを必要とします。
通常の頂点属性は、さまざまな方法で圧縮できます。バッファテクスチャは圧縮手段が少なく、 (サポートする画像形式を介して)比較的限られた数の頂点形式しか使用できません。
これらの手法のいずれかにより、全体的な頂点処理のパフォーマンスが低下する可能性があることに再度注意してください。したがって、圧縮または最適化のための他のすべてのオプションが使い果たされた後、最もメモリが制限された状況でのみ使用する必要があります。
OpenGL ES 3.0は、バッファテクスチャも提供します。OpenGLのバージョンが高いほど、バッファテクスチャではなく、SSBOを介してバッファオブジェクトをより直接的に読み取ることができます。これにより、パフォーマンス特性が向上する可能性があります。