TATIKUNLOG.

主にゲーム作りについて書き留めるブログ。

ShaderGraphでダミー液体シェーダを作る【Unity】


PR

f:id:tat1kun:20210620160800g:plain

上の動画みたいに、物体の角度が変わっても

水位を維持する(ように見せる)ダミーの液体シェーダを作ります。

構成

f:id:tat1kun:20210620161513j:plain

赤枠で囲んだ部分が重要な実装部分で、

他のノードは色の調整のために導入している部分なので、説明は省略します。

ObjectとPositionの関係について

f:id:tat1kun:20210620162938j:plain

オレンジ色の線で囲んだ部分で

オブジェクトを切り取るY座標を取得しています。

Objectノードオブジェクトのワールド座標系での位置を取得しています。

Positionノードではワールド座標系におけるFragmentの位置を取得しています。

Fragment良く分かんないって人は、

とりあえずオブジェクト上のある一点の事だと思っておいてください。

(割と意味が違いますけど、イメージということで)

Object Node | Shader Graph | 12.0.0

Position Node | Shader Graph | 12.0.0

f:id:tat1kun:20210620173606j:plain

StepノードInの入力に対して、Edgeの閾値で0か1に変換します。

Fillという0~1の範囲のプロパティを作成しておき、

FillをRemapで変換して、StepのInの入力には0~0.2の値が入るようになっています。

これは今回描画する液体のY座標方向の大きさが0.2になっているからです。

Step Node | Shader Graph | 12.0.0

Remap Node | Shader Graph | 12.0.0

ダラダラと処理の流れを書きましたが、Stepを使っている部分が分かりにくいと思うので、

絵に描いて表現してみました。

f:id:tat1kun:20210729225132j:plain

要するに、描画するオブジェクト全体で共通のFillの値を持っておいて、

Fillの値が届かないy座標以上のオブジェクトの部分のアルファを0に設定してカットしてます。

この実装の仕様

ワールド座標系を基準に実装しているため、オブジェクトのスケールを変更する場合、

シェーダ側のRemapの範囲も変更する必要性があります。

参考

Unity Shader Graph - Liquid Effect Tutorial - YouTube

参考動画では、スクリプトを活用して液体が揺れるような演出まで作成してますね。

作ってて気がついたのですが、最近のバージョンだとReference Nameがプロパティ名と同じになるようになったんですね。