【从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
csharpusing 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
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
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开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)