デプスフェイル法
シャドウボリュームの問題点の1つである、
「カメラがシャドウボリュームの中に入ると影が破綻する」
を解決する方法について説明します。
一番簡単に解決する方法はデプスフェイル法です。
id Softwareのジョン・カーマックが広めた方法です。
別名カーマックリバースとも言われています。
ステンシルバッファに描画するときの+1、-1の決め方を変えるだけなのでほとんど手直しすることなく実装できます。
簡単なので、一般的によく使われていると思います。
ではさっそく簡単に説明します。
デプスフェイル法では、ステンシルバッファにシャドウボリュームを描画するときの条件が違います。
まず描画をするのはZテストが失敗したときです。
普通はZテストが成功したときしか描画しませんが、この方法では失敗したときに描画します。
それでこの方法の名前がデプスフェイル法と呼ばれています。
また、+1、-1の操作も違います。
裏面を描画するときには、Zテストに失敗したものを+1で描画する。
表面を描画するときには、Zテストに失敗したものを-1で描画する。
どちらの場合も、フレームバッファやZバッファには何も操作しません。
デプスフェイル法での、ステンシルバッファにシャドウボリュームを描画していく手順を図で説明します。
上の図は、裏面を+1で描画したものです。
赤い部分の値は+1になっています。
上の図は、表面を-1で描画したものです。
青い部分の値は-1になっています。
そしてこれらを合成すると、最終的なステンシルバッファが出来上がります。
下の図は+1の領域と-1の領域を合成したものです。
元の画像に、影の色をグレーにして塗りつぶしてみると下の図のようになります。
普通のステンシルシャドウの結果と同じことが確認できました。