URP | 后处理-亮度饱和度对比度

目的
梳理一遍后处理3大模块Shader,Volume,渲染功能脚本.
Volume的使用方法。
ScriptableRenderPass 类 和ScriptableRendererFeature类
Shader
前准备一个Shader,定义3个变量控制亮度 饱和度 对比度
这部分Shader准备完成,
Volume
我们需要把Shader的数据传到Volume组件里,所以我们定义一个类,控制Shader的属性。
新建一个Volume脚本
这个是基础 ,我们需要增加IsActive(),是开启后处理开关。
我们输入要控制的属性
这里默认是1 ,
效果展示

扩展 还有哪些定义变量的方法。
Volume 的所有属性
自定义变量属性方法

渲染脚本类
上面俩部分准备好,我们需要把这两个属性关联起来。
我们新建一个渲染模块,可以在渲染器里调用。
ScriptableRendererFeature
新建一个脚本,继承ScriptableRendererFeature
我们使用ScriptableRendererFeature来实现这一点。ScriptableRendererFeature是URP开放给用户用来扩展自定义渲染功能的入口,我们自己新建类继承它,其结构如下
RenderPass
定义渲染Pass
这个脚本方法主要有3个 Setup,Execute和Render

定义 一个Pass
需要默认带一个Execute方法
创建需要的属性
ColorAdjustment Volume属性参数组件
m_Material 用于后处理的材质,cmd.Blit()方法需要调用的参数
Setup | 初始化
对输入的纹理,材质进行初始化
初始化输入纹理,
初始化输入的材质属性
Execute | 执行
修改Execute方法,在方法中我们通过VolumeManager.instance.stack单例获取Volume框架中所有的堆栈,在从堆栈中获取我们上一补创建的属性参数组件,由于Execute是每帧调用,所有该组件也是实时更新的。
然后我们使用标签名获取一个命令缓冲区,将该命令缓冲区与Execute的参数RenderingData渲染信息一起交给Render方法进行后处理。
在后处理完成后我们调用context.ExecuteCommandBuffer(cmd);方法执行该命令缓冲区,最后释放内存。
这里我们需要调用Render 渲染函数, 我们需要自定义一个渲染方法。
Render
在Render方法中我们获取属性参数组件中的参数,赋值给材质。
前判断组件是否开启,
注意:这里是把Shader的属性和Volume变量关联起来
Renderer Feature 函数
在RendererFeature处理Pass 的属性
设置三个参数,公开属性Shader、私有属性AdditionPostProcessPass对象和材质
我们这里是使用材质计算的,第一个是输入的Shader,在转成材质计算。
Create方法中初始化内容
我们定义的Pass初始化到PostPass,在设置渲染层级
效果

AddRenderPasses 方法
中通过Shader创建材质,然后获取当前渲染结果。
然后在把当前渲染的结果和我们的材质传入 Pass中,渲染结果输出。
前判断Shader是否为空
检测到有Shader创建材质。
获取当前渲染结果
传入Pass处理修改
这里我们获取到输入颜色信息,在获取到材质信息,那就可以执行Pass。
效果完成

使用我们的后处理调整效果

总结
RenderPass 是计算渲染的内容,RenderFeature模块是输入Shader,调用Pass去执行结果。

Shader和Volume组件的属性是在Render 渲染里关联起来的,使用SetFloat方法

这里还有那些设置属性

执行顺序
是前执行RendererFeature模块—调用Create方法初始化—AddRenderPasses方法(每帧执行)
-—调用Pass里Setup方法——调用Pass增加到渲染队列里。
全代码