部分モデルマトリックスを頂点シェーダーにアップロードした方がよいのはいつですか?


8

現在のところ、シーンをレンダリングするとき、およびシーングラフを反復処理するとき、各ノードのモデルマトリックスは、親のモデルマトリックスとシーンノードのポーズから計算されます。これは非常に単純で、行列の乗算の数をノードとフレームごとに1回の乗算にすでに減らしています。

しかし、これらのすべての行列乗算は、シーンノードの(複数の連続した)動きを非常に高速に実行できるように、CPUとすべてのフレームで実行する必要があります。ただし、GPUは多くの行列乗算を実行するのに適しているため、CPUですべてを計算するのではなく、複数の部分モデル行列を頂点シェーダーに送信することを検討しています。

この場合、すべての計算がすべてのノードではなくすべての頂点に対して行われるため、実際にはパフォーマンスが低下するため、GPUにすべてのパーツ(したがって、すべてのノードのポーズ)を送信することはおそらく意味がありません。しかし、多くの子を持つシーンノード、または(親に対して)移動しない子のみを持つシーンノードは、モデルマトリックスを分割し、乗算をシェーダーにシフトする場所になる可能性があります。

では、部分モデルマトリックスをシェーダーに送信して、乗算をGPUに移動するのはどのような場合に適していますか?それともこれは単に悪い考えですか?

回答:


9

ユニフォームで数学を行うことはシェーダーであり、通常、CPUでそれを実行するよりもパフォーマンスが向上しません。CPUは、行列計算を実行する際にGPUよりも遅くはありません。大量の計算を並列で実行するように構成されていないだけです。しかし、勝つためには実際にそのような大量の計算を行わなければなりません。GPUに2つの行列を乗算させるためだけに追加のデータをGPUに送信しても、ほとんど何も得られません。

ここで、スキニングマトリックスのバッファーがあるとします。それはかもしれないあなたがCPU上のすべてのワールド空間にそれらを変換するか、単にGPUに特別なモデル・ツー・ワールド空間行列を渡すかどうかは関係し始めます。しかし、それでも、頂点と骨の比率によって異なります。


私は計算量に依存します。GPUは数学演算に関して非常に高速であるため、試行錯誤の問題です。
マイケルIV

5

まれにですが。あなたは自分の質問でそれを半分答えました:頂点シェーダーは頂点ごとに1回実行され、フラグメントシェーダーはフラグメントごとに1回実行されます。その頂点またはフラグメントに固有の何かを実行していない場合は、シェーダーを呼び出すたびに、文字通りまったく同じことを実行しています。それは私にとってより効率的に聞こえません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.