【從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開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)