ノーマルマップはリアルタイムレンダリングで最も強力な技術のひとつです。メッシュにポリゴンを1つも追加せずに、フラットなポリゴンサーフェスに複雑なサーフェスディテール — バンプ・溝・傷・毛穴 — を表示できます。ノーマルマップは各ピクセルがその点でサーフェスが向いている方向をエンコードしたRGB画像で、レンダラーはこの情報を使って、ジオメトリが実際よりはるかに詳細であるかのようにライティングを計算します。
ノーマルマップが方向をエンコードする仕組み
ノーマルマップの各ピクセルは、3つのカラーチャンネルにパックされた3D方向ベクトルを格納します。赤チャンネルはX軸(左右の傾き)、緑チャンネルはY軸(上下の傾き)、青チャンネルはZ軸(サーフェスが直接外側を向く度合い)をエンコードします。カメラに直接向いているフラットなサーフェスは法線(0, 0, 1)を持ち、RGBカラースペースでは(128, 128, 255) — すべてのノーマルマップで見られるあの特徴的な青紫色にマップされます。
マッピング式はシンプルです:各チャンネルは0から255の値を格納し、−1.0から+1.0の範囲を表します。128は0(傾きなし)、0は負の方向への完全な傾き、255は正の方向への完全な傾きを意味します。レンダラーはこれらの値を浮動小数点ベクトルに戻してアンパックし、幾何法線の代わりにライティング計算に使用します。
タンジェント空間とオブジェクト空間
タンジェント空間ノーマルマップ
タンジェント空間ノーマルマップは最も一般的なタイプです。サーフェスのタンジェント・ビタンジェント・幾何法線から構成された座標系を使って、ポリゴン自身の向きに対してサーフェスの摂動を定義します。方向が相対的なため、同じタンジェント空間ノーマルマップがあらゆるサーフェス方向に正しく適用できます — 床・壁・曲面オブジェクトに適用しても、ライティングが正しく応答します。
タンジェント空間マップは、ほとんどのピクセルが概ね外側を向いている(Z軸優位)ため、常に主に青く見えます。赤と緑の小さな変化が細かいサーフェスディテールをエンコードします。
オブジェクト空間ノーマルマップ
オブジェクト空間ノーマルマップは、オブジェクトのローカル座標系に対する絶対的な方向を格納します。法線があらゆる方向を向くため、レインボーカラーに見えます。オブジェクト空間マップはレンダリングがシンプルで(タンジェントフレームの計算が不要)、UVシームでのタンジェント空間アーティファクトを回避しますが、特定のメッシュに固定されます。メッシュを変形したり再利用したりするとライティングが崩れます。静的な建築物や地形に時々使用されます。
ノーマルマップとディスプレースメントマップ
ノーマルマップはライティングにのみ影響します — ジオメトリは移動しません。これはシルエットエッジが完全に滑らかのままで、パラレックスエフェクトがないことを意味します。ノーマルマップを持つレンガの壁は正面から見るとバンプがあるように見えますが、斜めから見るとフラットなプロファイルになります。ディスプレースメントマップは実際に頂点を移動させ、正しいシルエットとセルフオクルージョンを持つ本物の幾何学的な奥行きを作り出します。トレードオフはコストです:ディスプレースメントには高密度のテッセレーションが必要で、リアルタイムレンダリングでは高コストです。
ほとんどのリアルタイムアプリケーションでは、ノーマルマップが最良の品質対パフォーマンス比を提供します。シルエットの精度が重要なヒーローサーフェスの接写、またはCyclesやArnoldなどのテッセレーションコストが許容されるオフラインレンダラーでのみディスプレースメントを使用してください。
ハイトマップからノーマルマップを生成する
ハイトマップ(グレースケール、白=高、黒=低)は、各ピクセルでサーフェス勾配を計算することでノーマルマップに変換できます。アルゴリズムは隣接ピクセルをサンプリングしてXとYの傾きを決定し、その傾きから法線ベクトルを構築します。Texturizeのノーマルマップツールはまさにこれを行います — グレースケールのハイトマップやテクスチャをアップロードすると、強度調整可能なタンジェント空間ノーマルマップを生成します。
強度パラメーターは知覚されるバンプの急峻さを制御します。強度値が低いと微妙なサーフェスバリエーションが生まれます(磨かれた大理石などの滑らかなマテリアルに適している)、強度値が高いと深い溝とはっきりしたバンプが生まれます(荒い石や樹皮に理想的)。
よくある間違い
- 誤ったカラースペース — ノーマルマップはリニア(非カラー)データとしてインポートしなければならず、sRGBは絶対に使用しないでください。誤ったカラースペースでは、洗い出されたまたは誇張されたライティングになります。
- 緑チャンネルの反転 — OpenGLとDirectXは反対のY軸規則を使用します。ノーマルマップが反転して見える場合(バンプが凹みに見える)、緑チャンネルを反転してください。BlenderとほとんどのツールはOpenGL規則を使用し、Unreal EngineはDirectXを使用します。
- 間違った解像度でのベイキング — ハイポリからローポリメッシュへのベイクには、細かいディテールを捉えるのに十分な解像度が必要です。解像度不足のベイクではブロック状に見えるノーマルが生まれます。
- 強度の過剰使用 — ノーマルマップの強度を上げすぎると、サーフェスが人工的に荒く見え、スペキュラーライティング下で目立つファセッティングが発生します。
実践的なヒント
レンガジェネレーターや石畳ジェネレーターのベーステクスチャと、派生したノーマルマップを組み合わせて完全なマテリアルセットアップを作成してください。Blenderでは、タンジェント空間に設定されたNormal Mapノードを通じてノーマルマップを接続します。Unreal Engineでは、Normal Mapエクスプレッションでサンプリングした後にマテリアルのNormalインプットに接続します。複数のライティング角度でノーマルマップをテストしてください — サーフェスの周りで指向性ライトを回転させると、ベイキングエラーやチャンネルの問題が明らかになります。