【從UnityURP開始探索遊戲渲染】專欄-直達
暈影(Vignette)是Unity URP後處理中的一種視覺效果,主要用於模擬攝影中圖像邊緣變暗或去飽和的現象。它通過將觀眾注意力引導至畫面中心來增強視覺焦點,常見於電影、遊戲等場景中。
發展歷史
暈影效果最初源自攝影技術,後逐漸被引入數字圖像處理領域。在Unity中,早期版本通過標準資源包實現,隨着URP/HDRP管線的推出,該效果被整合到Volume框架中,成為模塊化後處理系統的一部分。
實現原理
暈影通過計算像素與屏幕中心的距離,應用衰減函數產生邊緣暗化效果。URP提供兩種實現模式:
- 程序化模式:通過數學函數生成圓形/橢圓形暈影
- 蒙版模式:使用紋理貼圖定義自定義形狀
暈影(Vignette)在Unity URP中的底層實現基於屏幕空間距離計算和顏色混合算法.
數學計算模型
- 距離衰減函數:通過計算像素座標與屏幕中心(0.5,0.5)的歐氏距離,使用
length(abs(uv - center))生成徑向梯度 - 平滑度控制:對原始距離值應用
pow(saturate(dist), smoothness)運算,通過指數函數調整邊緣過渡曲線 - 反向映射:最終通過
1 - dist * dist將黑白關係反轉,使中心區域保持明亮而邊緣變暗
着色器實現
以下為簡化後的HLSL代碼片段:
hlsl
float2 uv = i.uv - _Center;
float dist = length(uv * _Intensity);
float vignette = pow(saturate(1 - dist * dist), _Smoothness);
return inputColor * vignette;
該算法在URP的PostProcessPass.cs中通過全屏繪製命令執行,每個像素都會經過此計算流程
模式差異
- 程序化模式:實時計算圓形/橢圓形遮罩,性能開銷約0.3ms(1080p分辨率)
- 蒙版模式:採樣外部紋理作為遮罩,支持任意形狀但增加內存帶寬消耗
-
Vignette.shader
Shader "Hidden/URP/Vignette" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _VignetteColor ("Vignette Color", Color) = (0,0,0,1) _VignetteCenter ("Center", Vector) = (0.5, 0.5, 0, 0) _VignetteIntensity ("Intensity", Float) = 1.0 _VignetteSmoothness ("Smoothness", Range(0,1)) = 0.5 } SubShader { Pass { HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" TEXTURE2D(_MainTex); float4 _VignetteColor; float2 _VignetteCenter; float _VignetteIntensity; float _VignetteSmoothness; float4 Frag(Varyings input) : SV_Target { float4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv); float2 uv = input.uv - _VignetteCenter; float dist = length(uv * _VignetteIntensity); float vignette = pow(saturate(1 - dist * dist), _VignetteSmoothness); return lerp(_VignetteColor, color, vignette); } ENDHLSL } } }
該實現包含顏色混合、中心點偏移和動態平滑度控制,通過lerp函數實現顏色插值
完整實現流程
創建全局Volume
在Hierarchy右鍵 Create > Volume > Global Volume
添加Vignette效果
選中Volume對象 > Inspector > Add Override > Post-processing > Vignette
配置相機
選中主相機 > Rendering > 啓用Post Processing
參數説明與用例
| 參數 | 類型 | 説明 | 典型用例 |
|---|---|---|---|
| Mode | 枚舉 | 選擇程序化/蒙版模式 | 程序化適合常規聚焦,蒙版用於藝術化效果 |
| Color | 顏色 | 暈影顏色(默認黑色) | 使用深藍色模擬夜景 |
| Center | Vector2 | 效果中心點(0.5,0.5為屏幕中心) | 偏移中心模擬傾斜鏡頭效果 |
| Intensity | 0-1 | 暗化強度 | 0.3-0.5輕度引導視線,0.8+強烈戲劇效果 |
| Smoothness | 0-1 | 邊緣過渡平滑度 | 0.2-0.5自然過渡,0.8+硬邊緣 |
| Roundness | 0-1 | 形狀圓度 | 1.0完美圓形,0.5適應屏幕比例 |
| Mask | 紋理 | 自定義蒙版紋理 | 使用星形蒙版創造特殊邊框 |
藝術化應用案例
- 恐怖遊戲:高強度(0.7)黑色暈影配合低平滑度(0.1),營造隧道視野效果
- 復古風格:棕色暈影+膠片顆粒,模擬老電影質感
- UI聚焦:短暫增強暈影引導玩家注意關鍵UI元素
【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)