Tag Archives: Bump Map

法線マップ(3DCG全般の基礎知識めも)

Unityで取り扱うBlenderのデータ作成を行う前に、3DCGについて少しお勉強。あんまり深く追うと戻ってこれなくなると思うので、基本だけでも抑えられればと思います。ちなみに私は大分昔にPOV-Rayという3Dソフトを扱った機会があるくらいです。

法線マップ(Normal Maps)について

Unityに限らず3Dレンダリングでなにかと登場してくる用語かと思います。法線ベクトル、法線マップ等。あるポリゴンの面が向いている方向を表すのが面の法線ベクトル。また、ポリゴンの頂点が外側に向いているのが頂点の法線ベクトル。何に使われるかというと、光の濃淡を法線ベクトルから計算することで、ポリゴンのレンダリング時の陰影を表現することができます。

具体的に法線マップは面が向いている方向に対してのVector がRGB成分に対してXYZのVector成分が0~1.0の範囲で正規化されて2次元配列化された情報となり、グレースケース画像などから変換して作ることもできます。

下のグレースケース画像をHeightMap(黒が低く、白が高い、高低を表す画像)とし、

TestKomarigaoBumpGrayscale

 

こんな感じの法線マップ画像に変換できる。

※変換にはこちら(Christian Petry – Normal Map Online)のWebアプリを利用させていただきました。

サンプルの法線マップ(困り顔)画像

サンプルの法線マップ(困り顔)画像

この法線マップをテクスチャとして利用し、ポリゴン情報としては平面でもマッピングした画像などがもつピクセルに設定された面の向き(法線ベクトル)が向いている方向をしらべ、光の反射を計算して濃淡をつけることで、凸凹を表現できます。

法線マップ画像が全体的に青紫色となっているのは、RGB色がそれぞれXYZ方向に対応しており、

赤色成分R→0~255(8Bit)の値を 法線ベクトルX成分の-1.0~1.0 (中心0.0)に標準化しています。

緑色成分G→0~255(8Bit)の値を 法線ベクトルY成分の-1.0~1.0 (中心0.0)に標準化しています。

青色成分B→0~255(8Bit)の値を 法線ベクトルZ成分の0.5~1.0 (中心0.5)に標準化しています。(平面は常にZ+方向を向いている)

先ほどのグレースケールの真っ黒部分(周囲もピクセルも黒で平面)の法線マップ変換は、

RGB(0,0,0) → 法線マップでのXYZ(0,0,1) → 法線マップRGB(128, 128, 255)

となり、青紫色となる。「青マップ」と呼ばれることもあるらしいです。

上の画像をUnity上で平面オブジェクトに張り付けるとこんな感じになります。

Unity 上で法線マップを適用した画像

Unity 上で法線マップを適用

※テクスチャには茶色をつけ、スポットライトで照らしています。

 

・関連用語整理

Height Maps

Normal Maps と似て、Height Maps がある。Height Maps はグレーススケール画像で表現されることが多く、各ピクセルの単位で高さを表現することになります。Height Maps から地形の高低を計算して、メッシュデータに変換することもできるし、あるポリゴンに対してのBump(隆起)を表すデータとして使うこともできる(Bump Mapping)。Bump Mapping として使う場合は Normal Maps に変換されてポリゴン表面の濃淡として表現されます。

※そういえば、グレースケールのHeightMap で地形を表現しようとしたとき、256段階しかないため、現実の国土地理院のデータとかを変換して表示しようとするとガタガタになったことがあります。レンダリングソフトが対応していればですが、24bitカラーに変換してHeightMapとして取り込めればきれいになったりします。

非常にお役立ちとなるサイト:

Christian Petry – Normal Map Online

法線マップをグレースケール画像から生成できるWebアプリ。上の困り顔画像はこちらのサイトから生成しました。ドラッグ&ドロップするだけの簡単操作です。

 

非常にわかりやすい参考サイトさま:

○×(まるぺけ)つくろーどっとコム – シェーダ編 – その5 – 0から学ぶ法線マップ

Sandy Virtual City – よくわからないノーマルマップ講座 概論編 その2

一歩、二歩、散歩。 – 法線ベクトルとスムージング角

UnityManual – Normal map (Bump mapping)