Sandy Virtual City

アクセスカウンタ

zoom RSS よくわからないノーマルマップ講座 概論編 その2

<<   作成日時 : 2014/08/03 22:51   >>

なるほど(納得、参考になった、ヘー) ブログ気持玉 8 / トラックバック 0 / コメント 3

さてさてNomal Map概論編の2回目といきましょう。

前回Normal Mapには法線の情報が格納されていると言いましたがまずはどのように格納されているか説明したいと思います。

その前に前回書き忘れていたのですが、Normal Mapにはいくつか種類があります。
・Tangent-space Normal map
・Object(Local)-space Normal map
・World-space Normal map

Object-space Normal mapとWorld-space Normal mapに関しては大体似たような物なんだけどWorld-space Normal mapはあまり使う機会は無いでしょう。少なくともMod製作する分にはまず使うことは無いだろうし、実際使ったことも作ったことも無いのでここでは割愛します。Object-space Normal mapはそこそこ使う機会あるけど大体どのソフトにもNormal MapをBakeするときにオプションとしてObject-space Normal mapを選択できるので心配しなくても大丈夫です。
で、大本命のTangent-space Normal mapなんですが、まぁNormal Mapといえば一般的にはこれの事を指します。それぐらいよく使われている物でここでもNormal MapのことはTangent-space Normal mapとして扱う事とします。

話を本筋に戻しましょう。前回Normal Mapの1ピクセル毎に法線の情報が格納されていることは話しました。この法線というのは3次元ベクトルなのでX、Y、Zの値で定義されるのですが、このX、Y、Zの値をRGBカラーのそれぞれの数値に、つまりXの値をR(赤)、Yの値をG(緑)、Zの値をB(青)に変換することで各ピクセルの色情報の中に法線の情報が格納されるわけです。
画像


この時にRGBの各成分は0〜255になるのですがXYZの各成分はマイナスの数値を持つので127を中心として0〜126までがマイナスの値、128〜255までがプラスの値となります。
ここで問題になるのがX軸、Y軸、Z軸による直交座標系です。法線があったとしてもそれぞれの軸の向きを決めておかないとXYZの値が決まらず、XYZの値が決まらないとRGBの値が決まらないからです。先ほど紹介した3種類のNormal Mapの違いはこの直交座標系によるものです。

Tangent-space Normal mapの場合はオブジェクトの面法線の向きがZ軸、さらにテクスチャのUV座標系のU軸(横方向)がX軸、V軸(縦方向)がY軸となり、この直交座標系で法線のベクトルを定義します。ここから話がややこしくなってくるんですが、法線を定義する直交座標の軸の向きと、面法線・UV座標系の軸の向きがそれぞれ同じ方向を向いていれば(+x,+y,+z)、逆に軸の向きがそれぞれ逆方向を向いていれば(-x,-y,-z)と呼ばれます。つまり法線を定義する直交座標の軸の向きは、面法線・UV座標系の軸の向きと必ずしも一致するとは限らないわけです。しかもアプリケーションごとに(厳密に言えばアプリが採用しているシェーダー)直交座標の軸の向きがバラバラになっているというありがたくないオマケつきだったりします。
画像


各アプリ毎の座標系をまとめてみましたが古い情報も含まれていて全部は正しくないかもしれないのであくまで参考としてください。
・Max:(+X,-Y,+Z)
・Maya:(+X,+Y,+Z)
・ZBrush:(-X,+Y,+Z)
・UDK:(+X,-Y,+Z)
・Marmoset:(+X,+Y,+Z)
・IDTech:(+X,+Y,+Z)
・CryEngine3:(+X,-Y,+Z)
・Blender 2.4x:(-X,-Y,+Z)
・Blender 2.57以降:(+X,+Y,+Z)
・xNormal:(+X,+Y,+Z)
・CrazyBump:(+X,+Y,+Z)
・Nvidia Filter:(+X,-Y,+Z)
・PixPlant:(+X,-Y,+Z)
・nDo2:(+X,+Y,+Z)
ほんとにややこしくて嫌になりますがいくつかのポイントを抑えておけば大丈夫です。

・Z軸は基本的に+Zになる。
つまり大抵の場合、法線を定義する直交座標系のZ軸の向きはオブジェクトの面法線の向きと一致するということです。そうなっていないアプリもあるにはあるんですが、例外中の例外なのでまぁ気にしなくても大丈夫でしょう。

・多くのゲームエンジンでは(+X,-Y,+Z)の座標系を採用している。
まぁCryEngineとUDKを見ればわかることですね。ちなみにFalloutで使われているGamebryoも(+X,-Y,+Z)になります。

・アプリで使われている座標系とは異なる座標系でNormal MapをBakeした際の修正方法を覚えておく。
例えば(+X,-Y,+Z)の座標系を使っているCryEngine用のNormal Mapを作りたかったのにうっかり(+X,+Y,+Z)でNormal MapをBakeしてしまったような場合でもPhotoshopやGIMPで簡単に(+X,-Y,+Z)用のNormal Mapに修正できるようになればいいわけです。具体的な方法は後述します。

この辺は複雑なのでもう少し具体的に見てみましょう。実際にこの辺の理解が浅かった頃にやらかしたことがあるので。

画像

上記の画像はノーマルマップとノーマルマップのRGB各チャンネルを並べただけのものです。ノーマルマップを扱う上でRGBチャンネルは重要な意味を持ちます。RGBチャンネルにはRGB各成分の明度が格納されていて、この明度がXYZの各値と直結するからです。具体的にはXの値が0の時が50%グレー(明度63%)、マイナスの値の時は50%グレーよりも暗く、プラスの値の時は50%グレーより明るくなります。Yの値に関しても同じでZの値に関しては割愛します。以上のことを踏まえた上でもう一度上の画像を見てみましょう。

画像

まずこの画像は(+X,+Y,+Z)の座標系で作ったNomal MapのRチャンネルで、つまりUV座標のU軸とX軸の向きが同じとなります。左側の法線をX軸とY軸方向に分解してみると法線のX成分は左向きでX軸は右向きが正なので、Xの値はマイナスとなり、Rチャンネルでは黒くなります。同様に右側の法線を見てみると、法線のX成分は右向きなのでXの値はプラスとなりRチャンネルでは白くなります。ぱっと見で右から左に向けて光を当てているように見えるのでそのように覚えておくと良いでしょう。ここまでは+Xでの話で-Xとなった場合はXの値の正負が反転するので白の部分は黒に、黒の部分は白に、グレーの部分はそのままグレーになります。つまり左から右に向けて光を当てているように見えるわけです。
サラッと流しそうになりましたが白から黒へ、黒から白へ、少し前に触れたBake後に座標系を修正する方法がこれになります。やり方は簡単で変更したい座標系に対応したチャンネルの階調を反転させるだけです。この方法を覚えておくと一枚のNormal Mapからあらゆる座標系に対応したNormal Mapが作れるので便利です。自分の場合、Xnormalで(+X,+Y,+Z)のNormal MapをBakeしてテクスチャ作成も(+X,+Y,+Z)のまま進めて、ゲーム用にコンバートする時に座標系を変更するようにしています。
画像


Gチャンネルも基本は同じでU軸が横方向なのに対してV軸の縦方向に向きが変わるだけなので詳しい説明は省きますが、+Yの場合は上から下に向けて、-Yの場合は下から上に向けて光を当てているように見えます。まとめると下の画像のような感じです。
画像


さてさて、Normal Mapの仕組みに関してはこんなとこでしょうか。退屈な授業もこれでお終いです。
書いてる本人が退屈したのはいかがなもんかとは思いますが、とりあえず概論編はここまでとします。次回から実践編としてXnormalの使い方と実際にNormal MapをBakeする際と作成したNormal Mapに関する小ネタを書きたいと思います。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ
気持玉数 : 8
なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー) なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス

トラックバック(0件)

タイトル (本文) ブログ名/日時

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(3件)

内 容 ニックネーム/日時
お邪魔します!
各アプリ毎の座標系とかものすごーくありがたいです;:

修正の仕方も分かりやすくてありがたいです:)
アプリ毎に合わせてチャンネル変えるのはスマートではないのですね!w

ちょっと話がそれてしまうんですが、ベイクしたnormalmapにphotoshopで生成したnormalmapを合成したい場合はオーバーレイで問題ないのでしょうか?
Michau
2014/08/06 02:43
>Michauさん
ノーマルマップの合成は小ネタとしてやる予定だったので丁度よかったですね。
ノーマルマップを合成する場合はオーバーレイで大丈夫です。
ただしただ描画モードを変えるだけでは完全ではないです。何故かというと一部の描画モードには合成結果に影響しない中性色というのが設定してあってオーバーレイの場合は50%グレーです。3枚目の画像を見てもらうとRチャンネルとGチャンネルのベースカラーは中性色の50%グレーなので望んだとおりの結果になるけど、Bチャンネルは白なのでちゃんと合成されないからです。なのでBチャンネルのベースカラーを50%グレーに変えればちゃんと合成されます。
やり方はいくつかあって自分の場合はいつもレベル補正を使ってますね。Milleniaさんは不透明度50%の黒色で塗りつぶしてるみたいです。
明後日から夏休みに入るので詳しく書きますね。
kouoaeha
2014/08/06 21:10
なるほどなるほど! 50%グレーは影響しないと!
まだ理解が浅いですがとてもためになる情報です:)
次の記事も楽しみです:)

夏休み楽しんでくださ〜い
Michau
2014/08/07 11:44

コメントする help

ニックネーム
本 文
よくわからないノーマルマップ講座 概論編 その2 Sandy Virtual City/BIGLOBEウェブリブログ
文字サイズ:       閉じる