微信小程序開發(fā)網(wǎng)站谷歌瀏覽器官方app下載
1 前言
? ? ? ? 水波特效?中通過屏幕后處理實(shí)現(xiàn)了環(huán)形水波效果,本文通過 Shader Graph 實(shí)現(xiàn)了模擬水面特效,包含以下特效細(xì)節(jié)。
- 深水區(qū)和淺水區(qū)顏色差異;
- 水面有波紋,并且在移動(dòng);
- 水面起伏波動(dòng);
- 水面邊緣有水泡;
- 水中物體因折射而扭動(dòng)。
? ? ? ? 本文完整資源詳見→Unity3D水面特效。
2 水面特效實(shí)現(xiàn)
????????由于本文需要使用 Scene Color 節(jié)點(diǎn)的顏色緩沖區(qū)信息模擬水面折射現(xiàn)象,而 Scene Color 節(jié)點(diǎn)只能在 URP 或 HDRP 管線下才能正常工作(詳見→Shader Graph節(jié)點(diǎn)),因此本文選擇在 URP 管線下實(shí)現(xiàn)模擬水面特效。
2.1?場(chǎng)景搭建及環(huán)境配置
????????1)場(chǎng)景搭建
????????在 URP 項(xiàng)目中搭建場(chǎng)景如下。
????????說明:水面模型是一個(gè)長(zhǎng)方形,并且網(wǎng)格不能太稀疏,否則對(duì)頂點(diǎn)的上下波動(dòng)將不太自然。
? ? ? ? 2)配置?Universal Render Pipeline Asset
? ? ? ? 由于實(shí)驗(yàn)中使用了 Scene Depth 和 Scene Color 節(jié)點(diǎn)獲取深度緩沖區(qū)和顏色緩沖區(qū)信息,需要在?Universal Render Pipeline Asset 中勾選 Depth Texture 和 Opaque Texture,如下。
? ? ? ? 3)主圖配置
????????由于水面是透明的,需要在主圖的 Graph Settings 中將 Surface Type 屬性設(shè)置 Transparent,并且取消勾選 Cast Shadows(投射陰影)和 Receive Shadows(接受陰影)如下。
2.2? 水面 Shader Graph
????????1)主圖
????????Water.shadergraph
????????WaterDepth、FinalWaterColor、WaterNormal、WaterPosition 都是自定義節(jié)點(diǎn),釋義如下,Smoothness 用于調(diào)整水面光滑度。
- WaterDepth 節(jié)點(diǎn):水面到水底的深度計(jì)算;
- FinalWaterColor 節(jié)點(diǎn):水面最終的顏色(混合深淺水顏色、泡沫顏色、背景折射顏色);
- WaterNormal 節(jié)點(diǎn):水面法線;
- WaterPosition 節(jié)點(diǎn):水面坐標(biāo)。
????????2)WaterDepth 子圖
????????WaterDepth.shadersubgraph
????????說明:WaterDepth 子圖用于計(jì)算水面深度;Scene Depth 節(jié)點(diǎn)用于獲取不透明物體的深度值(水底深度),Screen Position 節(jié)點(diǎn)輸出的 w 分量是水面的深度,兩者相減就是水面到水底的深度值。SubtractDepth、DepthStrength 釋義如下。
- SubtractDepth:深度減去的參數(shù),其值越大淺水區(qū)越大;
- DepthStrength:深度加強(qiáng)的參數(shù),其值越大淺水區(qū)越小。
? ? ? ? 如果將 Water Depth 子圖的輸出直接連到主圖片元著色器的 Base Color 上,顯示效果如下。從圖中可以看到,Water Depth 節(jié)點(diǎn)能夠較好得識(shí)別物體的邊緣。
????????3)FinalWaterColor 子圖
????????FinalWaterColor.shadersubgraph
? ? ? ? 說明:FinalWarterColor 子圖用于計(jì)算水面最終的顏色(混合深淺水顏色、泡沫顏色、背景折射顏色),WaterColor 節(jié)點(diǎn)用于計(jì)算水面顏色(混合深淺水顏色、泡沫顏色),WaterRefraction 節(jié)點(diǎn)用于計(jì)算背景折射顏色。
? ? ? ? 4)WaterColor 子圖
????????WaterColor.shadersubgraph
? ? ? ? 說明:WaterColor 子圖用于計(jì)算水面顏色(混合深淺水顏色、泡沫顏色),BubbleColor 節(jié)點(diǎn)用于計(jì)算泡沫顏色,ShallowColor、DeepColor、WaterDepth 的釋義如下。
- ShallowColor:淺水區(qū)的顏色;
- DeepColor:深水區(qū)的顏色;
- WaterDepth:水面到水底的深度,用于混合深水區(qū)和淺水區(qū)的顏色。
? ? ? ? 5)BubbleColor 子圖
????????BubbleColor.shadersubgraph
????????說明:BubbleColor 子圖用于計(jì)算泡沫顏色,BubbleSpeed、BubbleDensity、BubbleFilter1、BubbleFilter2、BubbleBrightness、WaterDepth 的釋義如下。
- BubbleSpeed:水泡移動(dòng)的速度;
- BubbleDensity:水泡的密度,其值越大水泡越小且越密集;
- BubbleFilter1:水泡過濾參數(shù),其值越大,水泡越稀疏;
- BubbleFilter2:水泡過濾參數(shù),其值越大,水泡越稀疏;
- BubbleBrightness:水泡亮度;
- WaterDepth:水面到水底的深度,用于過濾氣泡,只有淺水區(qū)才有氣泡。
? ? ? ? 6)WaterNormal 子圖
????????WaterNormal.shadersubgraph
????????說明:WaterNormal 子圖用于計(jì)算水面法線,NormalStrength、WaterDepth 的釋義如下。
- NormalStrength:法線最大強(qiáng)度;
- WaterDepth:水面到水底的深度,用于調(diào)整法線強(qiáng)度,深水區(qū)波紋較深,淺水區(qū)波紋較淺。
? ? ? ? 7)WaterPosition 子圖
????????WaterPosition.shadersubgraph
????????說明:WaterPosition 子圖用于模擬水面起伏效果,通過調(diào)整頂點(diǎn)坐標(biāo)的 y 分量實(shí)現(xiàn),WaveHeight 用于調(diào)整水面起伏的最大高度。由于 WaterPosition 子圖的輸出連在頂點(diǎn)著色器上,而 WaterDepth 是在片元著色器中計(jì)算的,因此不能使用 WaterDepth 對(duì) WaveHeight 進(jìn)行混合(即深水區(qū)水面起伏大,淺水區(qū)水面起伏小)。
? ? ? ? 8)WaterRefraction 子圖
????????WaterRefraction.shadersubgraph
? ? ? ? 說明:WaterRefraction 子圖用于計(jì)算背景折射顏色,RefractionStrength 用于調(diào)整折射偏移強(qiáng)度,Screen Position 節(jié)點(diǎn)用于獲取屏幕頂點(diǎn)的 uv 坐標(biāo),Scene Color 節(jié)點(diǎn)用于獲取顏色緩沖區(qū)紋理(僅在 URP 或 HDRP 管線下才能正常工作),詳見→Shader Graph節(jié)點(diǎn)。