最終更新: rt_3dcg_tips 2019年03月18日(月) 19:59:08履歴
私はノーマルマップの仕様をよく知らなかった頃は
ライトをぐりぐり回して見た目で反転してないか、合ってるかチェックしていました。ごめんなさい。
という訳で、そんなノーマルマップを曖昧に理解している人のために解説を書きました。
ライトをぐりぐり回して見た目で反転してないか、合ってるかチェックしていました。ごめんなさい。
という訳で、そんなノーマルマップを曖昧に理解している人のために解説を書きました。
RGBそれぞれのチャンネルにXYZの法線情報を持ったテクスチャです。
法線とは向き、つまりポリゴンにも向きがありますが、ノーマルマップを貼ることでより細かい凹凸が表現できます。
また、今回はタンジェントスペース形式のノーマルマップについて説明します。
法線とは向き、つまりポリゴンにも向きがありますが、ノーマルマップを貼ることでより細かい凹凸が表現できます。
また、今回はタンジェントスペース形式のノーマルマップについて説明します。
ノーマルマップにはOpenGL形式とDirectX形式の2タイプが存在します。
こちらは簡単に変換可能ですが、間違えると法線が反転してしまいます。
違いは、ノーマルマップのRGBチャンネルのうち、YつまりGチャンネルにあります。
OpenGLの場合テクスチャの↑を向いているピクセルは1.0(255)となり、↓を向いているピクセルは0.0(0)となります。正面向きは0.5(128)ですね。
DirectXの場合は逆で、↑が0.0(0)、↓が1.0(255)です。正面は0.5(128)で同じですね。
実際の画像ではこのようになります。
※このような凸型のハイポリを板ポリにベイクしています。
ノーマルマップの画像
左:OpenGL 右:DirectX
RGBチャンネルにそれぞれ分解すると下記のようになります。
Rチャンネル(X方向)
Gチャンネル(Y方向)
Bチャンネル(Z方向)
Gチャンネルのみ反転しているのが分かりますね。
ということなのでOpenGL形式のエンジン使ってるのにDirectX形式で作ってしまったというような場合はGチャンネルを階調反転させてやればとりあえずは使えます。
(フロー的にはノーマルマップを作成したツールまで戻ったほうがよいですが。あとで絶対忘れるので。)
こちらは簡単に変換可能ですが、間違えると法線が反転してしまいます。
違いは、ノーマルマップのRGBチャンネルのうち、YつまりGチャンネルにあります。
OpenGLの場合テクスチャの↑を向いているピクセルは1.0(255)となり、↓を向いているピクセルは0.0(0)となります。正面向きは0.5(128)ですね。
DirectXの場合は逆で、↑が0.0(0)、↓が1.0(255)です。正面は0.5(128)で同じですね。
実際の画像ではこのようになります。
※このような凸型のハイポリを板ポリにベイクしています。
ノーマルマップの画像
左:OpenGL 右:DirectX
RGBチャンネルにそれぞれ分解すると下記のようになります。
Rチャンネル(X方向)
Gチャンネル(Y方向)
Bチャンネル(Z方向)
Gチャンネルのみ反転しているのが分かりますね。
ということなのでOpenGL形式のエンジン使ってるのにDirectX形式で作ってしまったというような場合はGチャンネルを階調反転させてやればとりあえずは使えます。
(フロー的にはノーマルマップを作成したツールまで戻ったほうがよいですが。あとで絶対忘れるので。)
ゲームエンジンのノーマルマップタイプは下記のとおりです。
それぞれの形式に合わせてノーマルマップを出力しておきましょう。
UE4には反転機能があるのでUnityに合わせてOpenGL形式で作っても良さそうです。
Unity | OpenGL |
Unreal Engine 4 | DirectX(Y反転のチェックボックスあり) |
UE4には反転機能があるのでUnityに合わせてOpenGL形式で作っても良さそうです。
SubstanceDesignerでは下記に設定があります。
3DView->Materials->Default->Edit
Material:NormalのDirectX Normal
Trueの場合はDirectX形式
Falseの場合はOpenGL形式となります。
また、ノードにもノーマルマップ関連のものは設定がありますので、どこかで反転しているということが無いよう気をつける必要があります。
3DView->Materials->Default->Edit
Material:NormalのDirectX Normal
Trueの場合はDirectX形式
Falseの場合はOpenGL形式となります。
また、ノードにもノーマルマップ関連のものは設定がありますので、どこかで反転しているということが無いよう気をつける必要があります。
新規のプロジェクトやProjectConfigurationにてNormal map formatという項目がありますのでまずここをチェック。
また、ノーマルをペイントするブラシについては注意が必要です。
これらのノーマルはプロジェクト設定と無関係だったりするので容易に反転しやがります。
そういう場合はペイントする前に下図の設定をしてみましょう。
▼ボタンのメニューから選択します。
ブラシの方のノーマルがDirectX形式の場合はDirect3D normalを選択する感じです。
これ、ブラシの元々の設定がどっちか分かんないので見た目で判断してます。
何かご存知の方は是非情報いただけるとありがたいですm(_ _)m
また、ノーマルをペイントするブラシについては注意が必要です。
これらのノーマルはプロジェクト設定と無関係だったりするので容易に反転しやがります。
そういう場合はペイントする前に下図の設定をしてみましょう。
▼ボタンのメニューから選択します。
ブラシの方のノーマルがDirectX形式の場合はDirect3D normalを選択する感じです。
これ、ブラシの元々の設定がどっちか分かんないので見た目で判断してます。
何かご存知の方は是非情報いただけるとありがたいですm(_ _)m
余談ですが、このテクスチャに法線情報を書き込むって最初なんか違和感がありました。
だってRGBって色じゃないですか。ノーマルマップは一見人間の目にもそれっぽく見えるので余計に混乱しました。
でもメタリックやラフネスなんかを見ているうちに
「あーテクスチャっていうのは情報を格納するのに相性が良いから使ってるだけなんだなー」と分かってきました。
1枚のテクスチャを使えば、それぞれのピクセルに対してRGBAの最大4要素の数値を持たせることが出来るわけですね。
ゲームだったらRに温度とかGに水濡れの乾きにくさとか入れても良いわけで。
それがポリゴンだったらめちゃくちゃ分割しないとダメですし。テクスチャってすごい発明。
そう考えたら割とすんなり理解できたというか、機械に服従できた気がしました。
だってRGBって色じゃないですか。ノーマルマップは一見人間の目にもそれっぽく見えるので余計に混乱しました。
でもメタリックやラフネスなんかを見ているうちに
「あーテクスチャっていうのは情報を格納するのに相性が良いから使ってるだけなんだなー」と分かってきました。
1枚のテクスチャを使えば、それぞれのピクセルに対してRGBAの最大4要素の数値を持たせることが出来るわけですね。
ゲームだったらRに温度とかGに水濡れの乾きにくさとか入れても良いわけで。
それがポリゴンだったらめちゃくちゃ分割しないとダメですし。テクスチャってすごい発明。
そう考えたら割とすんなり理解できたというか、機械に服従できた気がしました。
タグ
コメントをかく