微細凹凸の高低を濃淡で表現したハイトマップから法線マップ
法線マップのデザインツールは、フリーウェアや商業ものの双方で多様な物がリリースされているが、商業アプリケーションではPixologic社の「ZBrsuh」が有名だ。なお、ZBrushでは、多ポリゴンでモデリングした微細凹凸のディテールを、低ポリゴンモデル+法線マップに落とし込んで出力する機能にも対応している。
あるいは、「白を高い」「黒を低い」と定義し、高さ低さを表現するようなハイトマップ(高さマップ、ディスプレースメントマップと言ったりもする)を用意し、この白黒グレースケールのテクスチャから、法線マップを生成する、という方法もよく活用される。ハイトマップは白黒の濃淡で凹凸を表現できるので、手描きで微細凹凸を制作する際には直観的で分かりやすい。前出のZBrushは、多ポリゴンモデルを低ポリゴン+ハイトマップに変換する機能も持っている。
ハイトマップは微細凹凸の高低そのものを表しているだけなので、法線マップへの変換が必要になる。
これはハイトマップの各テクセルにおける隣接する高低値を求め、横方向と縦方向についての傾きを計算する。各点における法線ベクトルは、そこにおける横方向の傾きと縦方向の傾きの双方に直交するベクトルなので、これを計算してやる。これをハイトマップの全テクセル単位に計算してやって、求めた法線ベクトルをテクスチャに出力してやれば法線マップはできあがる。
このハイトマップから法線マップの変換生成はピクセルシェーダを活用することでリアルタイムに生成することも可能だが、法線マップ自体が動かないことが分かり切っている場合は、あらかじめオフラインで事前に生成しておくこともある。逆にハイトマップを動かし、これをリアルタイムに法線マップへと変換し、アニメーションする微細凹凸を表現する、といったユニークなテクニックも実現可能だ。ちなみに、いずれ本連載でも取りあげることになる「水面のリアルタイムさざ波アニメーション」などの表現は、まさにこのテクニックを利用している。
法線マッピングの実際
実際の法線マップを用いたバンプマッピングの流れは図3のようになっている。
図3: こちらで軽く紹介した図を再掲載する。 |
ハイトマップを法線マップに変換し、ピクセルシェーダで、法線マップを参照して法線ベクトルを取り出し、これを用いてピクセル単位のライティングをする。
ここで、1つ注意しなければならないのは、法線マップにおける法線ベクトルは、単にテクスチャという平面の上に構成された微細凹凸面の向きでしかなく、これから貼り付けるポリゴンの向きを全く考慮していないということ。
法線マップはただの2Dテクスチャなので、貼り付けるポリゴンの座標系のことは全く配慮されていない。そう、座標系の統一のための変換処理が必要になるのだ。
最も直観的なのは、法線マップから取りだした法線ベクトルをワールド座標系やローカル座標系にその都度変換する方法だろう。この方法だと、全ピクセルにおいて、取りだした法線ベクトルに対していちいち座標系変換の計算を行う必要があり負荷が高い。
そのため、頂点シェーダの時点で、ピクセルシェーダに受け渡される光源ベクトルや視線ベクトルを、法線マップを適用するポリゴン基準の座標系とテクスチャの座標系がピッタリ合うように変換しておく手法が一般化している。適用する法線マップが固定的な場合は、法線マップ自体を事前にオフラインで3Dモデルのローカル座標系に変換しておく、といった手法も用いられる。このあたりの実践的な方法の違いは3Dゲームエンジンの設計などによって様々だ。(続く)
(トライゼット西川善司)