【Unity】ShaderGraphでメタボールっぽいのを描く

概要

Cluster,Inc. Advent Calendar 2018、19日目の記事です。 qiita.com

VFX Graphを使って、こんな感じのメタボールっぽいのを描画してみたのでざっとまとめました。 自分自身Smin周りのよく挙動を理解できていなかったので、備忘録も兼ねています。 f:id:notargs:20181218164128g:plain

グラフの全体像

  • 2つの円のDistanceFunctionを計算して
  • SmoothMinimumでDistanceFunctionを合成して
  • SmoothStep/Materノードで出力

といったフローでレンダリングしています。

f:id:notargs:20181218165341p:plain

Source UV区

座標系を扱いやすくするため、入ってきたUVをVector2に切り出し、中心が原点の(-2, -2)から(2, 2)の範囲の空間に変形しています。

f:id:notargs:20181218165545p:plain

Distance Function区

Time/Sineノードを使って入ってきた座標をアニメーションさせたあと、Lengthノードで円のDistanceFunctionに加工しています。 f:id:notargs:20181218165726p:plain

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;
}

f:id:notargs:20181218170035p:plain

Export区

Smoothstepを使って0.4~0.45の区間で白~黒を切り替えるように補完し、Masterノードに出力しています。

f:id:notargs:20181218170218p:plain