🐥
Unityで水に沈む部分にグラデーション表現を入れるShader Graph
概要
画像のとおり、水面に沈んだ部分をグラデーションで色付けする表現を実現するShader Graphを実装しました。
シェーダーグラフ全容
シェーダー解説
これは、「カメラから見た、水面までの距離(深度)」と「カメラから見た、水面を描画する前に元々存在していたモノのまでの距離(深度)」を利用することで実現しています。
「カメラから見た水面までの距離(深度)」はScene Depthノード
のEyeサンプラーを選択したときに取得できます。
「カメラから見た、水面を描画する前に元々存在していたものまでの距離(深度)」は、Screen Positionノード
のEyeモードを選択したときの出力のアルファ成分(Vector4をxyzwと見なしたときのw成分)から取得できます。
つまりScene Depthノードの出力と、Screen Positionノードの出力のw成分を引けば水面から物体までの距離を計算することができます。
後は水面から物体までの距離が0に近ければ濃く、遠いほど薄くなるようなグラデーションで塗りつぶせば目的の表現が実現できます。
注意
「カメラから見た、水面を描画する前に元々存在していたものまでの距離(深度)」を正確に計測するには、水面を後に描画する必要があります。
Shader GraphのGraph SettingsからSurface TypeをTransparent、つまり半透明に指定すれば、不透明なモノ(今回の例では石)までの距離を正確に計ることができます。逆にこの設定を忘れると、正しい見た目にならないので注意してください。
(水面の描画を後にするのは、他にも方法があります)
参考
Discussion