Thepoly 发表于 2023-5-5 00:31:08

URP下编写RenderFeature详解



Hello . 大家好
今天分享URP下如何编写RenderFeature

1效果预览






2创建RenderFeature
如下图所示,在Assets面板下右键Create—Rendering—URP Renderer Feature,即可创建默认的一个自定义RenderFeature





3RenderFeature模板详解

可以看到,默认创建的RenderFeature脚本主要由以下几个构成:
   继承自ScriptableRendererFeature的MyCustomRenderFeature类


    继承自ScriptableRenderPass的CustomRenderPass类
      重写的Create()方法
      重写的AddRenderPasses()方法




4RenderFeature编写逻辑
如果带后处理组件,则可分为三大块:
VolumeComponent模块 —— 定义后处理参数
ScriptableRendererFeature模块 —— 设置Shader以及大体的渲染逻辑
ScriptableRenderPass模块 —— 后处理的主要模块设置

VolumeComponent模块
该模块主要是用于定义Volume面板的参数
直接新建一个类,继承自VolumeComponent类,然后对需要暴露在Volume面板上的参数进行设置






本次案例并非直接使用的Volume组件,而是直接定义在RenderFeature面板上的,但是换汤不换药。

ScriptableRendererFeature模块
RendererFeature模块是设置Shader以及大体的渲染逻辑的主要模块
主要进行以下三件事情:




1. 定义设置面板(窗口),用于显示在RendererFeature面板上的内容,这里我定义了一个Range值和Shader以及渲染队列选择。




2. 重写的Create()方法,RenderFeature被创建时调用,定义了名称,对着色器判定,序列化ScriptableRenderPass类,将需要的参数传入ScriptableRenderPass类中,最后指定需要注入的渲染Pass的位置。




3. 重写的AddRenderPasses()方法,该方法每帧都会进行调用,在这里将Pass添加到渲染队列里面,排队执行渲染通道。




ScriptableRenderPass模块
ScriptableRenderPass 可将其称为”最基础的渲染单元“ ,因为URP内部渲染的实现,都是基于继承ScriptableRenderPass来实现渲染的
官方注释: 实现了一个逻辑渲染通道,可以用来扩展通用RP渲染器


从类的执行的层次结构:RenderPipelines -> ScriptableRenderer -> ScriptableRenderPass自上而下的执行,最终执行ScriptableRenderPass类中的每个所谓的”生命周期函数“
(1)从总入口:RenderPipelines类的 Render函数
(2)在Render函数中RenderSingleCamera中执行 ScriptableRenderer中的”生命周期函数“
(3)在ScriptableRenderer中的Execute函数中执行 ScriptableRenderPass中的”生命周期函数“
经过上面三步,就执行完了一个ScriptableRenderPass的生命周期
MyCustomRenderFeature负责把这个 Render Pass 加到 Renderer 里面。Render Feature 可以在渲染管线的某个时间点增加一个 Pass 或者多个 Pass。




首先,ScriptableRenderPass构造函数第一个执行

其次Configure()方法
在执行渲染过程之前,Renderer 将调用此方法。如果需要配置渲染目标及其清除状态,并创建临时渲染目标纹理,那就要重写这个方法,如果渲染过程未重写这个方法,则该渲染过程将渲染到激活状态下 Camera 的渲染目标。
这里我们对RT进行一系列的设置。




然后Execute()方法
执行Pass,这是自定义渲染发生的地方。在这里可以实现渲染逻辑。
Execute()是ScriptableRenderPass类的核心方法,定义我们的执行规则;包含渲染逻辑,设置渲染状态,绘制渲染器或绘制程序网格,调度计算等等。
判定了材质是否存在,传入摄像机的数据和当前使用的Renderer。并且新建一个CommandBuffer,在这里执行,执行完毕后释放。




Blit图片,其他的材质传参以及渲染方法都在此类内
最后是自定义的Render()方法,传入Shader参数,并且申请RT,这里对画面进行两次Blit操作,一次将摄像机的渲染数据传输到RT,再将RT传输回摄像机渲染数据,最后释放。



其实中间还有很多方法要执行,这里就简化成这3个。

Shader代码不做解释,就是一个基本的阈值处理,换做任意后处理效果shader都可以。



- End -


qq_萝卜_v7e 发表于 2023-5-9 11:47:14

{:1_236:}

qq_欣欣_wUj 发表于 2023-10-13 09:59:08

{:1_236:}
页: [1]
查看完整版本: URP下编写RenderFeature详解