法線マッピング

提供: MonoBook
2020年4月10日 (金) 02:17時点におけるAdministrator (トーク | 投稿記録)による版
ナビゲーションに移動 検索に移動

法線マッピング英語:normal mapping)とは、陰影処理のために「ピクセルの向いている方向」を保持するものをいう。

概要

ピクセル法線は、バンプマップなしの場合は頂点法線を持たせ、2つの頂点の法線ピクセルの位置から大雑把に算出する。 同様にバンプマップありの場合はこれに「高さ」をかけ合わせてもう少し精度をよく算出していた。

頂点の法線からピクセルの法線を算出.png

一方、法線マッピングではテクスチャマッピング画像と同じ要領であらかじめピクセル単位で法線ベクトルを計算しておいたデータを用いる。

つまり実行時にピクセル単位の法線を計算しないうえに、推論的なものではないので非常に精度の良いなデータになる。すばらしいね。そんなに精度がいいならピクセルシェーダーで高品質なライティングしたくなる。

なお、デメリットもある。 まず法線マップのデータの作成は非常に敷居が高い。 ZBrushではスカルプトでゴシゴシやるとモデルと一緒に出力できるらしい。 スカルプトを使えるツールなど素人には買えるわけがない(無償で使えるFusion 360で出力できるかもしれないが試してはいない)。

値変換

一般的なプログラマブルシェーダーには法線マップ専用の受け口はない。 そのため法線マップはテクスチャマップに変換してシェーダーに渡すことになる。

法線ベクトルは「クリップスペース座標」で表され、「-1.0から1.0」の範囲の「正規化」された値である。

一方、テクスチャRGBデータは「0.0から1.0」の範囲となっている。

このためテクスチャとしてファイルメモリに保持する際には以下のような変換を行う必要がある。

格納値 = (法線 + 1.0) * 0.5

プログラマブルシェーダー内で再び法線ベクトルに戻して利用する際には以下のような変換を行う。

法線 = 2.0 * 格納値 - 1.0;

上方向

3D空間では「Y軸が上方向」ということが多いが、 法線空間(クリップスペース座標)では「Z軸が上方向」となっているのが一般的である。

フラット

Z軸が上方向なので以下がフラットである。

法線ベクトル(0,0,1) = 格納値(0.5, 0.5, 1.0)

関連項目