【URP】Unity[后处理]色彩偏移,中间调,高光增强-Lift,Gamma,Gain

【从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)会使阴影偏蓝且降低暗部密度
  • Gamma
    • 原理:对中间调(0.18<RGB值<0.8)应用幂函数output = pow(input, 1/gammaValue),gammaValue通过滑块与轨迹球颜色混合计算
    • 示例:gamma设为(0.9, 1.1, 1.0)会使红色通道更亮、绿色更暗
  • Gain
    • 原理:对高光(RGB值>0.8)进行线性增强output = input * gainColor,gainColor包含轨迹球色相和滑块明度
    • 示例:gain设为(1.2, 1.0, 0.8)会创建暖色高光效果

实现流程示例

  • 通过Volume系统访问LiftGammaGain覆盖层

  • 使用Vector4传递参数(RGB分量+Alpha保留)

  • 实时修改参数会立即影响渲染管线

  • LiftGammaGainExample.cs

    csharp 复制代码
    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 复制代码
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 RPPost 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开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)