【從UnityURP開始探索遊戲渲染】專欄-直達
Lift、Gamma和Gain是Unity URP後處理系統中基於ASC CDL(美國電影攝影師協會色彩決策列表)標準的色彩分級工具,用於分別控制暗調、中間調和高光的色彩偏移與明度調整。以下是詳細解析:
核心功能與參數含義
Lift
- 作用:控制暗調區域(Dark Tones)的色彩偏移和明度
-
參數:
- 軌跡球:選擇暗調色調偏移目標顏色
- 滑塊:調整軌跡球顏色的明度值
- 用例:增強陰影的冷色調(如電影感藍色陰影)
Gamma
- 作用:通過冪函數調整中間調(Mid-range Tones)
-
參數:
- 軌跡球:選擇中間調色調偏移目標顏色
- 滑塊:控制中間調明度
- 用例:修正膚色偏黃問題
Gain
- 作用:增強高光(Highlights)信號強度
-
參數:
- 軌跡球:選擇高光色調偏移目標顏色
- 滑塊:調整高光明度
- 用例:模擬陽光照射的暖色高光
發展歷史與技術背景
該技術源自電影工業的ASC CDL標準,用於跨平台色彩分級一致性。Unity HDRP/URP通過Volume系統將其引入實時渲染,替代了傳統分離色調(Split Toning)的非標準化操作。Gamma校正則源於CRT顯示器的非線性響應曲線(gamma≈2.2),現代渲染管線通過線性工作流(Linear Space)避免計算失真。
原理
Lift、Gamma和Gain是Unity URP後處理中基於ASC CDL標準的色彩分級工具,其底層原理涉及色彩空間轉換與影調分離控制:
底層原理
-
Lift
- 原理:通過向量乘法調整暗調區域(RGB值<0.18),公式為
output = input + (liftColor * (1 - input)),其中liftColor為軌跡球選擇的HDR顏色 - 示例:設置lift為(0.1, 0, -0.05)會使陰影偏藍且降低暗部密度
- 原理:通過向量乘法調整暗調區域(RGB值<0.18),公式為
-
Gamma
- 原理:對中間調(0.18<RGB值<0.8)應用冪函數
output = pow(input, 1/gammaValue),gammaValue通過滑塊與軌跡球顏色混合計算 - 示例:gamma設為(0.9, 1.1, 1.0)會使紅色通道更亮、綠色更暗
- 原理:對中間調(0.18<RGB值<0.8)應用冪函數
-
Gain
- 原理:對高光(RGB值>0.8)進行線性增強
output = input * gainColor,gainColor包含軌跡球色相和滑塊明度 - 示例:gain設為(1.2, 1.0, 0.8)會創建暖色高光效果
- 原理:對高光(RGB值>0.8)進行線性增強
實現流程示例
- 通過Volume系統訪問LiftGammaGain覆蓋層
- 使用Vector4傳遞參數(RGB分量+Alpha保留)
- 實時修改參數會立即影響渲染管線
-
LiftGammaGainExample.cs
using UnityEngine.Rendering; using UnityEngine.Rendering.Universal; public class LiftGammaGainController : MonoBehaviour { public VolumeProfile profile; void Update() { if(profile.TryGet(out LiftGammaGain lgg)) { // 動態調整Lift(時間變化的藍色陰影) lgg.lift.value = new Vector4( 0.1f, 0.05f * Mathf.Sin(Time.time), -0.1f, 1f ); // Gamma中間調增強 lgg.gamma.value = new Vector4(1.1f, 1.1f, 1.1f, 1f); // 高光增益(金色高光) lgg.gain.value = new Vector4(1.5f, 1.3f, 0.8f, 1f); } } }
技術細節
- 色彩空間:所有計算在線性空間(Linear Color Space)執行,需在Player Settings中啓用
- 性能優化:每個參數的軌跡球計算在Shader中通過
mix()函數插值實現,避免分支判斷 - 混合模式:與Color Grading其他效果(如Tonemapping)按URP渲染順序疊加處理
典型應用場景
- 電影感調色:Lift(-0.1,0,0.1)冷陰影 + Gamma中性 + Gain(1.3,1.2,1.0)暖高光
- 風格化渲染:Gamma(0.8,0.8,1.5)增強藍色中間調,配合高對比度Lift/Gain
- 晝夜轉換:通過腳本動態插值Lift值實現陰影色調隨時間變化
URP實現流程
基礎配置
- 啓用URP管線的Post Processing功能
- 攝像機勾選
Rendering > Post Processing選項
Volume系統設置
csharp
// 創建Global Volume並添加Lift Gamma Gain覆蓋
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
public class SetupPostProcessing : MonoBehaviour {
void Start() {
var volume = gameObject.AddComponent<Volume>();
volume.profile = ScriptableObject.CreateInstance<VolumeProfile>();
volume.profile.Add<LiftGammaGain>(true);
}
}
參數動態控制示例
csharp
// 運行時調整Gain參數
VolumeProfile profile = GetComponent<Volume>().profile;
if(profile.TryGet(out LiftGammaGain lgg)) {
lgg.gain.value = new Vector4(1.2f, 1.1f, 0.9f, 1f);// RGB增益
}
完整示例項目配置
場景搭建
- 創建URP項目(2021.3+版本)
- 安裝
Universal RP和Post Processing包
Volume配置步驟
- Hierarchy右鍵 > Volume > Global Volume
- Inspector中點擊
Add Override>Color Adjustments>Lift Gamma Gain
參數聯動案例
- 電影化調色:Lift偏藍(-0.1, -0.05, 0.1),Gamma中性(0,0,0),Gain偏橙(0.1, 0.05, -0.05)
- 風格化場景:提升Gain亮度(1.5,1.5,1.5)增強卡通感
技術注意事項
- 線性空間(Linear Color Space)下效果更準確,需在
Project Settings > Player > Other Settings中設置 - 與
Shadow/Midtones/Highlights效果類似,但Lift Gamma Gain遵循工業標準,調色更可控
通過軌跡球和滑塊的組合控制,開發者可實現從自然色彩校正到藝術化風格渲染的全流程控制
【從UnityURP開始探索遊戲渲染】專欄-直達
(歡迎點贊留言探討,更多人加入進來能更加完善這個探索的過程,🙏)