2015年10月6日火曜日

HeightからNormalに変換する時の組み方

SubstanceDesignerでいろんな方が配布されているsbsファイルを見てみると、
Normalを書き出す時のノードのつなぎ方がいろいろあるなぁと思っています。
(そもそも、ノードのつなぎ方自体色々な方法があるのでNormalに限った話ではないですが…)

SDを使うフローによって違いは出てくると思いますが、
ここでは外部で作成したノーマルマップなどを使用せず、
SD内で完結させる場合に限定して書きます。


SDで質感を作成する場合、凹凸情報はHeightマップとして組んでいき、
それをNormalに変換するという方法になるかとおもいます。


■①Height→Normal



SD内で見る分にはそのまま[Output]のNormalに接続してもいいのですが、
画像として書き出すと[Normal]ノードのプレビューのように透けた状態で書き出されるので、
[Channels Shuffle]を使って正しくノーマルマップが出るようにします。



[Channels Shuffle]の設定はこのような感じ。
接続している[Uniform Color]は白です。
グレースケールでもカラーでも接続できます。


この方法の場合、[Normal]ノードで調整できるノーマルマップの強度は3までなので
一定上強くはできないという印象です。




■②Height→Height Normal Blend



凹凸のない[NormalColor]をベースにして、Heightマップをブレンドする方法。
[Height Normal Blend]ノードはノーマル強度を自由に調整できるので、
かなり強くすることもできます。(もちろん見た目ガビガビになりますけど)





■③Heightをその都度Normalに変換してブレンドする




図は参考程度に組んだものですが、
各要素毎にHeightからNormalに変換をして、
それを[Normal Blend][Normal Combine]を使ってブレンドしてしまうという方法です。

各要素ごとにNormalの強度調整を[Normal]ノードのIntensityを調整すればよくなるので、
感覚的にわかりやすいかなと思います。自分も以前はこういう方法でやってました。



■いつNormalに変換するか?

どのタイミングでNormalに変換していくのかというのが個人的にはまだ感覚がつかめていないのですが、
基本的には最後に変換すると考えています。

というのも、③都度Normalに変更している場合で、
[Ambient Occlusion]を使用したいとなった時に、
NormalからまたHeightに戻す必要が出てきます。
そうなると情報として劣化してしまいます。

同じHeightマップから生成したAOですが、
左はNormalに変換した後に、Heightに戻したもの。
右はそのままAOを生成したもの。

こうしてみると劣化はわかりやすいかも。

 
[Ambient Occlusion]だけの問題かどうかはわからないですが、
他のノードを使う場合でもHeightの方が都合がよい場合はありそうな気がする…。
そのままマスクで使えるとか…。
(ずしさん教えてくれて、ありがとう!)



しかし、必ずしも最後までHeightでやるのがベストかというとそうでもないです。
例えば、このように表面の微妙な凹凸を表現しようとするとHeightから変換した場合、
階調が足りなくなり、ノイズが出てしまう場合があります。


このような場合は、無理に最後までHeightで作業するよりも、
この細かい凹凸の表現だけNormalに変換してしまって、[Normal Combine]を使ってブレンドしてしまう。
接続するHeightの情報も階調を広く持たせたものにして、
凹凸の強さはNormalのIntensityで調整してしまうとこのようにノイズが消えてなくなりました。



 このようなことを踏まえて考えてみると、
いつNormalに変換するかというのはケースバイケースであるなというのが個人的な感想。


とはいえ、Ambient Occlusionのようなこともあるので、
基本的には最後に変換し、
ノイズが出るような場合に限って、ノーマルに変換したものをブレンドするというのが
今のところ良さそうな方法かなとおもいます。

0 コメント:

コメントを投稿