Version: 6000.3
语言: 中文
升级到 URP 14 (Unity 2022.2)
升级到 URP 12 (Unity 2021.2)

升级到 URP 13 (Unity 2022.1)

本页介绍如何从旧版本的 Universal 升级渲染管线(Render Pipeline) 获取场景内容并将其显示在屏幕上的一系列作。Unity 允许您从预构建的渲染管道中进行选择,或编写自己的渲染管道。更多信息
请参阅术语表
(URP) 到 URP 13 (Unity 2022.1)。

有关将内置渲染管线项目制作的资产转换为与URP兼容的资产的信息,请参阅渲染管线转换器页面。

从 URP 12 (Unity 2021.2) 升级

对 ScriptableRenderer API 行为的更改

Unity 现在在ScriptableRendererFeature尝试在渲染目标被ScriptableRenderer类。

ScriptableRendererFeatureclass 有一个新的虚函数SetupRenderPasses当分配渲染目标并准备好使用时调用。

如果您的代码使用ScriptableRenderer.cameraColorTargetScriptableRenderer.cameraDepthTarget属性的AddRenderPassesmethod override,则应将该实现移至ScriptableRendererFeature.SetupRenderPasses方法。

ScriptableRenderer.EnqueuePass方法仍应发生在AddRenderPasses方法。

以下示例演示如何更改代码以使用新 API。

使用旧 API 编写代码:

public override void AddRenderPasses(ScriptableRenderer renderer,
                                    ref RenderingData renderingData)
{
    // The target is used before allocation
    m_CustomPass.Setup(renderer.cameraColorTarget);
     // Letting the renderer know which passes are used before allocation
    renderer.EnqueuePass(m_ScriptablePass);
}

使用新 API 编写代码:

public override void AddRenderPasses(ScriptableRenderer renderer,
                                        ref RenderingData renderingData)
{
    // Letting the renderer know which passes are used before allocation
    renderer.EnqueuePass(m_ScriptablePass);
}

public override void SetupRenderPasses(ScriptableRenderer renderer,
                                          in RenderingData renderingData)
{
    // The target is used after allocation
    m_CustomPass.Setup(renderer.cameraColorTarget);
}

通用渲染器现在使用 RTHandle 系统

通用渲染器现在将 RTHandle 系统用于其内部目标和内部通道。

的所有用法RenderTargetHandlestruct 设置为过时,并且将来将删除该结构。

公共接口ScriptableRenderer.cameraColorTargetScriptableRenderer.cameraDepthTarget被标记为过时。将它们替换为ScriptableRenderer.cameraColorTargetHandleScriptableRenderer.cameraDepthTargetHandle分别。

RTHandle目标不使用CommandBuffer.GetTemporaryRT方法,并保留比RenderTargetIdentifier结构体。您无法分配RTHandle属性GraphicsFormatDepthBufferBits设置为除 0 之外的任何值。这cameraDepthTarget属性必须与cameraColorTarget性能。

以下帮助程序函数允许您创建和使用临时渲染目标,并RTHandle系统,其方式与GetTemporaryRT方法之前:

  • RenderingUtils.ReAllocateIfNeeded

  • ShadowUtils.ShadowRTReAllocateIfNeeded

如果渲染目标在应用程序的生存期内没有更改,请使用RTHandles.Alloc分配RTHandle目标。此方法非常有效,因为代码不必检查是否应在每一帧上分配渲染目标。

如果呈现目标是全屏纹理,这意味着其分辨率与屏幕分辨率匹配或是屏幕分辨率的一小部分,请使用缩放因子,例如Vector2D.one以支持动态缩放。

以下示例演示如何使用RenderTargetHandleAPI 以使用新 API。

使用旧 API 编写代码:

public class CustomPass : ScriptableRenderPass
{
    RenderTargetHandle m_Handle;
    // With the old API, RenderTargetIdentifier might combine color and depth
    RenderTargetIdentifier m_Destination;

    public CustomPass()
    {
        m_Handle.Init("_CustomPassHandle");
    }

    public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
    {
        var desc = renderingData.cameraData.cameraTargetDescriptor;
        cmd.GetTemporaryRT(m_Handle.id, desc, FilterMode.Point);
    }

    public override void OnCameraCleanup(CommandBuffer cmd)
    {
        cmd.ReleaseTemporaryRT(m_Handle.id);
    }

    public void Setup(RenderTargetIdentifier destination)
    {
        m_Destination = destination;
    }

    public override void Execute(ScriptableRenderContext context,
                                    ref RenderingData renderingData)
    {
        CommandBuffer cmd = CommandBufferPool.Get();
        // Set the same target for color and depth
        ScriptableRenderer.SetRenderTarget(cmd, m_Destination, m_Destination, clearFlag,
                                              clearColor);
        context.ExecuteCommandBuffer(cmd);
        CommandBufferPool.Release(cmd);
    }
}

使用新 API 编写代码:

public class CustomPass : ScriptableRenderPass
{
    RTHandle m_Handle;
    // Then using RTHandles, the color and the depth properties must be separate
    RTHandle m_DestinationColor;
    RTHandle m_DestinationDepth;

    void Dispose()
    {
        m_Handle?.Release();
    }

    public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData)
    {
        var desc = renderingData.cameraData.cameraTargetDescriptor;
        // Then using RTHandles, the color and the depth properties must be separate
        desc.depthBufferBits = 0;
        RenderingUtils.ReAllocateIfNeeded(ref m_Handle, desc, FilterMode.Point,
                                         TextureWrapMode.Clamp, name: "_CustomPassHandle");
    }

    public override void OnCameraCleanup(CommandBuffer cmd)
    {
        m_DestinationColor = null;
        m_DestinationDepth = null;
    }

    public void Setup(RTHandle destinationColor, RTHandle destinationDepth)
    {
        m_DestinationColor = destinationColor;
        m_DestinationDepth = destinationDepth;
    }

    public override void Execute(ScriptableRenderContext context,
                                    ref RenderingData renderingData)
    {
        CommandBuffer cmd = CommandBufferPool.Get();
        CoreUtils.SetRenderTarget(cmd, m_DestinationColor, m_DestinationDepth,
                                              clearFlag, clearColor);
        context.ExecuteCommandBuffer(cmd);
        CommandBufferPool.Release(cmd);
    }
}

从 URP 11.x.x 升级

  • Forward Renderer资源将重命名为Universal Renderer资源。当您在包含 URP 12 的 Unity 编辑器中打开现有项目时,Unity 会将现有的 Forward Renderer 资源更新为 Universal Renderer 资源。

  • 通用渲染器资产包含属性渲染路径渲染管线用于渲染图形的技术。选择不同的渲染路径会影响照明和着色的计算方式。某些渲染路径比其他路径更适合不同的平台和硬件。更多信息
    请参阅术语表
    ,用于选择“前向”或“延迟渲染路径”。

  • 方法ClearFlag.Depth不会隐式清除模具缓冲区 保存每像素值 8 位的内存存储。在 Unity 中,可以使用模具缓冲区来标记像素,然后仅呈现为通过模具作的像素。更多信息
    请参阅术语表
    了。使用新方法ClearFlag.Stencil.

  • URP 12及更高版本实现了渲染管线转换器功能。此功能取代了之前在 编辑>渲染管线 > 通用渲染管线 > 升级...

从 URP 10.0.x–10.2.x 升级

  1. 以下着色器图着色器的文件名已重命名。新文件名没有空格:
    Autodesk Interactive
    Autodesk Interactive Masked
    Autodesk Interactive Transparent

    如果您的代码使用Shader.Find()方法来搜索着色器,请从着色器在 GPU 上运行的程序。更多信息
    请参阅术语表
    名称,例如Shader.Find("AutodeskInteractive).

从 URP 7.2.x 及更高版本升级

  1. URP 12.x.x 不支持软件包后处理图像出现在屏幕上之前应用滤镜和效果来改善产品视觉效果的过程。你可以使用后期处理效果来模拟物理摄像机和胶片属性,例如泛光和景深。更多信息 后处理, 后处理, 后处理
    术语表中查看
    堆栈 v2。如果你的项目使用包后处理堆栈v2,请首先迁移使用该包的效果。

深度法线通道(DepthNormals Pass)

从 10.0.x 版本开始,URP 可以生成名为_CameraNormalsTexture.要在自定义着色器中渲染到此纹理,请添加一个名为DepthNormals.例如,请检查Lit.shader.

屏幕空间环境光遮蔽(SSAO)

URP 10.0.x 实现了屏幕空间环境光遮挡 一种近似环境光(不是来自特定方向的光)可以击中表面上某个点的量的方法。
请参阅术语表
(SSAO) 效应。

如果打算将 SSAO 效果与自定义着色器一起使用,请考虑以下与 SSAO 相关的实体:

  • _SCREEN_SPACE_OCCLUSION关键词。

  • Input.hlsl包含新声明float2 normalizedScreenSpaceUVInputData结构。

  • Lighting.hlsl包含AmbientOcclusionFactorstruct 替换为用于计算间接和直接遮挡的变量:

    struct AmbientOcclusionFactor
    {
        half indirectAmbientOcclusion;
        half directAmbientOcclusion;
    };
    
  • Lighting.hlsl包含以下用于对 SSAO 纹理进行采样的函数:

    half SampleAmbientOcclusion(float2 normalizedScreenSpaceUV)
    
  • Lighting.hlsl包含以下函数:

    AmbientOcclusionFactor GetScreenSpaceAmbientOcclusion(float2
    normalizedScreenSpaceUV)
    

要在自定义着色器中支持 SSAO,请将DepthNormalsPass 和_SCREEN_SPACE_OCCLUSION关键字 the 着色器。有关示例,请检查Lit.shader.

如果自定义着色器实现自定义光照函数,请使用GetScreenSpaceAmbientOcclusion(float2 normalizedScreenSpaceUV)要获取AmbientOcclusionFactor值。

阴影法线偏差(Shadow Normal Bias)

在 11.0.x 中,用于应用阴影法线偏差的公式已略有修复,以便更好地处理准时光源。因此,为了完全匹配早期修订版的阴影轮廓,可能需要在某些版本中调整该参数场景场景包含游戏的环境和菜单。将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您可以放置环境、障碍物和装饰,实质上是分部分设计和构建游戏。更多信息
请参阅术语表
. 通常,对定向光源使用 1.4 而不是 1.0 通常就足够了。

中间纹理

在以前的 URP 版本中,如果渲染器具有任何活动的渲染器功能,URP 会通过中间渲染器执行渲染。在某些平台上,这会对性能产生重大影响。在此版本中,URP 通过以下方式缓解了该问题:URP 希望渲染器功能使用ScriptableRenderPass.ConfigureInput方法。 该方法提供 URP 用于自动确定是否需要通过中间纹理进行渲染的信息。

出于兼容性目的,通用渲染器中有一个新属性 Intermediate Texture。如果在属性中选择 Always,则 URP 将使用中间纹理。选择 Auto 将启用新行为。仅当渲染器功能未使用ScriptableRenderPass.ConfigureInput方法。

为确保现有项目正常工作,所有使用任何渲染器功能的现有通用渲染器资产(不包括URP中包含的功能)在 中间纹理(Intermediate Texture) 属性中都选择了 始终(Always) 选项。任何新创建的通用渲染器资产都选择了 自动(Auto) 选项。

从 URP 7.0.x 至 7.1.x 升级

  1. 首先升级到 URP 7.2.0。请参阅升级到 Universal Render Pipeline 的 7.2.0 版

  2. URP 8.x.x 不支持包 Post-Processing Stack v2。如果你的项目使用包 Post-Processing Stack v2,请先迁移使用该包的效果。

从 LWRP 升级到 12.x.x

  • 没有从 LWRP 到 URP 12.x.x 的直接升级路径。按照步骤先将 LWRP 升级到 URP 11.x.x,然后从 URP 11.x.x 升级到 URP 12.x.x。
升级到 URP 14 (Unity 2022.2)
升级到 URP 12 (Unity 2021.2)