必要な描画呼び出しが少ないため、インデックス付き三角形リストのパフォーマンスが向上することを (少し前に) 読んだ後、三角形リストでエンジンを構築することにしました。今日、私は 0xffffffff に出くわしました。これは、DX ではストリップ カット インデックスと見なされるため、1 回の呼び出しで複数のストリップを描画できます。これは、三角形リストが優れたパフォーマンスを保持できなくなったことを意味しますか?
2 に答える
面積がゼロの縮退三角形を使用して、1 回の描画呼び出しで複数の三角形ストリップを描画することができます。ストリップ カットは、前のストリップの最後の頂点と次のストリップの最初の頂点を繰り返すだけで作成され、ストリップ ブレークごとに 2 つの要素 (2 つのゼロ領域の三角形) が追加されます。
Direct3D 10 の新機能は、ストリップ カット インデックス (インデックス付きジオメトリ用) とRestartStrip HLSL 関数です。両方を使用して、帯域幅のコストを効果的に削減する縮退三角形の方法を置き換えることができます。(カットの 2 つのインデックスの代わりに、1 つだけが必要です。)
表現力
プリミティブ リストをイコール ストリップに変換したり、その逆に変換したりできますか? もちろん、ストリップからリストへの変換は簡単です。リストからストリップへの変換では、ストリップをカットできると仮定する必要があります。次に、リスト内の各プリミティブを 1 つのプリミティブ サブストリップにマップできますが、これは役に立ちません。
したがって、少なくともトライアングル プリミティブの場合、ストリップとリストは常に同じ表現力を持っていました。Direct3D 10 の前は、ライン ストリップが不可能な場所でストリップ カットされるため、実際には表現力が同等ではありませんでした。
メモリと帯域幅
どのくらいのデータを GPU に送信する必要がありますか? メソッドを比較するには、特定のトポロジに必要な要素の数を計算できる必要があります。
プリミティブ リスト式
N ... total number of elements (vertices or indices)
P ... total number of primitives
n ... elements per primitive (point => 1, line => 2, triangle => 3)
N = Pn
プリミティブ ストリップ式
N, P, n ... same as above
S ... total number of sub-strips
o ... primitive overlap
c ... strip cut penalty
N = P(n-o) + So + c(S-1)
プリミティブのオーバーラップは、隣接するプリミティブが共有する要素の数を表します。古典的なトライアングル ストリップでは、トライアングルは前のプリミティブの 2 つの頂点を使用するため、オーバーラップは 2 です。ライン ストリップでは、1 つの頂点のみがライン間で共有されるため、オーバーラップは 1 です。1 のオーバーラップを使用するトライアングル ストリップはもちろん理論的には可能ですが、Direct3D では表現されません。
ストリップ カット ペナルティは、新しいサブストリップを開始するために必要な要素の数です。使用する方法によって異なります。ストリップ カット インデックスを使用すると、2 つのストリップを分離するために 1 つのインデックスが使用されるため、ペナルティは 1 になります。縮退した三角形を使用すると、ストリップ カットに 2 つの面積ゼロの三角形が必要になるため、ペナルティは 2 になります。
これらの式から、どのメソッドが最小のスペースを必要とするかはジオメトリに依存すると推測できます。
キャッシング
ストリップの重要な特性の 1 つは、データの時間的局所性が高いことです。新しいプリミティブがアセンブルされると、各頂点を GPU メモリからフェッチする必要があります。三角形の場合、これを 3 回行う必要があります。現在、メモリへのアクセスは通常遅いため、プロセッサは複数レベルのキャッシュを使用しています。最良のケースでは、必要なデータが既にキャッシュに格納されているため、メモリ アクセス時間が短縮されます。トライアングル ストリップでは、前のプリミティブの最後の 2 つの頂点が使用され、3 つの頂点のうち 2 つが既にキャッシュに存在することがほぼ保証されます。
使いやすさ
前述のように、リストをストリップに変換するのは非常に簡単です。問題は、サブストリップの数を減らすことによって、リストを効率的なプリミティブ ストリップに変換することです。手続き的に生成された単純なジオメトリ (ハイトフィールド地形など) の場合、これは通常実現可能です。既存のメッシュのコンバーターを作成することは、より困難になる可能性があります。
結論
Direct3D 10 の導入は、ストリップかリストかという問題にはあまり影響しません。ライン ストリップの表現力が同等になり、データがわずかに削減されました。いずれにせよ、ストリップを使用する場合、サブストリップの数を減らすと、常に最大の効果が得られます。
変換前および変換後の頂点キャッシュを備えた最新のハードウェアでは、トライストリッピングはインデックス付きトライアングル リストに勝るものではありません。トライストリッピングを実際に使用するのは、テレイン システムなど、ストリップを計算するのが簡単なものによって生成された、インデックスのないプリミティブだけです。
代わりに、最高のパフォーマンスを得るために、インデックス付きトライアングル リストの頂点キャッシュ最適化を行う必要があります。Hoppe アルゴリズムはDirectXMeshで実装されています。または、 Tom Forsyth の代替アルゴリズムを見ることができます。