Unity 6 URP项目:如何将可编写渲染通道迁移至RenderGraph API?
迁移URP可编写渲染通道至RenderGraph API(Unity 6)
Unity 6 URP中ScriptableRenderPass已被标记为弃用,官方要求迁移至RenderGraph API实现自定义渲染逻辑,以下是具体迁移步骤:
1. 替换基类
将原有继承ScriptableRenderPass的自定义渲染通道类,改为继承ScriptableRenderGraphPass(位于UnityEngine.Rendering.Universal命名空间)。
示例代码:
// 旧代码 public class CustomRenderPass : ScriptableRenderPass { ... } // 新代码 public class CustomRenderGraphPass : ScriptableRenderGraphPass { ... }
2. 重写核心方法
移除原有的Execute方法,重写RecordRenderGraph方法,在该方法内通过RenderGraph构建渲染逻辑:
- 通过参数获取
RenderGraph实例与帧上下文数据 - 定义渲染资源的描述与句柄
- 绑定渲染所需的材质、纹理等参数
- 在委托内编写具体绘制命令
核心示例:
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameContext) { // 获取URP相机数据 var cameraData = frameContext.Get<UniversalCameraData>(); if (!cameraData.camera.TryGetComponent<CustomCameraComponent>(out var component)) return; // 定义目标渲染纹理的属性 var textureDesc = new TextureDesc(Vector2.one, true, true) { colorFormat = GraphicsFormat.R16G16B16A16_SFloat, name = "CustomRenderTarget" }; // 创建渲染通道与数据容器 using var builder = renderGraph.AddRenderPass<CustomPassData>("Custom Render Pass", out var passData); var targetTexture = builder.CreateTexture(textureDesc); // 设置资源的读写权限 builder.SetRenderAttachment(targetTexture, 0); builder.ReadTexture(cameraData.cameraColorTargetHandle); // 传递参数至通道数据类 passData.customMaterial = component.renderMaterial; passData.sourceTexture = cameraData.cameraColorTargetHandle; passData.targetTexture = targetTexture; // 记录绘制逻辑 builder.SetRenderFunc((CustomPassData data, RenderGraphContext ctx) => { CoreUtils.SetRenderTarget(ctx.cmd, data.targetTexture, ClearFlag.None); data.customMaterial.SetTexture("_SourceTex", data.sourceTexture); ctx.cmd.DrawProcedural(Matrix4x4.identity, data.customMaterial, 0, MeshTopology.Triangles, 3); }); } // 自定义通道数据类,用于传递渲染参数 private class CustomPassData { public Material customMaterial; public TextureHandle sourceTexture; public TextureHandle targetTexture; }
3. 更新渲染通道注册逻辑
在ScriptableRendererFeature中,将原有的ScriptableRenderPass注册逻辑替换为ScriptableRenderGraphPass:
public class CustomRenderFeature : ScriptableRendererFeature { private CustomRenderGraphPass _customPass; public override void Create() { _customPass = new CustomRenderGraphPass(); // 保持原有渲染时机设置,例如AfterRenderingSkybox _customPass.renderPassEvent = RenderPassEvent.AfterRenderingSkybox; } public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { renderer.EnqueuePass(_customPass); } }
4. 清理旧代码
- 删除原
ScriptableRenderPass中的Configure、FrameCleanup等废弃方法 - 移除手动创建的
CommandBuffer实例(RenderGraph会自动管理命令缓冲区) - 将原
RenderTargetHandle替换为RenderGraph的TextureHandle
关键注意事项
- RenderGraph采用延迟记录机制,所有绘制命令必须写在
SetRenderFunc的委托内,不可直接在RecordRenderGraph中调用CommandBuffer方法 - 渲染资源(纹理、缓冲区)需通过RenderGraph创建和管理,禁止手动创建或释放
- 可通过
Window > Analysis > Render Graph Visualizer查看渲染通道的执行流程,便于调试
内容的提问来源于stack exchange,提问作者Coder 2013
相关产品推荐
相关产品推荐

