欢迎光临散文网 会员登陆 & 注册

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

2022-08-26 21:22 作者:那个人真狗  | 我要投稿


目的

  • 梳理一遍后处理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

            Execute 每帧会调用一次,
  • 定义 一个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增加到渲染队列里。

全代码



URP | 后处理-亮度饱和度对比度的评论 (共 条)

分享到微博请遵守国家法律