unity学习之可编程渲染管线 SRP Batcher

本文介绍了Unity的可编程渲染管线SRP Batcher的工作原理,强调了其在CPU渲染速度上的提升。内容包括如何在URP中启用SRP Batcher,Shader的兼容性条件,以及通过帧调试器和SRP BatcherProfiler.cs进行性能分析的方法。通过案例展示了关闭和开启SRP Batcher对DrawCall的影响,揭示了SRP Batcher如何提高渲染效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基本概念

SRP Batcher 是一个渲染循环,可通过许多使用同一着色器变体的材质来加快场景中的 CPU 渲染速度。(可以理解为合批处理),如标题所讲要使用SRP Batcher项目必须使用可编程渲染管线。可以是URP(通用渲染管线)/HDRP(高清渲染管线)/SRP(自定义)。

本文主要讲述在URP中使用SRP Batcher,在创建好URP工程之后(如何新建URP工程不是本文重点这里不在赘述),需要在对应的UniversalRenderPipelineAsset的Inspector窗口,找到Advance勾选SRP Batcher,当然默认也是勾选的。也可以在代码中动态修改

GraphicsSettings.useScriptableRenderPipelineBatching = true;

SRP Batcher 的工作原理

Unity 中,可以在一帧内的任何时间修改任何材质的属性。但是,这种做法有一些缺点。例如,DrawCall 使用新材质时,要执行许多作业。因此,场景中的材质越多,Unity 必须用于设置 GPU 数据的 CPU 也越多。解决此问题的传统方法是减少 DrawCall 的数量以优化 CPU 渲染成本,因为 Unity 在发出 DrawCall 之前必须进行很多设置。实际的 CPU 成本便来自该设置,而不是来自 GPU DrawCall 本身(DrawCall 只是 Unity 需要推送到 GPU 命令缓冲区的少量字节)。

SRP Batcher 通过批处理一系列 Bind 和 Draw GPU 命令来减少 DrawCall 之间的 GPU 设置。

### Unity 可编程渲染管线概述 Unity可编程渲染管线(Scriptable Render Pipeline, SRP)允许开发者自定义游戏或应用的图形渲染过程。这种灵活性使得开发人员能够针对特定硬件优化性能,或是实现独特的视觉效果。 #### 自定义渲染管线的基础结构 为了构建一个自定义渲染管线,通常需要继承两个核心类:`RenderPipeline` 和 `RenderPipelineAsset`[^1]。前者负责实际的渲染逻辑执行;后者作为资源文件存在,便于管理和序列化配置参数。 ```csharp using UnityEngine; using UnityEngine.Rendering; public class CustomRenderPipeline : RenderPipeline { // 实现具体的渲染方法... } [System.Serializable] public class CustomRenderPipelineAsset : RenderPipelineAsset { protected override RenderPipeline CreatePipeline() { return new CustomRenderPipeline(); } } ``` #### 创建自定义渲染器 除了上述基础组件外,还需要定义一个新的渲染器来处理场景中的对象渲染工作。这可以通过派生自 `ScriptableRenderer` 类完成,并重写其中的关键函数以定制渲染行为[^2]: ```csharp using UnityEngine; using UnityEngine.Rendering; public class CustomScriptableRenderer : ScriptableRenderer { public CustomScriptableRenderer(RenderPipelineAsset asset) : base(asset) {} protected override void Render(ScriptableRenderContext context, Camera[] cameras) { foreach (var cam in cameras) { var sortingSettings = new SortingSettings(cam); var drawingSettings = new DrawingSettings(new ShaderTagId("CustomLit"), sortingSettings); var filteringSettings = FilteringSettings.defaultValue; context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings); } } } ``` #### 配置与管理SRP Asset SRP Asset本质上是一个 `ScriptableObject` ,这意味着它可以像其他任何脚本对象一样被编辑、保存并纳入版本控制系统之中。一旦创建好这些资产,在项目的图形设置中指定它们之后,Unity 将自动加载相应的渲染管线实例来进行渲染操作[^3]。 #### 扩展功能——几何着色器的应用 对于更复杂的图形特效来说,利用几何着色器可以在GPU上实时地对几何形状进行变换和增强。例如,生成额外的图元用于模拟毛发或其他细丝状物体的效果。这类高级特性极大地提升了画面的真实感和技术含量[^4]。 ```csharp // 假设这是在一个ShaderLab HLSL片段内的部分代码, // 展示了几何着色器如何接收输入顶点并将它们转换为新的图元。 [maxvertexcount(3)] void geom(point float4 IN[1] : POSITION, inout TriangleStream<float4> triStream) { [unroll] for(int i=0;i<3;++i){ float angle = radians(i * 120); // 每次旋转120度角 float4 newPos = mul(float4(IN[0].xyz + sin(angle)*float3(0.5,0,-0.5),1), unity_ObjectToWorld); triStream.Append(newPos); } triStream.RestartStrip(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值