ノーマルマップについて

こんにちは!Rhinoです。
今日は今更ですがノーマルマップ(法線マップ)についてまとめてみました。
と言うのも、僕自身たまにごちゃごちゃになってします為ですwww

ノーマルマップとは

そもそもノーマルマップとは何かと言いますと、RとGの2つのチャンネルに法線の向きを記録し、疑似的に凹凸を表現するテクスチャマップのことです。
Bチャンネルは高さを表しています。XYZに相当しているわけです。
RとGが決まれば計算で高さのベクトルを求めることができますので、Bチャンネルは使わない場合もあります。もったいないので、ゲーム開発では別の情報を格納したりすることもあります。

ノーマルマップには種類がある

さて冒頭でごちゃごちゃになると申しあげましたが、何故かといいますとノーマルマップにはDirectX系とOpenGL系の2種類があるからなんです。
これらは3D描画に欠かせないライブラリになるのですが、それぞれで採用している座標系が異なります。

DirectXOpenGL
3D座標系左手系右手系
UV座標系左上が原点左下が原点

この為、どちらの座標系でノーマルマップを作成したかでテクスチャが変わってしまします。

DirectX系とOpenGL系でノーマルマップはどう違うのか?

では、具体的にどう違うのかと言いますとこちらをご覧ください。
左側がDirectX系、右側がOpenGL系になります。
見た目の上で凹凸が反転して見えるのがDirectX系正常に見えるのがOpenGL系と言った感じでしょうか。
座標系の違いによりY座標、つまりはGチャンネルが反転してしまいます。

DirectX系

OpenGL系

Mayaはどちらの形式なのか?

ノーマルマップに種類があることはお分かり頂けたのではないでしょうか。では、普段使用しているMayaやSubstance Painterではどうすればよいのでしょうか。
まず、Mayaについてですが、DirectX系 / OpenGL系のどちらも扱うことができます。
ただし、ArnoldレンダラーはOpenGL系を使用している為に、MayaのデフォルトではOpenGL-Core Profile(Compatibility)になっていると思います。

Substance Painterも選ぶことができる

次にSubstance Painterについて見ていきます。
新規プロジェクトを作る際にNormal map formatを選ぶ項目があります。
ここでSubstance Painterのプロジェクトでどちらを採用するかどうかを選ぶことができます。

それぞれフォーマットを変えてベイクしてみました。
上記の違いと同じような見た目になっているのが確認できると思います。

DirectX

OpenGL

これらはSubstance Painterのプロジェクトでどちらのフォーマットでノーマルマップを扱うのかという話になります。では出力する場合はどうなのでしょうか?
Substance PainterのExport時のConfigの設定を見てみます。
Arnold 5(AI Standart)を見てみましょう。
Normal OpenGLとなっていますね。OpenGL系のノーマルマップとして出力されています。ArnoldはOpenGL系を使用しているので当然ですね。
私が使用しているのがSubstance Painter 2017ですので最新バージョンとは異なっていると思います。

Arnoldで実際にレンダリングしてみる

OpenGL系で出力されているのであれば、Arnoldでレンダリングすれば正しく表示されるはずですね。
やってみましょう。
左がDirectX、右がOpenGLで出力したノーマルマップを使用してArnoldでレンダリングしたものになります。
DirectX系は反転してますね。

これを直すにはFlip R Channel と Flip G Channelのチェックを外します。

左右同じになりました!

このようにノーマルマップを作成する際にどちらのフォーマットで作成するのか、レンダラやゲームエンジンはどちらを採用しているのかで凹凸の具合が変わってしまいます。
UE5ではベイクの必要がなくなるという話ですが、モバイルゲームなどではこれからノーマルマップなど現行機で使われている技術がメジャーになっていくのではないかと考えていますので、まだまだ使用する機会がありそうですね。
やっかいですが、しっかり付き合っていきましょう!
では、また!

コメント

タイトルとURLをコピーしました