【URP】Unity[后處理(li)]景深DepthOfField
專欄-直達
Unity URP中的(de)(de)(de)景(jing)深(Depth of Field)是一種模(mo)擬(ni)真實(shi)相(xiang)機光(guang)學特(te)性的(de)(de)(de)后處理(li)(li)效果,通過模(mo)糊近處或遠處的(de)(de)(de)物體來突出焦(jiao)點(dian)區域,增強畫面層(ceng)次感和真實(shi)感。其發展經歷了從(cong)Built-in管線的(de)(de)(de)基礎實(shi)現到URP/HDRP的(de)(de)(de)物理(li)(li)化演進過程,早期采用高斯模(mo)糊近似,現代則引入散景(jing)(Bokeh)等(deng)更(geng)接近真實(shi)光(guang)學特(te)性的(de)(de)(de)算法。
核心作用
- ?視覺引導?:突出主體對象,弱化背景干擾
- ?增強真實感?:模擬攝影鏡頭物理特性
- ?藝術表現?:通過散景光斑創造氛圍
實現原理
基于深度(du)緩沖區(qu)計算彌散圈(quan)(Circle of Confusion),通過(guo)多(duo)Pass模(mo)(mo)糊(hu)處理非焦點區(qu)域。URP提(ti)供兩種(zhong)模(mo)(mo)式:
- ?高斯模式?:性能優先,僅支持遠場模糊
- ?散景模式?:質量優先,模擬光圈葉片光學特性
Unity URP中的景深(Depth of Field)效果基于光學(xue)透鏡(jing)的物(wu)理特性模擬,其核心原理是通過計算混淆圈(Circle of Confusion, CoC)來實現虛實分層。
光學基礎原理
-
?透鏡成像特性?:真實相機(ji)中,只有特定距離(焦平面)的(de)物(wu)體能清晰成(cheng)(cheng)像(xiang),其(qi)他距離的(de)物(wu)體會在(zai)傳感器(qi)上形成(cheng)(cheng)彌散圓斑(CoC),其(qi)直(zhi)徑(jing)與光(guang)圈大小成(cheng)(cheng)正比(bi)。URP通過高斯模(mo)糊或散景模(mo)式模(mo)擬這一現象,前者計(ji)算效率高但物(wu)理準(zhun)確(que)性(xing)較低,后者更接(jie)近真實光(guang)學效果。
-
?CoC計算?:每個像素的(de)模糊程(cheng)度取決于其深度值(zhi)與焦點距(ju)離(li)的(de)差值(zhi)。計算公式為:
CoC = |(d_l * f * (z - z_f)) / (z * (f + z_f))|
其中
d_l為光圈直徑,f為焦距,z為物體距離,z_f為對焦平面距離5。URP在Shader中通過深度紋理(_CameraDepthTexture)獲取每個像素的z值。
URP實現流程
-
?預處理階段?:生成包含CoC數據(ju)的紋(wen)理。通過(guo)比較像(xiang)素深度與焦點距離(li),標記需要模(mo)糊(hu)的區域(近(jin)景或遠景)。示例(li)參數包括:
csharp [Range(0.1f, 100f)] public float focusDistance = 10f;// 焦點距離 [Range(0.1f, 10f)] public float focusRange = 3f;// 清晰范圍 [Range(1f, 10f)] public float bokehRadius = 4f;// 散景強度 -
?模糊處理?:根據(ju)CoC數(shu)據(ju)對非焦點(dian)區域進行分層模糊。URP提供兩種方式:
- ?高斯模糊?:使用降采樣+上采樣的多Pass模糊,適合性能敏感場景
- ?散景模糊?:模擬光學透鏡的虛化效果,在高亮區域生成光斑(Bokeh),需額外計算亮度閾值
-
?合成階段?:將模糊后的圖(tu)像與原圖(tu)按CoC權(quan)(quan)重混合(he)。清晰區(qu)域(yu)的權(quan)(quan)重為,模糊區(qu)域(yu)根據CoC半徑插值。
示例代碼邏輯
以下(xia)為簡化版CoC計算Shader代碼片(pian)段:
hlsl
float4 Frag(Attributes input) : SV_Target {
float depth = SampleDepthTexture(_CameraDepthTexture, input.uv);
float linearDepth = Linear01Depth(depth);
float coc = saturate(abs(linearDepth - _FocusDistance) / _FocusRange);
return float4(coc, coc, coc, 1);
}
該(gai)代碼(ma)生成CoC圖,白色(se)表示完(wan)全模(mo)糊,黑(hei)色(se)表示完(wan)全清(qing)晰(xi)。完(wan)整實現(xian)還需結合多(duo)尺度模(mo)糊和(he)色(se)調映(ying)射處理(li)。
性能優化
- ?降采樣?:在Half/Quarter分辨率下計算模糊,減少像素處理量
- ?動態調整?:根據平臺性能切換高斯/散景模式,移動端建議使用高斯模糊
- ?焦點追蹤?:通過射線檢測動態更新
focusDistance,實現自動對焦效果
完整實現流程
-
URP_DepthOfFieldSetup.cs
using UnityEngine; using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class URP_DepthOfFieldSetup : MonoBehaviour { [SerializeField] private VolumeProfile volumeProfile; void Start() { var depthOfField = volumeProfile.Add<DepthOfField>(); depthOfField.mode.value = DepthOfFieldMode.Bokeh; depthOfField.focusDistance.value = 5f; depthOfField.aperture.value = 5.6f; depthOfField.focalLength.value = 50f; } } -
DoF_Shader.shader
Shader "Custom/DoF" { Properties { _MainTex ("Texture", 2D) = "white" {} } SubShader { Pass { // 深度采樣與模糊處理 } } }
參數詳解
| 參數 | 作用 | 典型值 |
|---|---|---|
| Focus Distance | 焦點平面距離 | 3-10m |
| Aperture | 光圈大小(f值) | 1.4-16 |
| Focal Length | 鏡頭焦距(mm) | 35-200mm |
| Blade Count | 光圈葉片數 | 5-9片 |
實際應用案例
- ?角色特寫?:聚焦角色面部,模糊環境
- ?場景過渡?:動態調整焦點實現鏡頭語言
- ?UI突出?:模糊游戲界面背景
性能優化建議
- 移動端使用高斯模式
- 控制Blur Iterations≤3
- 采用DownSample降低分辨率
專欄-直達
(歡迎點贊留言探討,更(geng)多人加入進來能更(geng)加完(wan)善(shan)這個(ge)探索(suo)的過(guo)程(cheng),??)

Unity URP中的景深(Depth of Field)是一種模擬真實相機光學特性的后處理效果,通過模糊近處或遠處的物體來突出焦點區域,增強畫面層次感和真實感。其發展經歷了從Built-in管線的基