水波特效 中通過螢幕後處理實現了環形水波效果,本文通過 Shader Graph 實現了模擬水面特效,包含以下特效細節。Shader Graph 基礎知識詳見→Shader Graph簡介、Shader Graph節點、程式紋理簡單應用。
本文完整資源詳見→Unity3D水面特效。
由於本文需要使用 Scene Color 節點的顏色緩衝區資訊模擬水面折射現象,而 Scene Color 節點只能在 URP 或 HDRP 管線下才能正常工作(詳見→Shader Graph節點),因此本文選擇在 URP 管線下實現模擬水面特效。
1)場景搭建
在 URP 專案中搭建場景如下。
說明:水面模型是一個長方形,並且網格不能太稀疏,否則對頂點的上下波動將不太自然。
2)設定 Universal Render Pipeline Asset
由於實驗中使用了 Scene Depth 和 Scene Color 節點獲取深度緩衝區和顏色緩衝區資訊,需要在 Universal Render Pipeline Asset 中勾選 Depth Texture 和 Opaque Texture,如下。
3)主圖設定
由於水面是透明的,需要在主圖的 Graph Settings 中將 Surface Type 屬性設定 Transparent,並且取消勾選 Cast Shadows(投射陰影)和 Receive Shadows(接受陰影)如下。
1)主圖
Water.shadergraph
WaterDepth、FinalWaterColor、WaterNormal、WaterPosition 都是自定義節點,釋義如下,Smoothness 用於調整水面光滑度。
2)WaterDepth 子圖
WaterDepth.shadersubgraph
說明:WaterDepth 子圖用於計算水面深度;Scene Depth 節點用於獲取不透明物體的深度值(水底深度),Screen Position 節點輸出的 w 分量是水面的深度,兩者相減就是水面到水底的深度值。SubtractDepth、DepthStrength 釋義如下。
如果將 Water Depth 子圖的輸出直接連到主圖片元著色器的 Base Color 上,顯示效果如下。從圖中可以看到,Water Depth 節點能夠較好得識別物體的邊緣。
3)FinalWaterColor 子圖
FinalWaterColor.shadersubgraph
說明:FinalWarterColor 子圖用於計算水面最終的顏色(混合深淺水顏色、泡沫顏色、背景折射顏色),WaterColor 節點用於計算水面顏色(混合深淺水顏色、泡沫顏色),WaterRefraction 節點用於計算背景折射顏色。
4)WaterColor 子圖
WaterColor.shadersubgraph
說明:WaterColor 子圖用於計算水面顏色(混合深淺水顏色、泡沫顏色),BubbleColor 節點用於計算泡沫顏色,ShallowColor、DeepColor、WaterDepth 的釋義如下。
5)BubbleColor 子圖
BubbleColor.shadersubgraph
說明:BubbleColor 子圖用於計算泡沫顏色,BubbleSpeed、BubbleDensity、BubbleFilter1、BubbleFilter2、BubbleBrightness、WaterDepth 的釋義如下。
6)WaterNormal 子圖
WaterNormal.shadersubgraph
說明:WaterNormal 子圖用於計算水面法線,NormalStrength、WaterDepth 的釋義如下。
7)WaterPosition 子圖
WaterPosition.shadersubgraph
說明:WaterPosition 子圖用於模擬水面起伏效果,通過調整頂點座標的 y 分量實現,WaveHeight 用於調整水面起伏的最大高度。由於 WaterPosition 子圖的輸出連在頂點著色器上,而 WaterDepth 是在片元著色器中計算的,因此不能使用 WaterDepth 對 WaveHeight 進行混合(即深水區水面起伏大,淺水區水面起伏小)。
8)WaterRefraction 子圖
WaterRefraction.shadersubgraph
說明:WaterRefraction 子圖用於計算背景折射顏色,通過對顏色緩衝區的紋理進行隨機偏移取樣實現,折射的 Shader 實現詳見→反射和折射。RefractionStrength 用於調整折射偏移強度,Screen Position 節點用於獲取螢幕頂點的 uv 座標,Scene Color 節點(類似於 Shader 中的 GrabPass)用於獲取顏色緩衝區紋理(僅在 URP 或 HDRP 管線下才能正常工作),節點詳見→Shader Graph節點。
宣告:本文轉自【Unity3D】水面特效。