You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:30:03