URP下编写RenderFeature详解
Thepoly原创 39676 2
实名

通过了实名认证的内容创造者

发布于 2023-5-5 00:31:08

您需要 登录 才可以下载或查看,没有账号?注册

x


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

1  效果预览


db00f4e8c0da5c331f33f6d566bf37ce.png



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

0e6b6e18e094198067e8e1749c7e28f0.png



3  RenderFeature模板详解

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


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




4  RenderFeature编写逻辑
如果带后处理组件,则可分为三大块:
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 -


评分

参与人数 3元素币 +26 活跃度 +6 展开 理由
AirLee-Wei + 7 + 3 精彩的分享
John-s117 + 9 + 1 必须收藏
lanling + 10 + 2 从业不识微元素,做遍项目不算数。

查看全部评分

还没有设置签名!您可以在此展示你的链接,或者个人主页!
使用道具 <
qq_萝卜_v7e  发表于 2023-5-9 11:47:14  
2#
回复 收起回复
使用道具
qq_欣欣_wUj  发表于 2023-10-13 09:59:08  
3#
回复 收起回复
使用道具
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表