D3D に組み込まれた実行中の 3D エンジンがあります (SlimDX 経由)。レンダリング パイプラインの中断を避けるために、同じマテリアルを持つ多くのオブジェクトをより大きなメッシュにまとめました (状態の切り替えを減らすため)。これはうまく機能し、私のニーズに適したパフォーマンスレベルを提供します.
私が直面している問題は、実行時に、これらの大きなバッチ メッシュのサブセットのマテリアル プロパティを変更する必要があることです。そのために属性バッファを使用していますが、かなりうまく機能しています。以前は限られた数のアクティブ アトリビュート (メッシュあたり約 5 つ) を使用していましたが、今ではマテリアルにさらに多くのバリエーション (不透明度/カラーブレンドのさまざまな色合い) が必要であり、最終的には 100 以上の組み合わせになる可能性があります。これらの変更は実行時に発生するため、レンダリングが開始される前にそれらをまとめることはできません。確かにメッシュを再構築することはできましたが、それは遅く、マテリアル間の切り替えはインタラクティブな速度で行う必要があるため、そうではありません。
だから私の質問は、どのルートを取るのが最善ですか?
必要に応じて使用可能な属性 ID で顔を動的にマスクし、完了したらリセットする、より堅牢な属性処理システムを実装する必要がありますか? アトリビュート バッファのフラグメンテーションがパフォーマンス ヒットを追加することを聞いたことがあります。また、間にマテリアル スイッチがある後続の DrawSubset() 呼び出しのパフォーマンス ヒットについても確信が持てません (つまり、いつが多すぎて、いつアトリビュート配列を最適化する必要がありますか?)。これについて経験のある人はいますか?
私のもう 1 つのアイデアは、パラメーター化されたピクセル シェーダーを使用することです。派手なエフェクトは必要ありません。最低限必要なだけです (現在は、色のみで一部のオブジェクトが透明な組み込みのフラット シェーダーです)。そのため、シェーダー モデル 1 で十分です。ここでのアイデアは、1 つの汎用シェーダーを使用し、呼び出し間でマテリアルを切り替える代わりに、いくつかのシェーダー パラメーターを変更することです。しかし、これがマテリアルの切り替えよりも速いかどうか、および/またはプログラム可能なシェーダーがビルドインシェーダーよりも遅いかどうかはわかりません(同じ結果が与えられた場合)。
また、メッシュの切り替えと 1 つの大きなメッシュでの異なるサブセットの描画との間のパフォーマンス ヒットの違いについても興味があります (両方のケースで同じ数のマテリアル スイッチが与えられた場合)。
これらの質問は、GFXカードとそれぞれのパフォーマンス/年齢によって多少異なる場合があることを理解していますが、ここでは、何に最も力を注ぐべきかについての一般的なガイドラインを探しています (つまり、どのタイプの状態スイッチ/ CPU 干渉が最大のGPU ヒット)。メモリも懸念事項であるため、メッシュ全体 (または大部分) を複製する実装は私には不可能です。
私の焦点は、古い (5 歳)/機能の少ない/統合された GFX カードでのパフォーマンスであり、必ずしも最上位のゲーマー カードやワーク ステーション カード (Quadro など) ではありません。特定のボードでシェーダーのパフォーマンスがどれだけ優れているかに応じて、シェーダーを使用したソリューションを成功または失敗させる可能性があると思います。
すべての提案とフィードバックは大歓迎です。
よろしくお願いします!