0

シェーダーで条件を使用しないことをお勧めします。これは、ブール値のユニフォームに適しています。

A. boolean ユニフォームの異なる値に対して異なるシェーダーを作成しますか?

B. シェーダーを 1 つ作成if-elseし、次のようにコードで使用します。

uniform bool uValue;
if (uValue) {
// code
} else {
// code
}

均一なブール値の場合、ドライバーは複数のシェーダーをコンパイルするので、複数のシェーダーをわざわざ作成する必要はありません。しかし、これを確認することはできません。

ありがとう!

4

2 に答える 2

2

どちらのアプローチがよりパフォーマンスが高いかは、他の多くのことに依存します。

  • いくつの条件をオンにしていますか?
  • フレームごとに何回切り替えていますか?
  • 条件式の両側でどれだけの計算が行われますか?
  • あなたの状況における他のパフォーマンスの制約は何ですか? メモリ使用量?消費電力?クライアントから GPU への帯域幅?

両方のオプションを試し、Instruments でテストして、どちらが自分のケースでより良いパフォーマンスを発揮するかを確認してください。

于 2013-09-18T00:13:38.067 に答える
0

GPUプログラミングでは、ドライバーが非常に急速に変化することは誰もが知っています。

あなたの状態がかなり均等にバランスが取れている場合、おそらく決定的な正解または不正解はありません. これは、ハードウェア、ドライバーのバージョン、およびカード自体が並列バッチを作成するために使用する可能性のある将来のメカニズムによって異なります。

条件が一方的なものである場合は、1 つのシェーダーで if 条件を使用するか、2 つのシェーダーを使用して切り替えを行うと、実際の利点が得られる可能性があります。実際のデータを処理している間にグラフィックス カードの負荷をテストすることが、これに実際に答える唯一の方法です。

これがボトルネック ポイントであり、時間をかける価値がある場合は、おそらく両方を含めて、実行時に選択します。ただし、コードを最適化してもシェーダーが高速にならなければ意味がありません。コードが要求されたすべての視覚的機能を提供し、それでもプロセッサに依存している場合、仕事は完了です。

フェッチにバインドされている場合、if ステートメントを同様に最適化しても意味がありません。したがって、できるだけ多くの視覚的機能に到達するまですべての最適化を続けてから、最適化を行います。これにより、もう 1 つの機能が得られる可能性があります。その後、再度最適化します。

于 2013-09-21T05:50:31.043 に答える