Unity6升级SRP到RenderGraph URP17

2024.12 补充提示,BUG和踩坑:

  1. BUG:换场景有的时候Blitter的生命周期会乱掉导致报空错误,解决方案如下
   if (!Application.isPlaying)
   {
       UnityEditor.SceneManagement.EditorSceneManager.sceneOpened += OnEditorSceneChanged;
   }
   
   public void OnEditorSceneChanged(UnityEngine.SceneManagement.Scene scene, UnityEditor.SceneManagement.OpenSceneMode mode)
   {
       Blitter.Cleanup();
       Blitter.Initialize(Shader.Find("Hidden/Universal/CoreBlit"), Shader.Find("Hidden/Universal/CoreBlitColorAndDepth"));
   }
  1. 踩坑:运行时Unity会根据VolumeProfile中的全部VolumeComponent另实例化新的VolumeComponent用于运行,实例化VolumeComponent参数与VolumeProfile中的参数不一致,化分为两个对象后,从VolumeManager.instance.stack获取的是运行时实例化的新组件,从profile.TryGet获取的是原始组件
  2. 踩坑:VolumeComponent自带参数间差值的方法Override(VolumeComponent state, float interpFactor),是对传入的state组件的参数进行覆写,在Override方法外无法对运行时实例化的VolumeComponent的全部VolumeParameter做任何修改

CommandBuffer、Blitter、RTHandle、RenderPass更新
官方文档:

https://docs.unity3d.com/Manual/urp/upgrade-guide-unity-6.html

RenderPass大更新,取消OnCameraSetup和Execute方法,换成了新版api方法RecordRenderGraph。
  • 官方案例:

https://docs.unity3d.com/Manual/urp/renderer-features/create-custom-renderer-feature.html#code-render-pass

  • RTHandle换成了TextureHandle,TextureHandle不需要手动释放。
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
    // 获取临时TextureHandle
	var descriptor = frameData.Get<UniversalCameraData>().cameraTargetDescriptor;
	descriptor.depthBufferBits = 0;
	var tempTex = UniversalRenderer.CreateRenderGraphTexture(renderGraph, descriptor, "_RT_NAME", false);
	// 外部RTHandle转TextureHandle,需要手动释放RTHandles.Alloc创建的RT
	var whiteTex = renderGraph.ImportTexture(RTHandles.Alloc(Texture2D.whiteTexture))
}
  • 获取Camera
frameData.Get<UniversalCameraData>().camera
  • ScriptableRenderer.cameraColorTargetHandle换成了
public override void RecordRenderGraph(RenderGraph renderGraph, ContextContainer frameData)
{
    var colTex = frameData.Get<UniversalResourceData>().activeColorTexture;
}
  • 在RecordRenderGraph方法中使用CommandBuffer
    • 无法直接获取CommandBuffer,需要再套一层RenderGraphBuilder。
    • 泛型为 class PassData {} 就可以
using (var builder = renderGraph.AddRasterRenderPass<PassData>("pass name", out var passData))
{
    builder.AllowPassCulling(false);
    builder.AllowGlobalStateModification(true);
    // 获取屏幕颜色输入
    var src = frameData.Get<UniversalResourceData>().activeColorTexture;
    // 创建输出的目标图片
    var dst = UniversalRenderer.CreateRenderGraphTexture(renderGraph, descriptor, "__DST", false);
    // 设置pass中用到的图片
    builder.UseTexture(src);
    // 在这里设置相当于之前Blit的dst渲染目标
    builder.SetRenderAttachment(dst, 0);
    builder.SetRenderFunc((PassData data, RasterGraphContext context) =>
    {
        RasterCommandBuffer cmd = context.cmd;
        // 拿到cmd后和之前类似,但有些功能缺失,比如DispatchCompute只能在renderGraph.AddComputePass的context中获取
        cmd.SetGlobalTexture("tex_src", src);
        // 相当于之前的Blitter.BlitCameraTexture(cmd, src, dst, material, 0);
        Blitter.BlitTexture(cmd, src, new Vector4(1, 1, 0, 0), material, 0);
    });
}
  • 在RenderGraph中使用ComputeShader
using (var builder = renderGraph.AddComputePass<PassData>("xxx compute", out var passData))
{   
    // 设置pass中用到的图片
    builder.UseTexture(src);
    builder.AllowPassCulling(false);
    builder.AllowGlobalStateModification(true);
    builder.SetRenderFunc<PassData>((data, context) =>
    {
        ComputeCommandBuffer cmd = context.cmd;
        // set shader props ...
        cmd.DispatchCompute(compute, 0, groupsX, groupsY, groupsZ);
        // cmd.DispatchCompute(compute1, 0, groupsX, groupsY, groupsZ);
		// ...
    });
}
  • 复制TextureHandle到另一个TextureHandle,以及不用builder直接Blit方法
// 复制
renderGraph.AddBlitPass(src, dst, Vector2.one, Vector2.zero);
// 直接Blit
renderGraph.AddBlitPass(new(src, dst, upscaleMaterial, 0));
  • 在renderGraph添加多个pass后不用做其他操作,在RecordRenderGraph方法结束后会按顺序调用全部添加的pass。

知乎大佬写的例子:https://zhuanlan.zhihu.com/p/721313939

<think>好的,我现在需要回答用户关于如何将Unity项目从标准渲染管线迁移到URP(Universal Render Pipeline)的问题。首先,我应该回顾自己之前积累的相关知识,并确保步骤正确。用户提到了引用[1]和[2],不过引用[2]看起来是关于物理模拟和动画的,可能与URP迁移关系不大,所以主要参考引用[1]。不过引用[1]的标题是关于转换到高清渲染管线(HDRP),而用户问的是URP,可能需要确认两者是否有区别。记得HDRP和URP都是可编程渲染管线(SRP)的一部分,但URP更轻量,适合移动端和性能要求高的项目,而HDRP适合高清平台比如PC或主机。因此,迁移步骤可能有相似之处,但具体细节不同。需要明确指导用户到URP而不是HDRP。 首先,用户需要安装URP包。在Unity中,可以通过Package Manager添加URP。然后,创建URP Asset并设置为项目的渲染管线资产。这应该在Project Settings的Graphics和Quality部分设置。接下来,需要将现有材质转换为URP兼容的材质。这一步可能需要使用内置的转换工具,但有时候可能需要手动调整,特别是自定义Shader。此外,可能需要更新光照设置,因为URP的光照系统可能与内置渲染器不同。比如,URP使用新的Light组件设置,可能涉及调整光照强度和类型。 另外,后处理效果(Post-processing)在URP中的实现方式不同,可能需要安装URP兼容的后处理包,并重新配置Volume组件。如果项目使用了Shader,尤其是自定义Shader,需要修改它们以适应URP的Shader框架,比如使用Shader Graph或者编写符合URP要求的HLSL代码。 可能出现的问题包括材质变粉红色(Shader丢失或兼容性问题),光照效果不一致,或者后处理不生效。这时候需要检查材质是否正确转换,Shader是否兼容,以及URP的设置是否正确。 用户可能还关心是否需要备份项目,是的,在迁移前备份整个项目是必要的,因为一旦转换,可能无法轻松回退。此外,测试场景中的每个部分,确保视觉效果符合预期,特别是在移动设备上的性能表现。 现在需要将这些步骤整理成清晰的流程,分点说明,并确保每个步骤准确。同时,根据引用[1],虽然它主要是关于HDRP,但可能部分步骤类似,比如创建渲染管线资产和修改项目设置。但需要明确区分URP和HDRP的不同之处,避免混淆。此外,用户可能需要官方文档或教程链接作为参考,但根据用户提供的引用,引用[1]是关于HDRP的转换,所以可能需要提示用户查阅Unity官方URP文档。 最后,生成相关问题,例如如何处理材质转换错误,URP的性能优化,或如何处理迁移后的光照问题等。</think>### 将Unity项目从标准渲染管线迁移到URP的步骤指南 1. **备份项目** 在开始迁移前,**务必备份整个项目**,以防转换过程中出现不可逆错误。 2. **安装URP包** - 打开Unity Editor,进入 **Window > Package Manager**。 - 在Packages列表中选择 **Unity Registry**,搜索 **Universal RP** 并安装。 - 如果项目使用后处理效果,还需安装 **Universal RP Post-processing** 包[^1]。 3. **创建并配置URP Asset** - 右键Project窗口,选择 **Create > Rendering > Universal Render Pipeline > Pipeline Asset**(可重命名为`URP-HighQuality`等)。 - 进入 **Edit > Project Settings > Graphics**,将 **Scriptable Render Pipeline Settings** 字段指定为新建的URP Asset。 - 在 **Quality Settings** 中,为每个质量等级指定相同的URP Asset。 4. **转换材质和Shader** - 使用Unity内置转换工具:**Edit > Render Pipeline > Universal Render Pipeline > Upgrade Project Materials to UniversalRP Materials**。 - **注意**:自定义Shader需手动调整,改用URP的Shader模板(如`Shader "Universal Render Pipeline/Lit"`)[^1]。 5. **调整光照设置** - URP使用物理光照单位,需重新配置光源强度(如将Directional Light强度从1调整为100,000 Lux左右)。 - 检查光照模式:URP默认使用混合光照模式,需在 **Lighting窗口** 中重新烘焙光照。 6. **更新后处理效果** - 删除原Post-Processing Stack组件。 - 添加URP兼容的 **Volume组件**,并配置后处理配置文件(如Bloom、Color Grading等)。 7. **测试与调试** - 检查材质是否变粉红色(表示Shader丢失),需重新关联URP兼容Shader。 - 验证粒子系统、UI组件等视觉效果是否正常。 ```csharp // 示例:URP中自定义Shader的基础结构 Shader "Universal Render Pipeline/Custom/Example" { Properties { /* 属性声明 */ } SubShader { Tags { "RenderType"="Opaque" "RenderPipeline"="UniversalPipeline" } HLSLINCLUDE #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" ENDHLSL /* Pass定义 */ } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值