背景アーティストのぶろぐ

UE4やら、Substanceやら、Zbrushやらいろんなソフトを触ったことについて色々書く。

ノーマルマップとローポリメッシュのタンジェントの計算

知人から質問を頂いて自分でもうやむやにしていた

ノーマルマップとローポリメッシュのタンジェントについて

色々気づけたのでそれを少しまとめてみます。

 

かなり難しい部分なので自分の理解した範囲を感覚で書いていますので、

正確ではない記述もあるかとおもいます。

もし誤りである場合は、ご指摘いただけますと幸いです。

 

 

UE4ドキュメントの法線マップ作成ガイド

事の発端はUE4ドキュメントにある法線マップ作成ガイド

これに『タンジェントが重要』って書いてあるけどFBXのエクスポートにチェックがないんだが、本当にこれ正しいの?

 

という質問を受けました。

 

はじめに結論から書きますが、ここに書いてある内容は正しいと思っています。

では、なぜこの方法に沿って作成すると正しいのかについて書いていきます。

(理解不足な部分も多く、推測も多い内容になっております…)

 

法線マップの作成ガイドって従来の方法と何が違うのかというと、

UE4が4.7からMikkTSpaceに対応したことによって、

xNormalでベイクしたノーマルマップとローポリメッシュのタンジェントが一致するようになり、

従来では発生していた歪みが解消されるようになった、

つまり高品質なノーマルマップのシェーディングが出せるようになりましたよ。

というのがこのドキュメントに内容です。

 

この話をするにあたり、ノーマルマップがベイクされる時にどのような計算されているのかをなんとなく把握していないと伝わらないかも知れません。

 

 ノーマルマップの基本

まずはノーマルマップが作成される仕組みからはじめましょう。

ノーマルマップに関する基本はこちらのサイトの解説がわかりやすかったので引用させて頂きます。

もし、問題ある場合はお知らせください。(画像が引用の引用になっててちょっと怪しいかも知れないですが…)

 

 

引用元:Yaminabe : うにばな(ノーマル(法線)基本 と ノーマルマップ合成)

 

f:id:sinocof:20170224215431p:plainf:id:sinocof:20170224215438p:plain

 ノーマルマップはオブジェクトの法線ベクトルをテクスチャ画像のカラー値に置き換えたものです。


接空間 (Tangent Space) ポリゴン面の法線に対して垂直に接する面の座標空間です。グーローシェーディングがかかっている場合はポリゴン面上の法線はポリゴンを構成する頂点の法線がグラデーションで補完された値になります。

図のようにノーマル法線方向をZ軸 ポリゴンのUV空間 U方向をX軸 V方向をY軸と見立てます。

ノーマルマップは X軸成分をRカラー値、Y軸成分をGカラー値に置き換えて ポリゴン上のポイントではテクスチャのRカラー値によって法線はTangent方向へ傾くように計算され Gカラー値によってBinormal方向に傾くように計算されます。 それによってポイントあたりの法線方向が歪められてライト計算に反映されると凹凸が表現できるという仕組みです。

テクスチャカラーのRGB成分は整数値の0~255または0~1で定義されていますので 0.5を中心としてそれより小さければマイナスの値 大きければプラスの値とみなして扱います。

 

これを見ると、ノーマルマップの計算にはタンジェントと従法線が非常に重要な要素であるというのが分かるのではないでしょうか。

正確に理解するよりも関係してるというのが分かればここは良いかなと思います。

(私もそこまで正確に理解してないです…むずかし~~)

 

 

タンジェントと従法線の計算と各種ソフト

 

重要なタンジェントと従法線ですが、ノーマルマップをベイクするソフトによって計算が異なります。

MayaはMayaの、3dsmaxは3dsmaxの、xNormalMikkTSpaceという計算を使用してそれぞれ計算しています。

 

MikkTSpaceってなんだよ…って思うとおもいますが、

ローポリメッシュのタンジェントと従法線を計算する方法の1つぐらいに捉えたら良いとおもいます。

(正確ではないかもしれませんが)

 

 

xNormalでベイクしたノーマルマップをMayaに持ってきてメッシュに貼る事があるとは思いますが、

これは正しいノーマルマップの結果を得ることができているとは言えません。

 

なぜなら、ベイクした時とメッシュに貼った時のタンジェントの計算が違うからです。

 

 

しかし、NormalMapをベイクする時の知識 その1で記載したように90°に近い角度でUVシームを分け、

メッシュの法線をハードエッジにしていれば歪みの少ないフラットなノーマルマップが生成されるためにこの違いによる影響はほとんどないのではないかと思います。

 

f:id:sinocof:20170223173737p:plain

しかし、Bのようにグラデーションのあるノーマルマップの場合だと、

ローポリメッシュのタンジェントと従法線の計算の影響をうけるようになり、変なシェーディングが入リやすくなるのかなと。

 

法線マップ作成ガイドでは手順1のところで、

 

  「最初の手順では、ご使用のモデルが 1 つのスムージング グループで構成されていることを確認します。」

と書いてあるので、Bのようなグラデーションのあるノーマルマップを作成する時にUE4でも綺麗に表示させるための方法なのかなと推測します。

 

手順に沿って考える

前知識が長くなりましたが、これらを踏まえて手順に沿って処理の流れを把握してみると理解し易いかも知れません。

流れは法線マップ作成ガイドと同じ手順です。

 

  1. 【Maya→FBX】
    FBXを書き出す時にタンジェントにチェックを入れません

    f:id:sinocof:20170224215811p:plain

  2.  

    【FBX→xNormal】
    読み込んだローポリメッシュのタンジェントはxNormalで計算されます。
    xNormalのタンジェントの計算はMikkTSがデフォルトで設定されているので、
    ノーマルマップをベイクするときのローポリメッシュのタンジェントの計算はMikkTSとなります。

    ★★追記★★
    xNormalではデフォルトMikkTSであると書きましたが、設定が必要のようです。
    (情報提供:いっすーさん ありがとうございます!)

    設定は以下の手順で行います。

    a. xNormalを起動し、左下にあるプラグのマークをクリックしてPlugin Managerを開く。
    b. 画像の手順でMikkTSの設定をします。

    f:id:sinocof:20170224215833p:plain

  3.  【FBX→UE4】

    UE4にインポートします。
    インポートの設定でノーマルだけインポートし、Normal Generation MethodはMikkTSを設定します。
    この設定により、xNormalとUE4のローポリメッシュのタンジェントの計算が一致することになります。

    f:id:sinocof:20170224215851p:plain

※ドキュメントを書かれた時よりバージョンが上がってインポートの設定画面が変わっています。

 

 

(補足)インポート時の設定

補足として、FBXインポート時の設定について触れておきます。
公式ドキュメントはこちらにあります。

 

Normal Import Method … メッシュをインポートするメッシュの法線情報をそのまま読み込むか、UE4に計算させるかを指定する。 

Compute Normals :法線とタンジェントをUE4が計算します。FBXで書きだされたスムージンググループの設定は破棄されます。

Import Normals :法線のみ読み込まれます。タンジェントはUE4で計算されますが、どように計算するかはNormal Generation Methodで指定します。

Import Normals and Tangent :法線とタンジェント両方共FBXからインポートされ、UE4は何も計算しません。

 


 Normal Generation Method … 上記設定でComputer Normal, Import Normalを設定している場合、UE4でどのように法線を計算するかを指定します。

 Build-In : ドキュメントに明記されてないですが、おそらく従来の計算方法。

 Mikk T Space : Mik T Sを使った計算方法(xNormalと同じ)

 

 

さいごに…

xNormalを使用してノーマルマップをベイクしたのであれば、MikkTSを設定しますが、

Mayaなどからベイクした時何を設定したらよいのだろうか…という疑問が残りました。

 

FBXスタティックメッシュパイプラインのページを見るとEpicのアーティストたちはデフォルトの設定で読み込ませるとあるので、

MayaやMaxからでもMikkTSで読み込ませてるのかなと思ったり…。

 

現時点ではタンジェントを一致される事が出来るのはMikkTSにのみなので、

これを使ったパイプラインが高品質であるのは確かではありますが、

MikkTSでノーマルマップをベイクすればノーマルマップに歪みがあっても綺麗にシェーディングがでるということではないので、

歪みのないノーマルマップ制作を意識することに変わりはないと思います。

(xNormalでMikkTSの設定を行うことでかなり歪み具合も改善するようです。

ココらへん私の方でちゃんと検証してないので、検証できたらまた追記します。)

 

 

かなりテクニカルよりな内容だったので自分の解釈、理解があってない場合があります。

また推測してる部分も多いです。

その点改めて、ご了承くださいませ。

 

間違い等のご指摘あれば是非よろしくお願いいたします。