3

2 つの特定のシェーダーがある状況があります。

最初のシェーダーは、シーン内のすべてのオブジェクトから影を落とし、単一のフルスクリーン 8 ビット シャドウ テクスチャにレンダリングします。glsl コードは非常に短いです。

2 番目のシェーダーは、g バッファーに対してディファード ライティング計算を実行し、1 つのフルスクリーン 32 ビット テクスチャ バッファーにレンダリングします。いくつかのフル スクリーン テクスチャ (32 ビット ポジション、16 ビット ノーマル、32 ビット ディフューズ、8 ビット スペキュラー、8 ビット シャドウ) を使用します。glsl コードも非常に冗長です。

ご覧のとおり、ライトごとに、これら 2 つのシェーダーを続けて実行する必要があります。A の次に B、A の次に B、A の次に B。この結果、多くのスワッピングが発生します。

シェーダーのスワッピングには相対的に高いオーバーヘッドがあることを読んだことがありますが、GPU が 2 つのシェーダーのみの間のスワッピングをどのように処理するかについてはよくわかりません。

2 つのシェーダー プログラムは、これが問題にならないほど効果的にキャッシュされますか?

2 つのシェーダーを組み合わせて、glDrawBuffers() を使用して出力を送信する必要がありますか? それらを組み合わせると、前の g-buffer イルミネーション ステージからロードされた 5 つのテクスチャは、次のシャドウ キャスティング ステージのために古いままになります。これにより、パフォーマンスのオーバーヘッドが発生しますか?

4

1 に答える 1

4

2 つのシェーダー プログラムは、これが問題にならないほど効果的にキャッシュされますか?

問題はキャッシュではありませんが、シェーダーを変更すると GPU 実行パイプラインがフラッシュされます。また、パイプラインと分岐予測子が新たに切り替えられたシェーダーに落ち着くまでに数十クロック サイクルかかります。

2 つのシェーダーを組み合わせて、glDrawBuffers() を使用して出力を送信する必要がありますか?

ディファード シェーダーのセットアップで、あまり問題なく実行できる場合は? 絶対!

于 2013-04-19T09:05:08.717 に答える