ライトを使って法線マップを作成してみました。この記事は法線マップを理解するために調べたことのメモです。
法線マップ とは
「法線マップ(ノーマルマップ)」は高解像度モデルのディテールを、低解像度モデルに転送するために考案されたマップです。主にポリゴン数に制約があるゲーム等のリアルタイム描画用途で使用されます。
法線マップはバンプマップの一種で、モデルの表面を擬似的に凸凹に見せるレンダリング技術です。
バンプマップは「バンプの強さ」をユーザーが見た目で調節するのに対して、法線マップは「ベクトル (スムージング角度)」が記録されているので感覚的な強度の調節が必要なく、高解像度モデルのディテールを再現する用途に向いています。
法線マップは手描きで作成することが難しいので、テクスチャベイク機能を使用して作成するのが一般的です。
法線マップの種類
法線マップは基準とする空間によっていくつか種類があります。
- ワールドスペース
- オブジェクトスペース
- カメラスペース
- スクリーンスペース
- タンジェントスペース
よく見かける青紫色のマップは「タンジェントスペース」です。昔のゲームではボーン変形するオブジェクトは「タンジェントスペース」、静的なオブジェクトは「オブジェクトスペース」と使い分けたりするようです。
ライトを使用して法線マップを作成する
法線マップはベクトルを色であらわしているので、モデルを平行ライトで照らして法線マップを作成してみました。
X方向は赤色のライト、Y方向は緑色のライト、Z方向は青色のライトで照らします(青色は背面のライトなくても問題ありません)。それぞれマイナス象限のライトは、明るさをマイナス値に設定します。
MayaやMaxの古いレンダラーでは、マテリアルを白色、ライトの強度は1.0か-1.0。 アンビエントライトを0.5に設定すれば法線マップを作成できました。
Maya Software レンダラー
Max のスキャンラインレンダラー
法線マップのリファレンスとして使用したArnoldのAOV
modoはフィジカルベースレンダラーなので、残念ながらライトを使用して法線マップを作成できませんでした。
上のサンプルファイルは近い見た目が近くなる値を探りましたが、MayaやMaxのレンダリング結果とは微妙に一致しません。他にもmodoではライトの「照射発散度」にマイナス値を入れた場合、シェーディングにノイズが乗ってしまうなどの問題もありました。
modoで法線マップをレンダリングしたいのであれば、素直にレンダー出力の「Shading Normal」を使用するのがよいです。
「ピクセル値のリマップ」をON、出力カラースペースは「リニア」を使用します。
やはりフィジカルベースレンダラーだと、古いトリックレンダリングが使えない場合がありますね。
バンプマップ VS 法線マップ
おまけ。バンプマップと法線マップの比較です。バンプマップと法線マップは何が違うのか。レンダリングでどんな違いがあるのか調べてみました。
バンプマップ
- 画像に高さを記録
- 手描きが容易
法線マップ
- 画像にベクトルを記録
- 元になる3Dモデルがある場合の再現性が高い
- 曲面の再現性が高い
- 手描きが困難
バンプマップと法線マップの大きな違いは画像に格納するデータで、「高さ」か「ベクトル」かです。
冒頭にも書きましたが、法線マップは高解像度モデルのディテールを、低解像度モデルに転送するために考案されたマップです。このため元となる高解像度モデルから法線マップを作成できる場合はディテールの再現性が高いです。
手描きや写真加工でマップを作成する場合は、グレースケールのバンプマップの方が描きやすいと思います。
検証データ
今回検証に使用したのは、スミソニアン博物館が配布している3Dモデルです。
https://sketchfab.com/3d-models/george-washington-bust-23630d35f855409e9c00c810b1416c71
メッシュのワイヤフレーム、わりと荒かった。
ハイポリモデルをレンダリングして、バンプ用の画像と法線マップをレンダリングしました。OpenEXR Float 32bitのファイルを置いておくので、気になる人は検証してみてください。
ファイルには6レイヤー入ってます。
- グラデーションを使用した深度っぽい画像
- ライトイルミネーション
- 深度マップ
- リマッピングしていない深度マップ
- 法線マップ
- リマッピングした法線マップ
深度っぽい画像
法線マップ
レンダリング比較
平面ポリにマップを貼ってレンダリングを比較しました。
深度マップ(Float32bit)と法線マップ(Float32bit)の比較画像。
深度マップなのでスムージングが効かず、ポリゴンメッシュのカクカクがそのままレンダリングされてますが、Floatのデータなのでバンディングのようなアーティファクトは発生していないように見えます。
法線マップ(8bit)と法線マップ(Float32bit)の比較画像。
8bit画像の色数は255色ですが、Float32bitの画像と比べて違いがないように見えます。8bit画像ならレンダリング時のメモリ使用量が少なく済みそうです。
バンプマップ(16bit)と法線マップ(8bit)の比較画像。
バンプマップ(8bit)と法線マップ(8bit)の比較画像。
8bitのバンプ画像だと階段状のバンディングが発生します。色のレンジも狭いので「バンプの強さ」が同じ値だとバンプが浅くなります(modoでレンダリングした場合)。
全体的にノイズが乗って見えるのはディザリングによるものです。一般的に3DソフトはFloat以外で保存すると、グラデーションのバンディングを抑えるためディザ処理されます。
8bit画像を比較するとバンプより法線マップの方が綺麗にレンダリングできますが、バンプ16bit以上だと大きな差がないように見えます。
プリレンダリング用途ならバンプと法線マップは使いやすい方を使う感じで問題なさそうかなという印象です。元モデルがあって法線マップを出力できる場合や、メモリ使用量を減らしたい場合は法線マップを使うのがよさそうです。
余談ですが、ハイトマップを法線マップに変換するソフトやサービスがありますが、いくつか試したところレンダリングで作成した法線マップに比べて立体感が薄くなる変換が多いみたいです。正しく変換できる物もありましたが、どうして薄くなるのか気になりました。
法線マップは2002年にATI Technologiesが公開した「NormalMapper」というツールが、ゲームでの使用に大きな影響があったようです。
私が法線マップをはじめて知ったのは2003年頃、LightWaveのフリープラグインでした。当時は今のようにWeb翻訳の精度がよくなかったので、バンプの凄いやつらしいけど、どんなメリットがあるのかよくわかりませんでした。同じ時期に「Micro Wave」というプラグインもリリースされおり、どうも法線マップが技術的なトレンドっぽいということは感じていました。
2004年にUnreal Engine 3が発表、E3でテクニカルデモが公開され話題になりました。その後海外フォーラム「CGTalk」にGears of Warのスクリーンショットが投稿され、当時としてはゲームなのに見たこともないようなハイディテールのモデルに衝撃を受けました。ZBrushを使用した高精細なモデルからローポリにディテールを転送するフローが紹介され、次世代ゲーム機ではこのようなグラフィックが主流になるんだという驚きと期待感が高かったのを覚えています。 2005年に発売されたXbox 360世代では法線マップの使用が標準化していきました。
当時は現実のオブジェクトをカメラで撮影して法線マップを作成する解説があったのを思い出したので、今回モデルをライティングして法線マップを作ってみました。おかげで法線マップのことがより理解できた気がします。
参考
Max、Maya、LightWave用のサンプルファイルが公開されています。
https://www.pinwire.com/art-design/generating-high-fidelity-normal-maps-with-3-d-software/
法線マップの解説図がわかりやすい。
https://docs.unity3d.com/ja/2021.2/Manual/StandardShaderMaterialParameterNormalMap.html