「法線マッピング」の版間の差分
Administrator (トーク | 投稿記録) |
Administrator (トーク | 投稿記録) (→値変換) |
||
13行目: | 13行目: | ||
そのため法線マップは[[テクスチャマップ]]に変換して[[シェーダー]]に渡すことになる。 | そのため法線マップは[[テクスチャマップ]]に変換して[[シェーダー]]に渡すことになる。 | ||
− | この際に法線ベクトルの各値は「- | + | この際に法線ベクトルの各値は「-1.0から+1.0」の範囲なのに対して、 |
− | [[テクスチャ]]の[[RGB]]の[[データ]] | + | [[テクスチャ]]の[[RGB]]の[[データ]]は「0.0から1.0」の範囲となっているため以下のような変換を行う必要がある。 |
格納値 = (法線 + 1.0) * 0.5 | 格納値 = (法線 + 1.0) * 0.5 | ||
2020年4月9日 (木) 09:47時点における版
法線マッピング(英語:normal mapping)とは、バンプマッピングの発展形で、バンプマップではピクセル単位で「高さ」の情報を持つのに対して、法線マップではピクセル単位で「XYZのベクトル」を持つものをいう。
概要
バンプマップなしの場合は頂点に法線を持たせ、2つの頂点の法線とピクセルの位置から大雑把にピクセルの法線を算出する。 バンプマップありの場合はこれに「高さ」をかけ合わせてもう少し精度をよく算出していた。
一方、法線マッピングではテクスチャマッピングの画像と同じ要領であらかじめピクセル単位で法線ベクトルを計算しておいたデータを用いる。 つまり実行時にピクセル単位の法線を計算しないうえに、推論的なものではないので非常に精度の良いなデータになる。 すばらしいね。 そんなに精度がいいならピクセルシェーダーで高品質なライティングしたくなる。
なお、デメリットもある。 まず法線マップのデータの作成は非常に敷居が高い。 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)