【URP】Unity[后處理]色差ChromaticAberration
【從UnityURP開始探索游戲渲染】專欄-直達
色差(Chromatic Aberration)是Unity URP后處理系統中的一種視覺效果,模擬真實相機鏡頭因折射率差異導致不同波長光線無法聚焦在同一點而產生的彩色邊緣現象。(類似抖音Log的顏色分離偏差的效果)
核心功能與用途
?視覺效果?:
- 在圖像高對比度邊緣(如物體輪廓)產生RGB通道分離的彩色條紋,常見紅/藍偏移
?應用場景?:
- 模擬老舊相機、鏡頭缺陷的復古風格
- 表現角色醉酒、中毒等特殊狀態
- 科幻場景中增強高科技設備的光學畸變感
發展歷史
- ?早期實現?:2017年前通過Shader手動分離RGB通道采樣實現基礎效果
- ?URP集成?:2019年隨URP 7.2+版本成為標準后處理效果,基于Volume系統管理
- ?性能優化?:2021年后引入Quality分級控制,支持不同硬件配置
實現原理
色差(Chromatic Aberration)在URP后處理中的底層實現基于RGB通道分離的屏幕空間著色技術,其核心原理是通過對紅、綠、藍三通道進行差異化偏移采樣,模擬光線折射率差異導致的波長分離現象.
物理光學基礎
- 色差效應源于鏡頭對不同波長光線的折射率差異(n(λ)),導致短波長(藍光)比長波長(紅光)產生更大折射角,最終在成像平面形成RGB通道的像素級偏移
URP實現流程
技術實現基于屏幕空間著色,核心步驟:
- 計算像素到屏幕中心的歸一化距離
- 根據距離對R/G/B通道進行不同偏移采樣
- 混合原始像素與偏移采樣結果
?坐標歸一化?
計算當前像素到屏幕中心的UV向量,并歸一化為徑向距離值(0-1范圍):
hlsl
float2 centerUV = (i.uv - 0.5) * 2.0; // 中心坐標系
float radius = length(centerUV); // 徑向距離
?通道偏移計算?
根據距離應用非線性強度曲線,生成各通道偏移向量(紅藍通道反向偏移):
hlsl
float3 offset = radius * _Intensity * float3(
-_SpectralTex.r, // 紅通道左偏
0, // 綠通道不偏移
_SpectralTex.b // 藍通道右偏
);
?多通道采樣混合?
對原始紋理進行三次采樣并加權混合:
hlsl
half4 frag(v2f i) : SV_Target {
half4 r = tex2D(_MainTex, i.uv + offset.rg);
half4 g = tex2D(_MainTex, i.uv);
half4 b = tex2D(_MainTex, i.uv + offset.bg);
return half4(r.r, g.g, b.b, 1.0);
}
關鍵參數控制
| 技術參數 | 作用機制 | 物理對應關系 |
|---|---|---|
_Intensity |
控制色散偏移量大小 | 鏡頭折射率差異程度 |
_SpectralTex |
自定義色散顏色分布 | 鏡頭鍍膜光譜特性 |
radius |
非線性距離衰減系數 | 球面像差修正 |
性能優化策略
-
?質量分級?
- Low:僅水平方向偏移(節省1次采樣)
- High:增加垂直方向偏移(4次采樣+高斯模糊)
-
?邊緣遮罩?
通過深度/法線檢測限制色差作用區域,避免中心物體失真:
hlsl float edgeMask = 1 - saturate(depth * _EdgeThreshold); offset *= edgeMask;
完整實現示例需結合URP的FullScreenPassRendererFeature擴展,具體可參考HDRP的通道分離算法移植方案.
URP完整實現流程 參數詳解
創建Volume對象
GameObject volumeObj = new GameObject("PostProcessVolume");
Volume volume = volumeObj.AddComponent<Volume>();
volume.isGlobal = true;
添加色差覆蓋
ChromaticAberration caEffect = volume.profile.Add<ChromaticAberration>();
caEffect.active = true;
參數配置
caEffect.intensity.overrideState = true;
caEffect.intensity.value = 0.5f; // 強度值0-1
| 參數 | 說明 | 典型值 | 用例 |
|---|---|---|---|
| Intensity | 色散強度 | 0.3-0.8 | 醉酒效果用0.6+ |
| Spectral Lut | 自定義色散顏色紋理 | 空=默認 | 科幻風格用藍紫色系 |
| Quality | 采樣質量等級 | Low/Medium/High | 移動端建議Low |
-
ChromaticController.cs
using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class ChromaticController : MonoBehaviour { [Range(0, 1)] public float intensity; private ChromaticAberration _ca; void Start() { VolumeProfile profile = FindObjectOfType<Volume>().profile; profile.TryGet(out _ca); } void Update() { _ca.intensity.value = intensity; } }
實際應用技巧
?動態控制?:
- 通過腳本在角色受傷時增強強度值
?區域限制?:
- 結合遮罩紋理只對屏幕邊緣應用效果
?性能優化?:
- VR項目中建議關閉或使用Low質量
- 完整項目需確保:
- URP Asset中啟用Post-processing
- 相機添加Volume組件并設置Layer匹配
- 在Window > Package Manager中安裝Post Processing包
【從UnityURP開始探索游戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,??)

色差(Chromatic Aberration)是Unity URP后處理系統中的一種視覺效果,模擬真實相機鏡頭因折射率差異導致不同波長光線無法聚焦在同一點而產生的彩色邊緣現象。(類似抖音Log的顏色
浙公網安備 33010602011771號