見出し画像

Height Map / Normal Map / Bump Mapのちがい

テクスチャを使って陰影をつけるには様々な技術が存在します。それらを一望できるようにまとめてみました。

高さを表したデータ Height Map

モデルに高さがないにもかかわらず、高さを与えようとしたとき、画像を使って高さを表現することが考えられます。
このように高さを表した画像を Height(高さ) Map といいます。

上の画像は山の標高を表した画像です。高い所ほど白い色で表します。

画像2

Displacement Map - Height Map を使って実際に頂点を動かす

モデルは高さを持っていなくても、ものすごく細かくモデルを分割すれば頂点を画像の明るさに合わせて動かすことで、高さを表現できます。この技術は、実際に頂点の位置を変えるので Displacement(変位) Map といいます。

画像4

画像4

これくらい割れていると、山なんかもある程度再現できます…けど、編集するのが大変そうですよね?
そのために映像用のレンダリングでは、レンダリングするときにだけ分割数を変更するという設定があります。

画像3

ゲームではランドスケープ(地形)で、Displacement Map 的な手法を使うことが多いです。現実から測量した山のデイテールを使うことでリアルに表現できたり、Heightの画像の受け渡しなので他のツールとのやり取りも素早く行えます。

Bump Map - Height Map を使って擬似的に陰影をつける

実際に高さを変化させるのではなく、陰影だけ高さがあるふりをすることで、凹凸(おうとつ)があるように見せることができます。
Height Map を つかって凹凸があるような表現を行うことを Bump(でこぼこ) Mapping といい、そのときにつかうテクスチャを Bump Texture と言ったりもします(なかみは Height Map のテクスチャです)。

画像5

Normal Map - 高さではなく法線を定義したデータで陰影をつける

Bump Map はどのように凸凹しているのかを表現する画像でしたが、Normal Map は法線がどのように変化するのか、を示した情報です。

画像6

画像7

そもそも Normal と陰影の関係ってなに?

そもそも、法線が変化したら陰影が変化するというのはどういうことなのでしょうか?

なんとなくモデルが変化したら陰影が変化するというのはわかりやすい気がするのですが、じつはCGにおいては モデルが変化する → 法線が変化する →陰影が変化する という順番を通っています。

頂点ごとに向きのデータを持っています。これを頂点法線と呼びます。

画像9

この頂点法線の向きによってモデル全体を塗りつぶします。

画像10

Unreal Engine はZ-UpなのでY軸がGです。緑のチャンネルだけを表示するとY軸(この画面では右向き)を表したデータであることが分かります。上の青っぽい画像はそれぞれの向きの集合の画像なのです。

画像12

Normal Map を使用すると、Normalがこのように複雑に変化します。

画像11

したがって上向き、という情報も複雑に変化します。この右向きの情報は右から光が当たったときの明るさと一致します。そのことを考えると光に対する影響も変わるということがわかりやすいかもしれません。

画像12

なぜ Normal Map が好まれるのか?

じつは Bump Map も Displacement Map も明るさ1.0だとどれくらいの動かす(動いてるようにみせる)という実際の数字を持っていません…というか持つことができないのです。

なぜなら、移動量を表すには、画像の明るさだと不十分だからです。山の標高を示したデータだと、明るさ1.0で3,776mを表したいかもしれないし、タイルの目地を表現するテクスチャであれば1cmを表現できれば十分です。8bitのテクスチャだと、明るさは0-255の範囲までしか持てないので、数センチから数千メートルを表現するには無理があります。

そのため Bump Map も Displacement Map に使う画像(Height Map)は、普通は完全な白から完全な黒までを使い切るように作成して、実際に使うときはそのときに必要な倍率をそれっぽく掛けることになります。

それに比べて Normal Map は法線がどう傾いたか、というデータなので実際の変化を表現できます。
そのことからも Bump Map よりも Normal Map のほうが形状の再現度か高いので、好まれています。

画像16

それでも Height 情報は大切

ここまで聞くとNormal Mapがあれば十分な陰影情報を作ることができるので、Height Map は過去の技術だと思われるかもしれません。じっさい Bump Map のような使い方はかなり減ってきています。

しかし Bump Map はともかく、Height Map は最も重要な情報であることには代わりありません。

なぜなら Height → Normal は作れるが Normal → Height はかなり不完全だからです。下の画像のように向きが同じ時には Normal Mapは同じ値になってしまいます。

画像13

複数のテクスチャをブレンドするときにも Height Mapを使うと説得力のある合成ができます。

画像14

さらに、パララクスオクルージョンマッピングのような Normal Map 以上の疑似立体表現を行う場合、やはりHeight Mapは必要になります。

右 Normal Map
左 Parallax Occlusion Map( Normal mapのほかにHeght map も使い、遮蔽された立体表現を行なっています)

画像15


この記事が気に入ったらサポートをしてみませんか?