夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

Unityでフェイズシフトシェーダーを作る その2

本日は昨日に引き続きフェイズシフト装甲をUnityのシェーダーで再現していきます。

昨日は一番の機能となるグレースケールに対応しました。

redhologerbera.hatenablog.com

〇フェイズシフト展開時のノイズ

 フェイズシフト装甲を展開する際は一様に展開するのではなく装甲表面にノイズが走りながらむらがある展開をします。

 本日はこちらを再現します。

 まずは一様に展開するのではなく展開のむらを再現します。

 水の波紋のようなノイズを追加するときはVoronoiを使用すると最適です。

 

 CustonFunctionノードにNoiseを追加してむらを作ります。

float sumComponent = inputColor.r*0.299+inputColor.g*0.587+ inputColor.b*0.114;
sumComponent = sumComponent >= 0.2 ? 0.2 : sumComponent;
//Noise = clamp(Noise, 0.0, 1);

// NoiseをPowerに応じて滑らかに適用します
sumComponent *= lerp(1, Noise*10, Power);

output = float3(sumComponent,sumComponent,sumComponent)*(1-Power)+float3(inputColor.r,inputColor.g,inputColor.b)*Power;

これを実行すると次のようになります。

GIF画像では少しわかりずらいですが、中央部などよく見ればむらを確認できます。

しかし映像での表現を見ると『展開』するように広がっていきます。

これを再現するために一度CustomFunctionのノード内容を戻します。

float sumComponent = inputColor.r*0.299+inputColor.g*0.587+ inputColor.b*0.114;
sumComponent = sumComponent >= 0.2 ? 0.2 : sumComponent;

output = float3(sumComponent,sumComponent,sumComponent)*(1-Power)+float3(inputColor.r,inputColor.g,inputColor.b)*Power;

Power側でむらをつくるために次のようにノードを接続しました。

ボロノイノードをPowerと接続しPowerの初期値(0付近の値)では一様に0に近い値を返し、Addの値と足し合わせ、二乗化することでよりむらをはっきりさせ0~1にクランプした値を使用するようにします。

これで先ほどよりもはっきりとしたむらが加わり、展開されている様子がはっきり出ます。

はっきりとむらがでている

これでよりアニメ劇中描写に近いシェーダーができました。

本日は以上です。