Light Space Perspective Shadow Map

最近になって Perspective Shadow Map (PSM)について調べてみた。
知らない人はあんまりいないと思いますが、シャドウマップでライトビューを歪めてカメラに近い位置ほど多くの解像度を割り当てるという手法。
つまり、カメラから遠いほど影は粗くなり、カメラに近いほど影は細かくなるわけです。
通常のシャドウマップでは

ワールド×ライトビュー×ライト射影

と行列を掛け合わせるところ、

ワールド×カメラビュー×カメラ射影×カメラビューの逆行列×ライトビュー×ライト射影

と行列を掛け合わせます。
こうするとカメラに近い部分ほど細かくなるのですが、問題もあります。
特にカメラの後ろに影を落とすオブジェクト(キャスター)があると、透視投影のためにおかしな影になります。
このような問題を解決する方法として Light Space Perspective Shadow Map (LiSPSM)があります。

PSM ではカメラの行列を使っていましたが、LiSPSM ではカメラとは別の行列をでっち上げます。
そもそも PSM のように正確なカメラ行列を使用する必要は実際にはありません。それっぽければそれなりに効果が上がるのです。
そこで、LiSPSM はライトベクトルと垂直なビューベクトルを持った新しいビューを仮定し、これに対して PSM を行います。
基本的に LiSPSM は平行光源で用いられるので、ライトビューからこの新しいビューのビューボリュームを見ると完全な平面の台形になります。
ライトビューのUPベクトルをこの新しいビューのビューベクトルと同じ物を使うのですが、こうするとライトビューから見たビューボリュームはピッタリとテクスチャに貼り付けられるようになります。
つまり、このようになるライトビュー行列と新しいビューのビュー行列を求める必要があるわけです。
この新しいビューは基本的にカメラビューのビューボリュームを内包する必要があります。
また、影を落とすオブジェクトも全て内包する必要があります。
つまり、カメラのビューボリュームとカメラの中に入る影を落とすキャスターを全て内包している必要があるのです。
ぶっちゃけてしまうと、LiSPSM で変換行列を求めるのはそれほど難しくありません(ただ、サンプルにあった計算は意味がよくわからない)。
問題は新しいビューボリュームが内包しなければならないものを如何に取捨選択するかだと思います。
カメラのビューボリュームだけなら簡単なんでしょうけど、キャスターのことも考えないと。
正確に選択できないと PSM とあんまり変わらない状態になってしまうこともあるでしょう。
っていうか、そう考えると結構面倒ですね。