【Unity】ShaderGraphでメタボールっぽいのを描く
概要
Cluster,Inc. Advent Calendar 2018、19日目の記事です。 qiita.com
VFX Graphを使って、こんな感じのメタボールっぽいのを描画してみたのでざっとまとめました。 自分自身Smin周りのよく挙動を理解できていなかったので、備忘録も兼ねています。
グラフの全体像
- 2つの円のDistanceFunctionを計算して
- SmoothMinimumでDistanceFunctionを合成して
- SmoothStep/Materノードで出力
といったフローでレンダリングしています。
Source UV区
座標系を扱いやすくするため、入ってきたUVをVector2に切り出し、中心が原点の(-2, -2)から(2, 2)の範囲の空間に変形しています。
Distance Function区
Time/Sineノードを使って入ってきた座標をアニメーションさせたあと、Lengthノードで円のDistanceFunctionに加工しています。
Smooth Minimum区
iq氏のExponentialSmoothMinimum(https://www.iquilezles.org/www/articles/smin/smin.htm)を元に、ノードに書き起こしています。
若干計算式がわかりにくいですが、ノードを一個一個追っていくと理解しやすいと思います。
// exponential smooth min (k = 32); float smin( float a, float b, float k ) { float res = exp2( -k*a ) + exp2( -k*b ); return -log2( res )/k; }
Export区
Smoothstepを使って0.4~0.45の区間で白~黒を切り替えるように補完し、Masterノードに出力しています。