Version: Unity 6.0 (6000.0)
言語 : 日本語
法線マップ(Normal Map)
面法線の概要

法線マップ (バンプマッピング) の概要

法線マップはバンプマップの一種です。モデル表面に凹凸や溝、傷などのディテールを追加する特殊な種類のテクスチャで、実際のジオメトリであるかのようにライトを受けます。

Unity は、OpenGL 形式とも呼ばれる Y+ 法線マップを使用しています。

例えば、溝やネジ、またはリベットなどを、航空機の機体のような表面全体につけたいような場合があります。これを実現する方法の 1 つは、以下のように、それらの細部をジオメトリでモデリングすることです。

細部が実際のジオメトリでモデリングされた航空機の金属板
細部が実際のジオメトリでモデリングされた航空機の金属板

このような場合に、そんな細かい部分を “実際の” ジオメトリでモデリングするのは、通常、よい方法ではありません。右側に、ネジ頭 1 個のディテールを作成するのに必要なポリゴンが表示されています。実際に表面に巧妙なディテールを沢山作り込んだ大きなモデルは、描画するためにとても多くのポリゴンを必要とします。このような状況を避けるために、法線マップを使って表面の巧妙なディテールを表し、モデルのより大きな形状には低解像度のポリゴン表面を使用するべきです。

代わりに、このディテールをバンプマップで表すと、表面のジオメトリがはるかに単純になり、ディテールは、ライトが表面でどのように反射するかを調整するテクスチャとして表されます。最新のグラフィックスハードウェアはこれを非常に高速に実行できます。これで、金属表面を低ポリゴン数の平面にすることができ、ネジ、リベット、溝、および傷がライトを捕らえ、テクスチャのおかげで深度があるように見えます。

ネジ、溝、傷が 1 つの法線マップで定義されています。これにより、平面を低ポリゴン数に抑えたまま、その表面上でのライトの反射具合を調整でき、3D ディテールのような印象を与えることができます。リベットやネジだけでなく、微かな凹凸や傷などの極度に精密なディテールも、1 つのテクスチャに追加することができます。
ネジ、溝、傷が 1 つの法線マップで定義されています。これにより、平面を低ポリゴン数に抑えたまま、その表面上でのライトの反射具合を調整でき、3D ディテールのような印象を与えることができます。リベットやネジだけでなく、微かな凹凸や傷などの極度に精密なディテールも、1 つのテクスチャに追加することができます。

現代のゲーム開発におけるアートのパイプラインでは、アーティストは 3D モデリングアプリケーションを使って、とても高解像度なソースモデルから法線マップを作成します。次に、法線マップがモデルの低解像度のゲーム対応バージョンにマップされるため、法線マップを使用して元の高解像度の細部が描画されます。

法線マッピングの仕組み

法線マッピングは、テクスチャを使用してモデル全体の面法線を変更する方法に関する情報を格納することにより、この 面法線 の変更をさらに 1 歩進めます。法線マップは、通常のカラーテクスチャと同様に、モデルの表面にマップされた画像テクスチャです。ただし、法線マップのテクスチャの各ピクセル (テクセルと呼ばれます) は、平坦な (または滑らかに補間された) ポリゴンの “真の” 面法線から離れた面法線方向の偏差を表します。

3 つのポリゴン上の法線マッピングの平面図
3 つのポリゴン上の法線マッピングの平面図

この図も 3D モデルの表面上の 3 つのポリゴンの 2D 表現であり、各オレンジ色の矢印は法線マップテクスチャのピクセルに対応しています。下は、法線マップテクスチャのピクセル単位のスライスです。中央では、法線が変更されており、ポリゴンの表面にいくつかのバンプの外観が表示されています。これらのバンプは、これらの修正された法線がライティングの計算に使用されるため、表面上でのライトの表示方法によってのみ表れます。

元の法線マップファイルの色は、一般的に青っぽい色相になっています。そしてここには、実際のライトやシェーディングはまったく含まれていません。理由は、色そのものをそのまま表示することは意図されていないからです。代わりに、各テクセルの RGB 値は、方向ベクトルの X、Y、Z 値を表し、それらはポリゴンサーフェスの補間された基本的な滑らかな法線に変更として適用されます。

法線マップテクスチャの例
法線マップテクスチャの例

これは、ちょっとした矩形とテキストを押し出す凹凸情報を内包した、シンプルな法線マップです。この法線マップを Unity にインポートし、スタンダードシェーダーの法線マップスロットに入れることができます。マテリアルでカラーマップ (アルベドマップ) と複合し、上の円柱メッシュの表面に適用すると、結果はこのようになります。

上記の円柱メッシュの表面に、上図のサンプル法線マップを適用した状態
上記の円柱メッシュの表面に、上図のサンプル法線マップを適用した状態

繰り返しますが、これはメッシュの実際のポリゴンの性質には影響せず、表面でのライティングの計算方法のみに影響します。このモデル表面の文字と形状の突き出た部分は本当に突き出ている訳ではないので、斜めから面を見ると、本当は平らな面であることが判ってしまいます。ですが、ほとんどの視野角では、円柱の表面にディテールが浮き出ているように見えます。

バンプマップ、法線マップ、ハイトマップの違い

Normal Map (法線マップ) と Height Map (ハイトマップ) はそれぞれ、Bump Map (バンプマップ) のタイプです。両方とも、単純なポリゴンのメッシュ上に見られるディテールを表現するためのデータを含んでいますが、そのデータの保存方法が異なります。

(左) 石塀のバンプマッピング用のハイトマップ。(右) 石塀のバンプマッピング用の法線マップ。
(左) 石塀のバンプマッピング用のハイトマップ。(右) 石塀のバンプマッピング用の法線マップ。

左上の画像では、石塀のバンプマッピングにハイトマップが使用されています。ハイトマップはシンプルな白黒のテクスチャで、各ピクセルが、表面上のそれぞれの地点がどの位盛り上がって見えるべきかを表しています。ピクセルの色が白に近いほど、そのエリアが高く盛り上がって見えます。

法線マップは RGB のテクスチャで、各ピクセルが、表面が向いているように見えるべき方向と変更を加えていない面法線の方向の違いを表しています。ベクトルを RGB 値として保存していることから、これらのテクスチャの色味は、青っぽい紫色になります。

現代のリアルタイム 3D グラフィックスハードウェアは法線マップに依存しています。法線マップには、表面でのライトの反射の外観を修正するために必要なベクトルが含まれているためです。Unity ではバンプマッピング用にハイトマップも使用できますが、使用するにはインポート時に法線マップに変換する必要があります。

法線マップの色

法線マップを使うのに、このことを理解する必要はありません。この段落は、とばしても大丈夫です。しかし、本当に知りたい場合は、以降を参照してください。RGB のカラー値は X、Y、Z のベクトルの方向を保存するために使われます。Z が “上方向” になります (逆に、Unity の規則では Y が “上”)。加えて、テクスチャの値は半分にされ、0.5 が足されます。これは、すべての向きのベクトルを保存するためです。そのため、RGB カラーをベクトル方向に変換するには、2 倍してから 1 を引かなくてはなりません。例えば、RGB 値が (0.5, 0.5, 1) つまり 16 進数で #8080FF の場合、ベクトルにした結果は (0,0,1) になります。この値は法線マッピングでの “上方向” になり、モデル表面は何も変わりません。これはこのページの最初の方にあった “実例” の法線マップの、平らなエリアの色と同じです。

法線マップ全体が #8080FF になっていると、これは法線方向 0,0,1 つまり まっすぐ上 に変換されます。この場合、ポリゴンの面法線や、光の当たり方には何の変更も加えません。この色と異なるピクセルは、異なる向きを指すベクトルになります。そのため、その地点で光が反射する角度の計算に変更を加えます。
法線マップ全体が #8080FF になっていると、これは法線方向 0,0,1 つまり “まっすぐ上” に変換されます。この場合、ポリゴンの面法線や、光の当たり方には何の変更も加えません。この色と異なるピクセルは、異なる向きを指すベクトルになります。そのため、その地点で光が反射する角度の計算に変更を加えます。

値が (0.43, 0.91, 0.80) の場合、ベクトルは (–0.14, 0.82, 0.6) になり、表面はかなり急斜面になります。このような場合の色味は、石壁の法線マップで一部の石の上端部分に見受けられるような、明るいシアンになります。これは、それら端部分が、石の平坦な部分とはまったく違う角度で光を受けることを表しています。

これらの石の法線マップにある明るいシアンの領域は、それぞれの石の上端部分のポリゴンの面法線を急角度に変更するため、光は修正された角度で当たります。
これらの石の法線マップにある明るいシアンの領域は、それぞれの石の上端部分のポリゴンの面法線を急角度に変更するため、光は修正された角度で当たります。

法線マップ(Normal Map)

バンプマップエフェクトのない石塀。石の端や平坦な部分は、シーン内の太陽のディレクショナルライト (日光) を受けていません。
バンプマップエフェクトのない石塀。石の端や平坦な部分は、シーン内の太陽のディレクショナルライト (日光) を受けていません。
同じ石塀にバンプマッピングを適用したもの。石の太陽に面した端による日光 (ディレクショナルライト) の反射が、石の平坦な部分や太陽の反対方向を向いた端とはまったく異なっています。
同じ石塀にバンプマッピングを適用したもの。石の太陽に面した端による日光 (ディレクショナルライト) の反射が、石の平坦な部分や太陽の反対方向を向いた端とはまったく異なっています。
上図と同じバンプマップが適用された石塀で、ライティング条件を変えた例。たいまつのポイントライトが石を照らしています。石塀の各ピクセルは、光がベースモデル (ポリゴン) に当たる角度に応じて照らされ、法線マップのベクトルによって調整されます。したがって、光に面したピクセルは明るくなり、光の反対方向を向いたピクセルは暗く、つまり影になります。
上図と同じバンプマップが適用された石塀で、ライティング条件を変えた例。たいまつのポイントライトが石を照らしています。石塀の各ピクセルは、光がベースモデル (ポリゴン) に当たる角度に応じて照らされ、法線マップのベクトルによって調整されます。したがって、光に面したピクセルは明るくなり、光の反対方向を向いたピクセルは暗く、つまり影になります。
法線マップ(Normal Map)
面法線の概要