これが可能かどうかはわかりませんが、一見の価値があります。このアルゴリズムを使用して、遅延レンダラーでのライトボリュームのオーバードローを減らすためにステンシルバッファーを使用しています(カメラがボリュームの外側にある場合)。
- 安価なシェーダーを使用して、深度テストをLEQUALに設定して面を描画し、ステンシルバッファーでマークします。
- 高価なライティングシェーダーを使用して、深度テストをGEQUALに設定して前面を描画します。
これにより、ライトボリューム内のピクセルのみがシェーディングされます。これに伴う問題は、複数のライトを描画するときに発生します。まず、状態の変更には費用がかかるため、ライトごとに安価なシェーダーと高価なシェーダーを繰り返し切り替えるのはおそらく最善の方法ではありません。理想的には、安価なシェーダーで8つのライトボリュームをレンダリングし、次に高価なシェーダーで8つのライトボリュームをレンダリングすることにより、ステンシルバッファーの8ビットすべてを利用したいと思います。ただし、どのピクセルがどのライトに属しているかを判断する方法がないため、ライトが重なると問題が発生します。
頭に浮かぶ解決策は、ライトごとにステンシルバッファで1ビットを使用することです。したがって、ライトnの場合、安価なパスでステンシルバッファのn番目のビットをマークし、高価なパスでそのビットがオンになっているピクセルのみをレンダリングします。
私はこれまでステンシルバッファを使用したことがありませんが、私が読んでいることから、これは不可能のようです。これを機能させるには、ビット単位のORを使用してステンシルバッファを設定する必要があり、ステンシル関数はビット単位のANDである必要があります。ただし、私が見ることができるステンシルバッファの操作は、KEEP、ZERO、REPLACE、INCR、DECR、およびINVERTのみであり、関数は、NEVER、ALWAYS、LESS、EQUAL、LEQUAL、GEQUAL、GREATER、およびNOTEQUALのみです。
ステンシルバッファを使用して、このORおよびANDing動作を何らかの方法で取得する方法はありますか?そうでない場合は、ライトボリュームを効率的にレンダリングするための代替アプローチはありますか?