博客 / 詳情

返回

【URP】Unity[後處理]色彩調整ColorAdjustments

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

Unity URP中的Color Adjustments後處理效果用於調整最終渲染圖像的整體色調、亮度和對比度,是優化視覺表現的核心工具。其發展歷史可追溯至Unity 4.X時代的色彩校正曲線和3D查找紋理技術,早期通過手動調節RGB通道曲線實現基礎調色功能,而在URP中已整合為標準化體積框架下的模塊化組件。

底層原理

Unity URP中的Color Adjustments後處理效果基於渲染管線中的片段着色器操作,其核心原理是通過線性空間下的數學變換調整像素顏色值。該效果在色調映射階段前執行,作用於HDR顏色緩衝區的數據

  • 曝光調整‌:通過pow(2, postExposure)對RGB通道進行指數級亮度縮放,模擬相機曝光補償機制。計算過程發生在線性顏色空間,避免伽馬校正干擾。
  • 對比度計算‌:採用中間灰值(0.5)作為基準點,使用saturate((color.rgb - 0.5) * contrast + 0.5)公式擴展或壓縮動態範圍,其中saturate確保結果在[0,1]範圍內。
  • 色調/飽和度‌:將RGB轉換到HSV色彩空間,調整H分量實現色相旋轉,S分量控制顏色純度,最後轉回RGB空間.

實現示例

以下為URP內置着色器中顏色調整的核心代碼邏輯:

  • 曝光計算‌:採用2的冪次方實現物理正確的曝光模擬
  • HSV轉換‌:通過幾何插值法避免三角函數運算提升性能
  • 動態範圍保護‌:使用step()saturate()防止數值溢出
  • ColorAdjustment.hlsl

    // 線性空間下的顏色處理函數
    half3 ApplyColorAdjustments(half3 color, float postExposure, float contrast, float hueShift, float saturation)
    {
        // 曝光調整
        color *= exp2(postExposure);
    
        // 對比度計算
        color = (color - 0.5h) * contrast + 0.5h;
    
        // RGB轉HSV
        half4 k = half4(0.0, -1.0/3.0, 2.0/3.0, -1.0);
        half4 p = lerp(half4(color.bg, k.wz), half4(color.gb, k.xy), step(color.b, color.g));
        half4 q = lerp(half4(p.xyw, color.r), half4(color.r, p.yzx), step(p.x, color.r));
        float d = q.x - min(q.w, q.y);
        float e = 1.0e-10;
        half3 hsv = half3(abs(q.z + (q.w - q.y)/(6.0 * d + e)), d/(q.x + e), q.x);
    
        // 色相/飽和度調整
        hsv.x += hueShift;
        hsv.y *= saturation;
    
        // HSV轉RGB
        return HsvToRgb(hsv);
    }

該效果在URP渲染流程中通過Volume系統注入參數,最終由FinalPost.shader在渲染目標上執行全屏繪製。色彩調整的運算順序遵循:曝光→對比度→色調/飽和度→顏色濾鏡,確保各階段調整互不干擾.

核心參數與功能

  • Post Exposure‌:以EV單位調整場景整體曝光度,作用於HDR效果後、色調映射前,不影響處理鏈中其他效果。
  • Contrast‌:擴展(正值)或收縮(負值)色調範圍,增強視覺層次感。
  • Color Filter‌:通過顏色選擇器對渲染結果進行乘法着色,實現整體色調偏移。
  • Hue Shift‌:全局調整所有顏色的色相值,常用於風格化渲染。
  • Saturation‌:控制顏色強度,負值可生成灰度圖像。

實現流程示例

創建後處理體積

  • 添加空GameObject並掛載Volume組件
  • 新建配置文件(如ColorProfile),通過Add Override > Post-processing添加Color Adjustments效果

相機配置

  • 啓用相機的Post Processing選項
  • Volume Mask中匹配後處理體積的圖層(如PostProcessLayer1

參數調試

  • 調整Contrast至1.2增強場景對比度
  • 設置Color Filter為淺藍色實現冷色調風格化

實際應用案例

  • 恐怖遊戲‌:降低飽和度至-30並微調色相,營造壓抑氛圍
  • 開放世界‌:動態調整曝光度模擬晝夜光照變化

以下為完整URP實現代碼示例:

  • 腳本掛載至含Volume組件的對象
  • 通過Inspector動態修改參數值
  • 支持運行時效果切換
  • ColorAdjustmentSetup.cs

    using UnityEngine;
    using UnityEngine.Rendering;
    using UnityEngine.Rendering.Universal;
    
    public class ColorAdjustmentSetup : MonoBehaviour
    {
        [SerializeField] private VolumeProfile profile;
        [SerializeField] private float contrast = 1.2f;
        [SerializeField] private Color colorFilter = new Color(0.8f, 0.9f, 1f);
    
        void Start()
        {
            if (profile.TryGet(out ColorAdjustments adjustments))
            {
                adjustments.contrast.value = contrast;
                adjustments.colorFilter.value = colorFilter;
            }
        }
    }

該技術通過分離渲染管線與美術控制,實現了非破壞性工作流,成為現代遊戲開發的標準實踐


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

發佈 評論

Some HTML is okay.