【Unity3D】水面特效

2023-10-18 06:00:51

1 前言

水波特效 中通過螢幕後處理實現了環形水波效果,本文通過 Shader Graph 實現了模擬水面特效,包含以下特效細節。Shader Graph 基礎知識詳見→Shader Graph簡介Shader Graph節點程式紋理簡單應用

  • 深水區和淺水區顏色差異;
  • 水面有波紋,並且在移動;
  • 水面起伏波動;
  • 水面邊緣有水泡;
  • 水中物體因折射而扭動。

​ 本文完整資源詳見→Unity3D水面特效

2 水面特效實現

​ 由於本文需要使用 Scene Color 節點的顏色緩衝區資訊模擬水面折射現象,而 Scene Color 節點只能在 URP 或 HDRP 管線下才能正常工作(詳見→Shader Graph節點),因此本文選擇在 URP 管線下實現模擬水面特效。

2.1 場景搭建及環境設定

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(接受陰影)如下。

2.2 水面 Shader Graph

1)主圖

​ Water.shadergraph

​ WaterDepth、FinalWaterColor、WaterNormal、WaterPosition 都是自定義節點,釋義如下,Smoothness 用於調整水面光滑度。

  • WaterDepth 節點:水面到水底的深度計算;
  • FinalWaterColor 節點:水面最終的顏色(混合深淺水顏色、泡沫顏色、背景折射顏色);
  • WaterNormal 節點:水面法線;
  • WaterPosition 節點:水面座標。

2)WaterDepth 子圖

​ WaterDepth.shadersubgraph

​ 說明:WaterDepth 子圖用於計算水面深度;Scene Depth 節點用於獲取不透明物體的深度值(水底深度),Screen Position 節點輸出的 w 分量是水面的深度,兩者相減就是水面到水底的深度值。SubtractDepth、DepthStrength 釋義如下。

  • SubtractDepth:深度減去的引數,其值越大淺水區越大;
  • DepthStrength:深度加強的引數,其值越大淺水區越小。

​ 如果將 Water Depth 子圖的輸出直接連到主圖片元著色器的 Base Color 上,顯示效果如下。從圖中可以看到,Water Depth 節點能夠較好得識別物體的邊緣。

3)FinalWaterColor 子圖

​ FinalWaterColor.shadersubgraph

​ 說明:FinalWarterColor 子圖用於計算水面最終的顏色(混合深淺水顏色、泡沫顏色、背景折射顏色),WaterColor 節點用於計算水面顏色(混合深淺水顏色、泡沫顏色),WaterRefraction 節點用於計算背景折射顏色。

4)WaterColor 子圖

​ WaterColor.shadersubgraph

​ 說明:WaterColor 子圖用於計算水面顏色(混合深淺水顏色、泡沫顏色),BubbleColor 節點用於計算泡沫顏色,ShallowColor、DeepColor、WaterDepth 的釋義如下。

  • ShallowColor:淺水區的顏色;
  • DeepColor:深水區的顏色;
  • WaterDepth:水面到水底的深度,用於混合深水區和淺水區的顏色。

5)BubbleColor 子圖

​ BubbleColor.shadersubgraph

​ 說明:BubbleColor 子圖用於計算泡沫顏色,BubbleSpeed、BubbleDensity、BubbleFilter1、BubbleFilter2、BubbleBrightness、WaterDepth 的釋義如下。

  • BubbleSpeed:水泡移動的速度;
  • BubbleDensity:水泡的密度,其值越大水泡越小且越密集;
  • BubbleFilter1:水泡過濾引數,其值越大,水泡越稀疏;
  • BubbleFilter2:水泡過濾引數,其值越大,水泡越稀疏;
  • BubbleBrightness:水泡亮度;
  • WaterDepth:水面到水底的深度,用於過濾氣泡,只有淺水區才有氣泡。

6)WaterNormal 子圖

​ WaterNormal.shadersubgraph

​ 說明:WaterNormal 子圖用於計算水面法線,NormalStrength、WaterDepth 的釋義如下。

  • 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節點

2.3 執行效果

​ 宣告:本文轉自【Unity3D】水面特效