上一篇講了水基本的折射和反射,這篇寫一下如何做出浪花效果,如圖:
基本思路就是用攝像機(jī)的深度紋理減去當(dāng)前渲染物體的深度值讲逛,得到物體間的距離,然后用這個(gè)值對(duì)浪花紋理進(jìn)行采樣岭埠。
用這個(gè)值還可以做出水深度的變化盏混,此處是用lerp對(duì)水底顏色和折射顏色進(jìn)行插值,效果如圖:
這里就用 shader graph解釋一下惜论,比較方便:
ScreenPosition(Raw)的w分量就是視角空間下的z值许赃,SceneDepth就是攝像機(jī)深度紋理采樣得到的深度值,注意這邊的eye代表把深度值轉(zhuǎn)換成了線性空間(視角空間)下的深度值馆类,這樣就可以直接和ScreenPos.w相減得到物體之間的距離。
代碼版本如下乾巧,對(duì)深度紋理采樣用的是屏幕坐標(biāo)xy再做一下歸一化除法得到真正的屏幕坐標(biāo):
除以edgethickness是為了控制邊緣的距離句喜。之后再saturate一下把它變到0,1的范圍沟于,以便后面對(duì)貼圖采樣咳胃。
用1去減一下配合后面的漸變貼圖(從黑漸變到白),然后采樣旷太,乘以一個(gè)自定義的邊緣顏色:
最后把顏色加到輸出的顏色里就可以了展懈。
模擬水越深顯示的折射顏色越少,本身顏色越多,就用剛才saturate以后的值對(duì)兩個(gè)顏色插值就行了:
代碼:
這樣深度紋理在水體中的應(yīng)用就介紹完了存崖。
下一篇寫偽焦散效果