Direct3D 10以降で三角ファンがサポートされないのはなぜですか?


16

ドキュメントに記載されているように、Direct3D 10以降で三角形のファンはサポートされていません

どうして?トライアングルファンを使用することに固有の欠点はありますか?


5
私の理解では、三角形のファンはしばしば非常に細い長い三角形になり、相互運用によりアーティファクトが発生するためです。また、ファンに接続されていない試行をレンダリングするには、個別の描画呼び出しが必要だと思います。ストリップで可能な限り。ファンができることでストリップが上手くできないと思う。
ClassicThunder

3
ファンはインデックスを使用して接続できるため、個別の呼び出しは不要です。同じことがストリップにも当てはまります(そしてファンをストリップで接続することもできます)。これははるかに柔軟で、縮退したトリスを必要とせず、帯域幅の点でより軽量です。
マキシマスミニマス

回答:


15

ハードウェアベンダーは、10年以上にわたって、使用する最も高速なプリミティブ型として、三角形ストリップ、インデックス付き三角形リスト、インデックス付き三角形ストリップを推進してきました。どうして?ストリップは、キャッシュの局所性が優れており(最初の1つに継続的にジャンプする代わりに、送信された最後の2つの頂点を再利用します)、インデックス付けにより、ハードウェア頂点キャッシュが実際に機能し、重複する頂点をより効果的に削除できます。

すべてのハードウェアベンダーが「この方法でこれを行うと、より高速になります」と言う場合、この方法で行うと、実際に高速になる可能性がかなりあります。

したがって、D3D10 +はこれを形式化するだけです。それが高速パスの場合、それは使用するパスであり、他のパスは存在しません。これは、D3D10 +の設計哲学の1つと一致しています。これは、あなたを高速な道に導き、そこにとどめることです。


4

これが実際に開発にどの程度影響するかはわかりませんが、そのような変更と同様に、ドライバー開発者がより良いドライバーを作成できるようになると言われています。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!=)。


3

(この特定の質問は意見の答えを保証します:)

主観的には、その建築物の宇宙飛行学と言えます。また、OpenGLESは「複雑さを軽減」するために多くの要素を捨てましたが、実際には、レガシーコードを使用してすべての開発者に複雑さを押し付けています。

もちろん、ハードウェアがネイティブにサポートしていない場合でも、三角形ファンをストリップまたは三角形に変換することで、三角形ファンをシーケンシングする人々との互換性を提供するのは簡単でした。

WebGLランタイムなどでは、検証済みのバッファーなどを常に追跡する必要があり、ドライバーは、サポートしていないにもかかわらずファンを送信するユーザーを簡単に管理できます

そのため、FFP からの投棄などは、大きな迷惑な IMOに過ぎません。


10年以上前であれば、これは良い答えだったでしょう。現在、頂点パイプラインはほとんどの場合ハードウェアに実装されており、頂点データはGPUメモリのバッファーオブジェクトに格納される可能性が高いため、ドライバーの仮想ファンツーストリップ実装では、頂点データをCPUメモリに戻す必要があります並べ替えてから、GPUメモリに再読み込みします。これは、(静的な頂点データがなくなったため)バッファオブジェクトを使用することの全ポイントを破壊するだけでなく、GPUメモリからのリードバックを必要とするため、helloパイプラインが停止し、パフォーマンスが低下します。
マキシマスミニマス

1
@ mh01どのハードウェアがファンをネイティブにサポートしていないのですか?HWは...すべての後に、完全なOpenGLと仕事に持っている
ウィル

頂点データはGPUメモリに保存される場合がありますが、最初は何らかの方法で(少なくとも1回)システムメモリから取得する必要があります。それはドライバーを通してです。(データはCPU側から発信されたものと仮定します。これは、特殊なハードウェアデモを除き、ほぼ常に行われます)。
BrainSlugs83 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.