🐥

Unityで水に沈む部分にグラデーション表現を入れるShader Graph

2023/08/08に公開

概要

画像のとおり、水面に沈んだ部分をグラデーションで色付けする表現を実現するShader Graphを実装しました。

シェーダーグラフ全容

シェーダー解説

これは、「カメラから見た、水面までの距離(深度)」と「カメラから見た、水面を描画する前に元々存在していたモノのまでの距離(深度)」を利用することで実現しています。

「カメラから見た水面までの距離(深度)」はScene DepthノードのEyeサンプラーを選択したときに取得できます。

「カメラから見た、水面を描画する前に元々存在していたものまでの距離(深度)」は、Screen PositionノードのEyeモードを選択したときの出力のアルファ成分(Vector4をxyzwと見なしたときのw成分)から取得できます。

つまりScene Depthノードの出力と、Screen Positionノードの出力のw成分を引けば水面から物体までの距離を計算することができます。

後は水面から物体までの距離が0に近ければ濃く、遠いほど薄くなるようなグラデーションで塗りつぶせば目的の表現が実現できます。

注意

「カメラから見た、水面を描画する前に元々存在していたものまでの距離(深度)」を正確に計測するには、水面を後に描画する必要があります。
Shader GraphのGraph SettingsからSurface TypeをTransparent、つまり半透明に指定すれば、不透明なモノ(今回の例では石)までの距離を正確に計ることができます。逆にこの設定を忘れると、正しい見た目にならないので注意してください。

(水面の描画を後にするのは、他にも方法があります)

参考

https://www.youtube.com/watch?v=MHdDUqJHJxM

GitHubで編集を提案

Discussion