本页面介绍如何从旧版本的通用渲染管线一系列操作,用于获取场景的内容并在屏幕上显示它们。 Unity 允许您从预构建的渲染管线中选择,或编写自己的渲染管线。 更多信息
参见 术语表 (URP) 升级到 URP 16(Unity 2023.2)。
有关将为内置渲染管线项目制作的资产转换为与 URP 兼容的资产的信息,请参阅页面 渲染管线转换器。
当您创建覆盖 VolumeComponent.Override(VolumeComponent state, float interpFactor)
方法的自定义体积组件类时,您的实现必须在 VolumeParameter
值发生更改时将 VolumeParameter.overrideState
属性设置为 true
。这可确保体积框架将参数重置为其正确的默认值。这使框架能够在每一帧中使用更少的资源,从而提高性能。
SHADER_QUALITY_LOW/MEDIUM/HIGH
和 SHADER_HINT_NICE_QUALITY
着色器在 GPU 上运行的程序。 更多信息
参见 术语表 定义已被删除。如果您在自定义着色器中使用了这些定义,请考虑使用 SHADER_API_MOBILE
或 SHADER_API_GLES
定义来替换 SHADER_QUALITY_LOW/MEDIUM/HIGH
。
当 ScriptableRendererFeature
的实例尝试在 ScriptableRenderer
类为其分配渲染目标之前访问渲染目标时,Unity 现在会发出错误。
ScriptableRendererFeature
类具有一个新的虚拟函数 SetupRenderPasses
,它在分配渲染目标并准备好使用时被调用。
如果您的代码在 AddRenderPasses
方法覆盖中使用 ScriptableRenderer.cameraColorTarget
或 ScriptableRenderer.cameraDepthTarget
属性,您应该将该实现移至 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 系统 用于其内部目标及其内部通道。
RenderTargetHandle
结构的所有用法均已设置为已弃用,该结构将在未来删除。
公共接口 ScriptableRenderer.cameraColorTarget
和 ScriptableRenderer.cameraDepthTarget
被标记为已弃用。分别用 ScriptableRenderer.cameraColorTargetHandle
和 ScriptableRenderer.cameraDepthTargetHandle
替换它们。
RTHandle
目标不使用 CommandBuffer.GetTemporaryRT
方法,并且比 RenderTargetIdentifier
结构持续更长时间。您无法使用 GraphicsFormat
和 DepthBufferBits
属性设置为除 0 以外的任何值来分配 RTHandle
目标。cameraDepthTarget
属性必须与 cameraColorTarget
属性分开。
以下辅助函数允许您以与以前使用 GetTemporaryRT
方法类似的方式创建和使用具有 RTHandle
系统的临时渲染目标
RenderingUtils.ReAllocateIfNeeded
ShadowUtils.ShadowRTReAllocateIfNeeded
如果渲染目标在应用程序的整个生命周期内不会改变,请使用 RTHandles.Alloc
方法来分配 RTHandle
目标。此方法效率很高,因为代码不必检查是否应在每一帧中分配渲染目标。
如果渲染目标是全屏纹理,这意味着其分辨率与屏幕分辨率匹配或只是屏幕分辨率的一部分,请使用缩放因子(如 Vector2D.one
)来支持动态缩放。
以下示例展示了如何更改使用 RenderTargetHandle
API 的代码以使用新的 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();
ScriptableRenderer.SetRenderTarget(cmd, m_DestinationColor, m_DestinationDepth,
clearFlag, clearColor);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
}
正向渲染器资产已重命名为通用渲染器资产。当您在包含 URP 12 的 Unity 编辑器中打开现有项目时,Unity 会将现有正向渲染器资产更新为通用渲染器资产。
通用渲染器资产包含属性 渲染路径渲染管线用于渲染图形的技术。选择不同的渲染路径会影响光照和阴影的计算方式。某些渲染路径比其他渲染路径更适合不同的平台和硬件。 更多信息
参见 术语表,它允许您选择正向渲染路径或延迟渲染路径。
方法 ClearFlag.Depth
不再隐式清除 模板缓冲区一个存储每个像素的 8 位值的内存存储器。在 Unity 中,您可以使用模板缓冲区标记像素,然后仅对通过模板操作的像素进行渲染。 更多信息
参见 术语表。请使用新方法 ClearFlag.Stencil
。
URP 12 及更高版本实现了 渲染管线转换器 功能。此功能替换了以前在 编辑 > 渲染管线 > 通用渲染管线 > 升级... 中可用的资产升级功能。
以下着色器图着色器的文件名已重命名。新的文件名不包含空格Autodesk Interactive
Autodesk Interactive Masked
Autodesk Interactive Transparent
如果您的代码使用 Shader.Find()
方法来搜索着色器,请从着色器名称中删除空格,例如 Shader.Find("AutodeskInteractive")
。
从版本 10.0.x 开始,URP 可以生成一个名为 _CameraNormalsTexture
的法线纹理。要在您的自定义着色器中渲染到此纹理,请添加一个名为 DepthNormals
的通道。有关示例,请查看 Lit.shader
中的实现。
URP 10.0.x 实现了屏幕空间 环境光遮蔽一种方法来近似非来自特定方向的光线(环境光线)可以击中表面上的一个点的情况。
参见 术语表 (SSAO) 效果。
如果您打算将 SSAO 效果与您的自定义着色器一起使用,请考虑与 SSAO 相关的以下实体
_SCREEN_SPACE_OCCLUSION
关键字。
Input.hlsl
在 InputData
结构中包含新的声明 float2 normalizedScreenSpaceUV
。
Lighting.hlsl
包含具有用于计算间接和直接遮挡的变量的 AmbientOcclusionFactor
结构
struct AmbientOcclusionFactor
{
half indirectAmbientOcclusion;
half directAmbientOcclusion;
};
Lighting.hlsl
包含以下用于对 SSAO 纹理进行采样的函数
half SampleAmbientOcclusion(float2 normalizedScreenSpaceUV)
Lighting.hlsl
包含以下函数
AmbientOcclusionFactor GetScreenSpaceAmbientOcclusion(float2
normalizedScreenSpaceUV)
要支持自定义着色器中的 SSAO,请将 DepthNormals
通道和 _SCREEN_SPACE_OCCLUSION
关键字添加到着色器中。有关示例,请查看 Lit.shader
。
如果您的自定义着色器实现了自定义光照函数,请使用函数 GetScreenSpaceAmbientOcclusion(float2 normalizedScreenSpaceUV)
来获取光照计算的 AmbientOcclusionFactor
值。
在 11.0.x 中,用于应用阴影法线偏差的公式已稍作修正以更好地与点光源配合使用。因此,为了完全匹配早期版本的阴影轮廓,可能需要在某些 场景场景包含游戏的环境和菜单。可以将每个唯一的场景文件视为一个唯一的关卡。在每个场景中,您可以放置环境、障碍物和装饰,从本质上讲,以块的形式设计和构建您的游戏。 更多信息
参见 术语表 中调整参数。通常,将方向光的值从 1.0 更改为 1.4 就足够了。
在以前的 URP 版本中,如果渲染器具有任何活动的渲染器功能,则 URP 通过中间渲染器执行渲染。在某些平台上,这会对性能产生重大影响。在此版本中,URP 通过以下方式缓解了这个问题:URP 预计渲染器功能使用 ScriptableRenderPass.ConfigureInput
方法声明其输入。该方法提供了 URP 用来自动确定是否需要通过中间纹理进行渲染的信息。
出于兼容性目的,通用渲染器中有一个新的属性 中间纹理。如果您在该属性中选择 始终,URP 将使用中间纹理。选择 自动 将启用新行为。仅当渲染器功能未使用 ScriptableRenderPass.ConfigureInput
方法声明其输入时,才使用 始终 选项。
为了确保现有项目正常运行,所有使用任何渲染器功能(不包括随 URP 一起提供的渲染器功能)的现有通用渲染器资产都已在 中间纹理 属性中选择了 始终 选项。任何新创建的通用渲染器资产都已选择了 自动 选项。
请先升级到 URP 7.2.0。请参阅 升级到通用渲染管线的 7.2.0 版本。
URP 8.x.x 不支持包后期处理堆栈 v2。如果您的项目使用包后期处理堆栈 v2,请首先迁移使用该包的效果。