より自由にハイトマップを作成する

Substance Designerでは最初にハイトマップを作成するのが基本的なアプローチになります。
しかし、何も考えずにハイトマップを作っていくと数値が飽和してノーマルが残念なことになったりします。

f:id:monsho:20180309001758p:plain

[Blend]ノードでは加算(Add)を使っています。
この場合、[Shape]ノードの段階で数値が 1.0 のピクセル、つまり画像中心のピクセルは2倍されるので2.0になるはずです。
そしてそこからすそ野に向かって徐々に数値を減らしていくはずなので、生成されるノーマルマップは山なりになっているべきなのですが、上の画像のように途中から平べったくなってしまいます。

なぜこのようになるのかというと、基本的なフォーマットでは数値が1.0までで飽和してしまい、それより大きな値は1.0にクランプされてしまうからです。
実際に3DViewで高さとノーマルに上の画像のノードを割り当てるとこのようになります。

f:id:monsho:20180309002803p:plain

高さが途中でクランプされてしまっているのが一目瞭然です。

これを避けるため、通常は高さが1.0を超えない範囲でうまくやるものなのですが、[Blend]ノードによる加算や Add Sub などを使ってしまうと意図せず1.0を超えてしまうこともあります。
1.0を超えてしまった部分はノーマルマップが平坦になってしまうため、大変見苦しい結果となってしまいます。

f:id:monsho:20180309003326p:plain

このような画像になるのは意図していない場合がほとんどですが、ユーザが変更可能なパラメータが多くなってくると、パラメータの組み合わせによってはこのような結果となってしまうことが多々あります。

これを避ける方法の1つが浮動小数点フォーマットを使用する方法です。

f:id:monsho:20180309003942p:plain

浮動小数点フォーマットを利用すると、ノードの数値は 1.0 より大きな値を取り扱うことが可能になります。
そのため、最初の画像は以下のような結果となります。

f:id:monsho:20180309004156p:plain

中心部分の高さがクランプされず、滑らかな形状ができていることが確認できますね。

ただし、どこの段階で浮動小数点マップを使用するか、どの段階で16ビットフォーマットに変換するかは難しい判断となります。

例えば、[Gradient Map]ノードのように、入力されて入ってくる数値が 0.0~1.0 の範囲になっていることを前提としているノードでは、1.0を超えた値は1.0と同じ結果となります。

また、[Slope Blur]などのノードに浮動小数点フォーマットのノードを使うと、意図しないノイズが出てしまったりします。

f:id:monsho:20180309005821p:plain

左の画像は[Slope Blur]を使用する段階で浮動小数点フォーマットに変換した場合ですが、細かなノイズが表面に出てしまっているのがわかります。
それに対して、ハイトをノーマル生成ノードに渡す部分で浮動小数点フォーマットに変換した場合は滑らかな表面になっています。
浮動小数点フォーマットは速度面にも問題が出る可能性が高いので、ハイトをブレンドする場所で主に使うようにし、そこを超えた段階で [Auto Levels] ノードを使って 0.0~1.0 の範囲に収めるようにするのが良いのではないかと思います。