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 つのテクスチャは、次のシャドウ キャスティング ステージのために古いままになります。これにより、パフォーマンスのオーバーヘッドが発生しますか?