改良型のバンプマッピングといえる「視差マッピング」だが、冒頭で述べたバンプマッピングの弱点について若干の改善を見たに過ぎず、不自然さはあるにはある。
例えば、凹凸の変化が激しいような場合では、大胆な近似で求めた凹凸と視線との交差点とのズレが大きくなり無視できなくなってくるし、依然として凹凸の前後関係や遮蔽は無視されたままだ。
そこで、次に考案されたのが、この凹凸と視線の交差点を求める際の精度を上げていこうというアプローチだ。これはピクセルシェーダのプログラマビリティとGPU性能が非常に向上したDirectX 9世代/SM3.0対応GPUが登場してきて初めて現実味を帯びてきた技術だ。
この改良版の視差マッピングでは、細かい凹凸の遮蔽(Occlusion)関係が配慮されることから「視差遮蔽マッピング」(Parallax Occlusion Mapping)と呼ばれている。
これまでは平面に凸を貼り付けるというイメージだったが、視差遮蔽マッピングでは平面に凹を彫り込む……というようなイメージで実装されるのがスタンダードのようだ。
「視線と凹凸の衝突点を求めて、その位置の法線マップを取り出す」という根本的な考え方は視差マッピングと変わらない。
問題はどうやって凹凸と視線の衝突点を効率よく求めていくか、という部分になる。
これは、意外にも地道なリアルタイム計算を行って実現する。
具体的には、ポリゴン面から調査点を、その視線の延長線上に沿って少しずつ潜らせていき、その都度、凹凸との衝突判定を行っていくのだ。衝突と判明できたらば、その直下の、対応する法線マップを参照する。法線マップから法線ベクトルを取り出してからの陰影計算自体はバンプマッピングや視差マッピングと同じだ。
調査点を視線に沿って潜らせて進めて、その位置の直下のハイトマップを参照してその高さが、進んだ視線の高さより低ければ、まだ視線は進めることになる。
さらに調査点を視線に沿って進めていき、いずれはハイトマップの高さの方が、その時の視線の高さを上回ることになる。これはつまり、凹凸の中に潜ったことになり、衝突点は前回と今回の間にあると判定できる。「前回と今回の中間地点に衝突点があった」と判断してそこを交差点とする妥協をしてもいいし、あるいは一回立ち戻って、そこから視線を進める距離を短くして正確な衝突点を求める努力をしてもいいかもしれない。
いずれにせよ、この技法の描画品質を決定づけるのは、この調査点を視線に沿って潜らせながら進めていく際の、ステップの細かさ(分解能)ということになる。
描画の結果としては、視差マッピングとは異なり、凹凸と視線の遮蔽を比較的正しく取ってくることになるため、手前の凹部分の隙間から後ろの凸部分が見える……というような凝った凹凸の前後関係や遮蔽関係が描き出せる。(続く)
(トライゼット西川善司)