博客 / 詳情

返回

【URP】Unity[後處理]鏡頭畸變LensDistortion

【從UnityURP開始探索遊戲渲染】專欄-直達

Lens Distortion 效果概述

Lens Distortion 是 Unity URP 後處理系統中的核心組件之一,用於模擬真實相機鏡頭的光學畸變現象。這種效果通過扭曲渲染畫面邊緣,能夠創造出桶形畸變(Barrel Distortion)或枕形畸變(Pincushion Distortion)等視覺效果,廣泛應用於電影感營造、科幻風格渲染或特殊 UI 反饋場景。

發展歷史

  • 早期版本‌:Unity 內置渲染管線中,Lens Distortion 作為 Post-processing Stack 的獨立組件存在,需手動掛載到攝像機。
  • URP 整合‌:2019 年後,Unity 將後處理系統重構為 Volume 框架,Lens Distortion 成為 URP/HDRP 的標準後處理效果,通過 Volume Profile 配置。
  • 功能擴展‌:URP 版本增加了軸向獨立控制(X/Y Multiplier)和中心點偏移(Center)功能,支持更精細的藝術化調整。

原理

Lens Distortion 在 URP 中的實現基於‌UV座標變換算法‌,核心是通過數學函數對屏幕空間UV座標進行非線性偏移。

畸變數學模型

採用多項式畸變模型(Brown-Conrady模型簡化版),通過以下公式計算UV偏移量:

offset = (r² Intensity) + (r⁴ 高階項)

其中r為像素到屏幕中心的距離,Intensity控制畸變曲率。URP 通過Shader中的pow函數實現該計算,X/Y Multiplier 分別控制水平/垂直方向的權重。

渲染管線集成

在URP的Post-processing Stack中,畸變效果通過FullScreenPassRendererFeature實現。具體流程為:

  • 攝像機渲染完成後,將顏色緩衝區傳入後處理Shader
  • Shader對每個像素應用畸變公式,採樣原始紋理時使用偏移後的UV座標
  • 通過Scale參數裁剪邊緣無效區域,防止採樣越界。

GPU優化策略

URP 使用單通道(Single-Pass)計算,將畸變與色差(Chromatic Aberration)合併處理以減少採樣次數。中心點偏移(Center)通過修改r的計算基準實現,避免額外分支指令。

完整實現示例

關鍵實現點:

  • DistortUV函數實現桶形/枕形畸變的核心算法,通過距離平方控制變形強度
  • _Center參數允許動態調整畸變中心點,用於特殊構圖需求
  • _Scale參數補償邊緣撕裂,通過全局縮放隱藏無效採樣區域
  • LensDistortion.shader

    Shader "Hidden/Universal Render Pipeline/LensDistortion"
    {
        HLSLINCLUDE
        // 畸變計算函數
        float2 DistortUV(float2 uv, float intensity, float2 center, float scale) 
        {
            float2 dir = uv - center;
            float r2 = dot(dir, dir); // 距離平方
            float distortion = 1.0 + r2 * intensity;
            return center + dir * distortion * scale;
        }
    
        // 主片段着色器
        half4 Frag(Varyings input) : SV_Target
        {
            float2 distortedUV = DistortUV(input.uv, _Intensity, _Center, _Scale);
            return SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, distortedUV);
        }
        ENDHLSL
    }

實際應用場景

  • VR鏡頭校正

    通過負值Intensity(-0.15~-0.3)和精確的X/Y Multiplier調整,補償VR頭顯的光學畸變。

  • 電影化風格

    組合使用Intensity=0.2與色差效果,模擬老式鏡頭的視覺缺陷。

  • 動態衝擊波

    運行時動態修改Intensity從0到-0.5再歸零,創造爆炸衝擊波的畫面扭曲效果

參數詳解與用例

參數 含義 典型用例
Intensity 畸變總強度(負值為桶形畸變,正值為枕形畸變) -0.3 模擬廣角鏡頭,+0.2 營造電影質感12
X/Y Multiplier 分別控制水平/垂直軸向的畸變強度(0 為禁用該軸) X=1/Y=0.5 實現水平拉伸的魚眼效果2
Center 畸變中心點座標(0-1 範圍) (0.5, 0.6) 模擬仰拍鏡頭的透視畸變26
Scale 全局畫面縮放補償畸變邊緣撕裂 高強度畸變時設為 0.8-0.9 保持畫面完整14

URP 實現流程示例

環境準備

  • 創建URP項目,安裝"Universal RP"和"Post Processing"包
  • 在URP Asset中啓用Post-Processing

Volume配置

  • 場景中創建空對象,添加Volume組件
  • 新建Volume Profile,點擊Add Override > Post-processing > Lens Distortion
  • 調整參數如:Intensity=-0.4, Scale=0.85

攝像機設置

  • 主攝像機添加Volume組件並關聯相同Profile
  • 啓用Post Processing選項

實際應用場景

  • 科幻界面‌:配合高負值Intensity(-0.8)和色差效果,創造全息投影的扭曲感
  • 鏡頭轉場‌:動態調整Intensity從0到-0.5,模擬鏡頭衝擊效果
  • VR適配‌:通過微調X/Y Multiplier補償頭顯光學畸變(需自定義Shader實現)
‌性能提示‌:移動端建議保持Intensity絕對值≤0.3,避免過度消耗GPU資源

【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.