「法線マッピング」の版間の差分
Administrator (トーク | 投稿記録) (→値変換) |
Administrator (トーク | 投稿記録) |
||
1行目: | 1行目: | ||
− | '''法線マッピング'''([[英語]]:normal | + | '''法線マッピング'''([[英語]]:normal mapping)とは、陰影処理のために「[[ピクセル]]の向いている方向」を保持するものをいう。 |
== 概要== | == 概要== | ||
− | + | [[ピクセル]]の[[法線]]は、[[バンプマップ]]なしの場合は[[頂点]]に[[法線]]を持たせ、2つの頂点の[[法線]]と[[ピクセル]]の位置から大雑把に算出する。 同様にバンプマップありの場合はこれに「高さ」をかけ合わせてもう少し精度をよく算出していた。 | |
+ | |||
[[ファイル:頂点の法線からピクセルの法線を算出.png|なし|サムネイル|640x640ピクセル]] | [[ファイル:頂点の法線からピクセルの法線を算出.png|なし|サムネイル|640x640ピクセル]] | ||
− | 一方、法線マッピングでは[[テクスチャマッピング]]の[[画像]]と同じ要領であらかじめピクセル単位で法線ベクトルを計算しておいた[[データ]]を用いる。 | + | 一方、法線マッピングでは[[テクスチャマッピング]]の[[画像]]と同じ要領であらかじめピクセル単位で法線ベクトルを計算しておいた[[データ]]を用いる。 |
+ | |||
+ | つまり実行時にピクセル単位の法線を計算しないうえに、推論的なものではないので非常に精度の良いな[[データ]]になる。すばらしいね。そんなに精度がいいなら[[ピクセルシェーダー]]で高品質なライティングしたくなる。 | ||
なお、デメリットもある。 まず法線マップの[[データ]]の作成は非常に敷居が高い。 [[ZBrush]]では[[スカルプト]]でゴシゴシやるとモデルと一緒に出力できるらしい。 [[スカルプト]]を使えるツールなど素人には買えるわけがない(無償で使える[[Fusion 360]]で出力できるかもしれないが試してはいない)。 | なお、デメリットもある。 まず法線マップの[[データ]]の作成は非常に敷居が高い。 [[ZBrush]]では[[スカルプト]]でゴシゴシやるとモデルと一緒に出力できるらしい。 [[スカルプト]]を使えるツールなど素人には買えるわけがない(無償で使える[[Fusion 360]]で出力できるかもしれないが試してはいない)。 | ||
13行目: | 16行目: | ||
そのため法線マップは[[テクスチャマップ]]に変換して[[シェーダー]]に渡すことになる。 | そのため法線マップは[[テクスチャマップ]]に変換して[[シェーダー]]に渡すことになる。 | ||
− | + | 法線ベクトルは「[[クリップスペース座標]]」で表され、「-1.0から1.0」の範囲の「[[正規化]]」された値である。 | |
− | [[テクスチャ]]の[[RGB]]の[[データ]]は「0.0から1. | + | |
+ | 一方、[[テクスチャ]]の[[RGB]]の[[データ]]は「0.0から1.0」の範囲となっている。 | ||
+ | |||
+ | このためテクスチャとして[[ファイル]]や[[メモリ]]に保持する際には以下のような変換を行う必要がある。 | ||
格納値 = (法線 + 1.0) * 0.5 | 格納値 = (法線 + 1.0) * 0.5 | ||
− | + | [[プログラマブルシェーダー]]内で再び法線ベクトルに戻して利用する際には以下のような変換を行う。 | |
法線 = 2.0 * 格納値 - 1.0; | 法線 = 2.0 * 格納値 - 1.0; | ||
== 上方向 == | == 上方向 == | ||
3D空間では「Y軸が上方向」ということが多いが、 | 3D空間では「Y軸が上方向」ということが多いが、 | ||
− | + | 法線空間([[クリップスペース座標]])では「Z軸が上方向」となっているのが一般的である。 | |
=== フラット === | === フラット === |
2020年4月10日 (金) 02:17時点における版
法線マッピング(英語:normal mapping)とは、陰影処理のために「ピクセルの向いている方向」を保持するものをいう。
概要
ピクセルの法線は、バンプマップなしの場合は頂点に法線を持たせ、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)