GameTech/URP 渲染实战
源码 / Ch26/SaturationVolume.cs
Ch26/SaturationVolume.cs
// 案例 26.1:第一个自定义 Volume 组件——饱和度 / 对比度。
using System;
using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

namespace Cookbook.Ch26
{
    // VolumeComponentMenuForRenderPipeline:出现在 Volume 的 Add Override 菜单里,并且只对 URP 显示
    [Serializable, VolumeComponentMenuForRenderPipeline("Cookbook/Saturation", typeof(UniversalRenderPipeline))]
    public sealed class SaturationVolume : VolumeComponent, IPostProcessComponent
    {
        // 默认值要等于“无效果”的值:没有任何 Volume 覆盖时,栈里拿到的就是默认值
        [Tooltip("0 = 灰度,1 = 原图,>1 = 更鲜艳")]
        public ClampedFloatParameter saturation = new ClampedFloatParameter(1f, 0f, 2f);

        [Tooltip("围绕中灰 0.18(线性)缩放的对比度")]
        public ClampedFloatParameter contrast = new ClampedFloatParameter(1f, 0f, 2f);

        // 由 Feature 调用:没有效果时整个 Pass 都不入队,零开销
        public bool IsActive() => saturation.value != 1f || contrast.value != 1f;

        // 接口要求实现;URP 14 源码里并没有调用它,返回 false 即可
        public bool IsTileCompatible() => false;
    }
}