Making Tera

たまに書く不定期ブログ

Unityで水際シェーダー

湿地帯マップの沼を表現するためシェーダーを作る必要があったのでメモを残しておきます。

具体的には水際のエッジが直線っぽく見えるのを防ぐためのシェーダーです。


水際シェーダー

実装は案外簡単で以下のシェーダーを水面に適用すればOKです。

・Input構造体に以下の二つを追記
float4 screenPos;
float eyeDepth;

サンプラーを用意
sampler2D_float _CameraDepthTexture;

・頂点シェーダー内に以下を追記して頂点の視点空間の深度マップをoに出力
COMPUTE_EYEDEPTH(o.eyeDepth);

・後はサーフェイスシェーダーで深度を扱うことができます。
float depth = SAMPLE_DEPTH_TEXTURE_PROJ(_CameraDepthTexture, UNITY_PROJ_COORD(IN.screenPos));//深度

・水際かどうかは以下のように求められます(深度の差*係数を0~1に収める)
float waterSite = saturate((LinearEyeDepth(depth) - IN.eyeDepth) * _Amount);

実際には上記のwaterSiteにノイズを加えた値を2つのテクスチャの合成値として利用することで動画のようになります。