ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unity】StandardAssetsの「Water4」で水中から水面上をレンダリングする方法

time 2016/12/18

※本記事は「Unity5.4.1」時点の内容です。

というわけで、今回は Unity のシェーダーに関するお話です。
StandardAssets の Environment に「Water4」という水面シェーダーがあります。

shot2ss20161218223706980

Unity4 まではPro専用でしたが、Unity5 から無料でも使えるようになりました。
これによって水面のレンダリングがすごく楽に出来ます。

shot2ss20161218224017428

が、カメラが水中に入っている場合、水面上が見えなくなってしまいます。
ステージに陸上のエリアと水中エリアがある場合、かなり致命的な問題です。

適当に試行錯誤したところ、Water4 のシェーダーを修正すれば(とりあえずは)直るようです。
自分はシンプルの方を使っているので、「FXWater4Simple.shader」を修正します。
215行目付近の edgeBlendFactors が書かれている行をコメントアウトします。

baseColor = lerp (lerp (rtRefractions, baseColor, baseColor.a), reflectionColor, refl2Refr);
baseColor = baseColor + spec * _SpecularColor;

// baseColor.a = edgeBlendFactors.x; // ←この行をコメントアウト
UNITY_APPLY_FOG(i.fogCoord, baseColor);
return baseColor;

水色なので分かりにくいですが、 水面上が表示されるようになりました!

shot2ss20161218225529184

少し上に「half4 edgeBlendFactors = half4 (1.0, 0.0, 0.0, 0.0);」という宣言があるので、水面の少し上を baseColor のアルファ値に設定しているからかなーと察しています。
とはいえ、自分はシェーダーがほとんど分からないので、このアプローチがよろしいかは微妙です。
修正する場合は自己責任でお願いします!

down

コメントする