2014年10月5日日曜日

PixelNormalWSとVertexNormalWS

PixelNormalWSとVertexNormalWSについて少し調べてみました。

pixelのNormal情報まで計算するか、VertexだけのNormal情報を計算するかが大きな違いかなと。


WorldSpaceについて

まず、この2つのノードの最後にはWSの表記があります。
これはWorldSpaceの略です。

VertexNormalWSをEmissiveに接続してみます。


ビューでは以下のように、球体を8方向に分割し、それぞれに色が割り当てられています。
(ちょっとgifが汚いですが…)


これはメッシュに対して、ワールド空間の座標を示しています。
ワールドの座標はgifの左下に出ているものです。



球体だとわかりにくいのでメッシュをシーンに配置してみます。
同じようにメッシュでもワールドの座標に合わせて色が表示されています。


配置したメッシュは同じもので、回転をそれぞれ変えています。

色の向きはすべてメッシュの頂点の向きに合わせて
同じ色が設定されているのがわかりますでしょうか。

どんだけくるくる回しても色の位置は変わりません。


このようにWorldの空間に対しての情報を
色で返してくれているというのがこれでわかると思います。



VertexNormalWS

上記説明はVertexNormalノードでテストしたのでわかると思いますが、
頂点情報に対してWSの情報をくれるノードです。



PixelNormalWS

それに対して、PixelNormalWSノードの場合ですと、Pixelの法線情報に対しても返してくれます。
つまり、Normalmapも考慮してくれるということですね。

ノードを以下のように、PixelNormalに変更し、NormalMapを貼ってつなぎます。


すると、Normalmapの法線情報に対してもWSのカラーを返してくれるようになります。
比較してみると一目瞭然!!


また、PixelNormalはUE4から入ったノードのようで、UE3の頃は以下のようにノードを組んでいたようです。

NormalMapからTransformノードをつなぎ、
SouceをTangent、 DestinationをWorldに変換するだけ。
(デフォルトのままで大丈夫です)




この方法の場合、NormalにNormalmapをつながなくても同じ結果を得ることができるので、
Normalに接続したくないNormalmapから情報を取りたい場合には都合がいいかもしれません。



WorldSpaceの情報で何ができるのか

これらのノードを使って取得するWSの情報から何ができるのかというと、
X軸、Y軸、Z軸それぞれの向きの情報を個別に取得することができます。

PixelNormalWSからComponentMaskをつないで、Bチャンネルだけを取るようにします。


すると球体が上下に白黒に分離されました。
つまり、これでZ軸の情報を取得することができるということですね。


Z軸の情報を使って以下のようにノードを組みます。


Powerの値が大きければ大きいほど白の部分の面積が変わっていきます。


余談ですが、Clampが2回つないでありますが、これは間違いではありません。
WSから取得できる情報の数値が非常に大きいため、
Clampをかけて0~1の値になおしてあげる必要があります。

Powerの後も1以上の値になってしまうので、再度Clampをかけて0~1に戻してあげます。


この組み方を使って何ができるかというと、
例えば、雪が積もった岩を表現したいときに使うことができます。

雪は基本的に上から積もるので+Zの方向に雪がブレンドされていればよいわけです。




マテリアルを以下のように組みます。

先ほど作成した式(赤い枠)はLerpのAlphaにつなぎます。
LerpのAは岩のBaseColor、Bは雪のつもりで白(1,1,1)をつなぎます。


結果は以下の通り。
上にうっすら雪が乗ったように白くなってるのがわかると思います。


この処理にさらにRoughnessやNormalにも影響が出るように組むことで
よりリアルに雪が積もった表現ができると思います。

こういうのが組めるとテンションがあがりますね~ヽ(=´▽`=)ノ

0 コメント:

コメントを投稿