unityのHDRPでは、Bent Normal Mapという謎のマップが使えることはご存じでしょうか?
これは、リアルタイムの反射ライティングに、さらなるリアリティを与える効果があるのですが、テクスチャの作り方があまり文章化されていません。
今回は、このBent Normal Mapの制作方法をご紹介します。
Contents
Bent Normal Mapでできること
理屈云々の前に、Bent Normal Mapでできることを紹介します。
Bent Normal Mapを使うことで、 現実では光が届きにくい隙間のハイライトや反射光をオクルージョン(遮蔽)することができます。
Bent Normal Mapでは、奥まったところをあらかじめ計算しておき、その部分の反射光ライティングを暗くする処理が行われています。実際にBent Normal Mapをunityで使用してみた様子が下のgifです。明らかに影ができそうな場所で、スペキュラを抑えているのがわかります。
自己反射のようなライティングが追加されたことによって、より重厚な金属表現になったと思いませんか?
Bent Normal Mapの作り方
Bent Normal Mapのドキュメントは、UnityよりもUnreal Engineの方が詳しかったりします。
ベント法線マップアンリアル エンジン 4 におけるベント法線マップの使用方法の概要です, (観覧日2020, 1, 17)
https://docs.unrealengine.com/ja/Engine/Rendering/LightingAndShadows/BentNormalMaps/index.html
この解説によると、Substance Designerで Bent Normal Mapを作成できるらしいのですが、Substance Designerを利用できる環境にある方は、そちらを利用した方がいいでしょう。(筆者は環境がないので、詳細不明)
ここでは、xNormalとBlenderを利用した方法を紹介します。
xNormalで作る
xNormalという怪しげなソフトを以下よりダウンロードします。
xNormal
https://xnormal.net/
サイトやソフトウェアのデザインに斜め上を行くヤバさを感じますが、性能は結構優秀です。
まずはHigh Definition Meshよりメッシュを追加します。右クリックでAdd Meshを選択し、マップを作成したいモデルを指定します。
次に、Low Definition Meshに同様の手順でモデルを追加します。Low Definitionとなっていますが、High Definitionで指定したものと同一で構いません。
最後にBaking Optionsより、
- 出力先を指定
- テクスチャサイズを選択(1Kで十分です)
- Bent Normal Mapをチェック
- ベイクを開始
の手順でベイクします。
と、xNormalを紹介しましたが、ベイクできないモデルがあるようです。
デモで作った簡単なモデルであれば問題なかったのですが、ポリゴン数がやや多いものはエラーを吐いてマップを作成できませんでした。
Blenderで作る
xNormalを試したのが、数か月前だったのですが、最近こういう投稿がありました。
How do I bake a Bent Normal Map in Blender, Nov 3, 2019
https://blender.stackexchange.com/questions/157079/how-do-i-bake-a-bent-normal-map-in-blender
なんとBlenderでもベイクできるようです!!(ベイクについては下の記事をぜひお読みください)
手順としては、まず初めにこちらよりoslファイルをダウンロードします。そして、 Bent Normal Map を作成したいモデルにマテリアルを割り当て、以下のようにノードを組みます。注意点としては、
- レンダリングエンジンをcyclesに変えないとノードにソケットが出ない
- “Open Shading Language“にチェックを入れる
これで通常のNormal Mapをベイクする要領でベイクしてください。
二つのマップを比較
以上の二つの方法でベイクした結果が以下の通りです。
細かい色味の違いはオプションの設定で収束すると思いますが、おおむね同じ結果を出力していることがわかります。
Unityで使用するには
unityでBent Normal Mapを使用するには、High-Definition Render Pipelineでなくてはいけません。
また、Advanced OptionsよりSpecular Occlusion From Bent Normalにチェックを入れないと効果が出ません。
まとめ
xNormalの方がベイク時間が短いのですが、エラーを吐くモデルが少なからずあります。
Blenderは方は、ベイク時間が長い代わりに、安定した結果を出力してくれます。
個人的にはBlenderだけでモデリングからテクスチャ作成までを完結したいので、Blenderで制作する方がいいような気がします。
また、シーンに登場するオブジェクトすべてにBent Normal Mapを設定するのは無意味です。メモリを荒らしますし、スペキュラが少ないものにはほとんど効果がありません。
アンビエントオクルージョンやスムーズネスマップと組み合わせながら、ルックを仕上げていきましょう。
ここで紹介した作成方法以外になにかいい方法がありましたら、コメントよりお教えいただけると幸いです。