ひとたび視線と凹凸の交差点が求まったら、前述したように、ライティング自体はその交差点直下の法線マップから取り出した法線ベクトルを活用して計算すればいい。

この時、もう一工夫すると、この微細凹凸にセルフシャドウ(近隣の凹凸の影)を生成することが出来る。考え方はこれまでの視線と凹凸の交差点を求めるのと近い。

求まった視線と凹凸の交差点から、光源の方向に向かって同じように衝突判定を行ってやるのだ。

視線と凹凸の交差点から、光源の方向に向かって少し進んでは、その位置のハイトマップを参照して衝突したかどうかを判定する。もし、一度も衝突しないでポリゴン面を抜け出ることが出来れば、何物にも遮蔽されていないことになり、ここ(視線と凹凸の交差点)に光があたっていると判定できる。

逆に、ポリゴン面を抜け出る前に、その他の凹凸に衝突した場合は、他の凹凸に光が遮蔽されていると判断でき、光がやってきていないと判定できる。すなわち、ここ(視線と凹凸の交差点)は影という判定ができるわけだ。

セルフシャドウ付き視差遮蔽マッピングの動作概念図

ただ、このままでは、影か、そうでないか、というキッチリしすぎたものとなり、影の輪郭がきつく出てしまう。場合によってはデプスシャドウ技法の影生成(いずれ本連載で取り扱う予定)の時のような、へんなエリアシングが出てしまう可能性もある。

そこで、調査点が凹凸に衝突したあともしばらく光源方向に調査を進めていき、「影であるにしても、どのくらい遮蔽されているのか」を調査する。

具体的には、光源に戻って突き進んでいるこの調査点の高さと、その調査点における凹凸の高さとの距離を求め、これを「遮蔽具合」として計測していくのだ。適当なところで調査を打ち切り(理想はポリゴン面を抜け出るまで)、一連の調査の中で最も高い遮蔽具合を結果として、影の色を決めてやる。遮蔽具合が低ければ薄色の影、すなわち半影(ソフトシャドウ)としてやるようにする。

これで影のエッジ付近が柔らかくボケるようになり、リアリティが増すというわけだ。

セルフシャドウ付き視差遮蔽マッピングにおけるソフトシャドウの実現方法

このテクニックが実際の3Dゲームで採用された例はまだ少ないと思われるが、AMDのRadeon X1000シリーズのデモ「TOYSHOP」で採用され話題となった。

マイクロソフトのDirectX SDKデモより。法線マップによるバンプマッピング

視差遮蔽マッピング

セルフシャドウ付き視差遮蔽マッピング(ソフトシャドウ対応)

セルフシャドウ付き視差遮蔽マッピング(ソフトシャドウ対応)を実装したRadeon X1000シリーズ用のリアルタイムデモ「TOYSHOP」。この立体的な文字の看板もセルフシャドウ付き視差遮蔽マッピングで表現されている

(トライゼット西川善司)