Unity引擎制作海面效果
??大家好,我是阿趙。
??上一篇的結束時,海面效果已經做成這樣了:

??這個Shader的復雜程度已經比較高了:
??不過還有一些美中不足的地方。
1、 海平面沒有反射到天空球
2、 在近岸邊看得到水底的部分,水底的砂石沒有變化,按道理應該是有水的折射,導致畫面會出現扭曲才對。
??我這個例子,其實是沒有做這兩點的。不過也可以分享一下思路。
一、 反射
??反射的做法有多種。
??如果是要實時真實的反射,可以參考Unity很早之前的水的例子,那個類似于鏡面反射的效果,其實是在正常攝像機上增加了一個相對計算出位置的攝像機,拍攝出反射應該出現的畫面,然后再通過RenderTexture賦予給材質球。由于是真的有個攝像機在拍攝,所以算是真正的實時反射,假如有個什么物體在水面上經過,也會倒影在水面上。
??但這樣做等于是把大部分的物體都渲染兩次,性能不是特別的好。所以如果不是想產生真實的倒影,只是想把天空的氛圍倒影在水面上,其實就比較簡單了,做一個Matcap的假反射,然后通過乘以一個強度,再疊加在漫反射顏色上面就可以了。
二、 折射
??如果需要折射,一般的做法是通過GrabTexture功能,抓取一張屏幕幀畫面,然后對其進行扭曲。ASE也自帶了這個節點。
??需要注意的地方有幾點:
1、 如果想完全用扭曲代替后面的畫面,那么就不能用透明度混合,而要當他不透明物體渲染。不然會出現扭曲的畫面和正常的畫面同時出現。
2、 注意性能
??GrabTexture是抓取當前幀的畫面,性能其實不是很好的,如果不勾選CustomGrabPass,那么它就可能會抓取多次,性能就更不好了。
??所以我們一定要勾選CustomGrabPass,這樣它會每幀只抓取一次,然后賦予給這張指定名字的貼圖,這樣性能稍微會好一些。
3、 UV
??所謂的對這張GrabTexture做扭曲,其實就是修改它的UV坐標而已。
??獲取當前的UV坐標,可以用GrabScreenPosition節點來做。然后通過各種手段,比如疊加噪聲圖、法線圖來小范圍改變UV坐標。等
??關于這個反射和折射的問題,由于這個海面的例子沒做,所以我之后再找另外的例子來說明吧。