ドキュメントに記載されているように、Direct3D 10以降では三角形のファンはサポートされていません。
どうして?トライアングルファンを使用することに固有の欠点はありますか?
ドキュメントに記載されているように、Direct3D 10以降では三角形のファンはサポートされていません。
どうして?トライアングルファンを使用することに固有の欠点はありますか?
回答:
ハードウェアベンダーは、10年以上にわたって、使用する最も高速なプリミティブ型として、三角形ストリップ、インデックス付き三角形リスト、インデックス付き三角形ストリップを推進してきました。どうして?ストリップは、キャッシュの局所性が優れており(最初の1つに継続的にジャンプする代わりに、送信された最後の2つの頂点を再利用します)、インデックス付けにより、ハードウェア頂点キャッシュが実際に機能し、重複する頂点をより効果的に削除できます。
すべてのハードウェアベンダーが「この方法でこれを行うと、より高速になります」と言う場合、この方法で行うと、実際に高速になる可能性がかなりあります。
したがって、D3D10 +はこれを形式化するだけです。それが高速パスの場合、それは使用するパスであり、他のパスは存在しません。これは、D3D10 +の設計哲学の1つと一致しています。これは、あなたを高速な道に導き、そこにとどめることです。
これが実際に開発にどの程度影響するかはわかりませんが、そのような変更と同様に、ドライバー開発者がより良いドライバーを作成できるようになると言われています。GPUドライバーの複雑さは驚くべきものですが、この正確な変更が大いに役立つかどうかはわかりません。
どちらの場合でも、ほとんどのニーズ(凸多角形レンダリングなど)の三角形のファンをストリップで置き換えることができ、多くの場合より良い結果が得られます。
// A simplified API interface is presented for the purposes of having readable pseudocode
// Push( pos ) - pushes position data to make a new vertex
// TRIANGLE FANS:
for( i = 0; i < vertices.count; ++i )
Push( vertices[ i ] );
// TRIANGLE STRIPS:
for( i = 0; i < vertices.count; ++i )
{
if( i % 2 == 0 )
vertex = i / 2;
else
vertex = vertices.count - 1 - i / 2;
Push( vertices[ vertex ] );
}
編集:言及するのを忘れた-あなたがワインディングの順序を変更する必要がある場合-その「if」でテストを逆にするだけです(== to!=)。
(この特定の質問は意見の答えを保証します:)
主観的には、その建築物の宇宙飛行学と言えます。また、OpenGLESは「複雑さを軽減」するために多くの要素を捨てましたが、実際には、レガシーコードを使用してすべての開発者に複雑さを押し付けています。
もちろん、ハードウェアがネイティブにサポートしていない場合でも、三角形ファンをストリップまたは三角形に変換することで、三角形ファンをシーケンシングする人々との互換性を提供するのは簡単でした。
WebGLランタイムなどでは、検証済みのバッファーなどを常に追跡する必要があり、ドライバーは、サポートしていないにもかかわらずファンを送信するユーザーを簡単に管理できます。