太郎Work

Unityとかで困ったこと等を残しておきます

Unityを使って水っぽい表現作ってみた

今GravityDAZE2をやっているのですが、水表現が面白いことになっていたので自分でUnityを使って実装してみました


背景が殆ど無いので分かりにくいと思いますが…

シェーダ

モデルの裏側をキャプチャしたものを使用して法線で歪ませて描画する方法で実装しました

GrabPass { "_WaterGrab" }

GrabPassを記述すると描画直前のバッファを_GrabTextureにコピーしてくれますが、上のようにTexture名を指定することでこのGrabPassが初めて呼ばれたときのみコピーされるみたいです。

例えばこのシェーダで4個メッシュを描画すると1個めが描画されたときのみGrabPassが走り、2個め以降は1個めで使用したGrabTextureを再利用する
これで負荷を最小限にできます!

あとは一般的なスクリーン投影計算とリム計算ぐらいです。

half kScale = 1.7777;
half2 enc;
enc = i.viewNormal.xy / (i.viewNormal.z+1);
enc /= kScale;
i.viewNormal.xy = enc * 0.5;

フラグメントシェーダ内のこの処理は法線方向をスクリーンでいい感じに見えるように変換する計算式です
UnityCG.cgincのEncodeViewNormalStereo関数を持ってきました
Unityの法線テクスチャ描画時に呼ばれている関数なのですが、使ってみたら結構いい感じになったのでこれにしました。

Cloth

水の揺れ表現にはClothを使ってみました
f:id:tarowork:20170130022406p:plain

パラメータはちょこちょこっと変えていい感じにして外部から少しだけ力を加えて動くようになっています。
頂点設定は一部の頂点を動きにくい設定にして凸凹感が出やすいようにしました。
多分ここをきれいに設定するともっと柔らかい歪みになると思います。
0.1だと動かなすぎるし大きい値だと動きすぎて本来の一から離れすぎてしまうので0.15~0.2ぐらいがちょうどよかったです

Cloth工夫次第でいろいろできそうな予感がします


これ使って何か作りたい