一個卡通的水
本文用 ShaderGraph 來模仿一下 The Illustrated Nature 插件中水的 泡沫效果,原效果如下:
下圖是我用 ShaderGraph 模擬的效果:
代碼我丟在了github上,地址:https://github.com/fatdogsp/URP-Simple-Water。
泡沫的實現(xiàn)細節(jié)
The Illustrated Nature 是風格化渲染,水的shader其實還是比較簡單的,并沒有常見的 反射 或者 折射,本文主要記錄一下 泡沫 部分的實現(xiàn)細節(jié)。
這里并不需要任何 泡沫貼圖,只提供了一個 泡沫顏色,而泡沫的形狀主要由如下兩個部分組成:
- 規(guī)則的邊緣線條
- 不規(guī)則的噪聲線條
在計算泡沫線條之前,我們首先需要計算出水的深度,因為泡沫只會出現(xiàn)在淺水區(qū)。
深度計算比較常規(guī),代碼如下:
這里先計算出水和場景在攝像機空間下的 深度差,用于后續(xù)的泡沫計算。
規(guī)則的邊緣線條
我們可以定一個泡沫出現(xiàn)的最大深度,比如0.3,超出這個深度,泡沫就消失。
此外,在出現(xiàn)泡沫的深度區(qū)間,我們還可以利用 正弦函數 來模擬海浪的效果,代碼如下:
動態(tài)效果圖如下:
這里區(qū)間轉換節(jié)點 Remap 非常好用,誰用誰知道。
不規(guī)則的噪聲線條
在規(guī)則的泡沫線條上再疊加一層不規(guī)則的噪聲線條,整個泡沫就比較完美了。
這里我參照 The Illustrated Nature 的做法,用2層不同scale的 Simple Noise 相疊加,配合 UV動畫 模擬泡沫的運動,代碼如下:
深度比較
在計算線條的時候,我用 step 去做深度比較,這個計算結果非0即1,所以泡沫和非泡沫的邊界是很硬的,這樣符合卡通渲染的特征。
當然,如果需要做邊界過度,我們可以用 smoothstep 替代 step。
泡沫的顏色合成
泡沫的顏色合成就是把上面的兩層泡沫相加,代碼如下:
這個很簡單,就不羅嗦了。
水體的其他部分
其他部分都是常規(guī)代碼,水波紋很簡化,有興趣的自己改。
個人主頁
本文的個人主頁鏈接:https://baddogzz.github.io/2020/04/04/ShaderGraph-Foam/。
好了,拜拜!