此页面介绍如何将旧版本的通用渲染管线一系列将场景内容显示到屏幕上的操作。Unity 允许您从预构建的渲染管线中选择,或编写自己的渲染管线。更多信息
参见 术语表 (URP) 升级到 URP 13 (Unity 2022.1)。
有关将为内置渲染管线项目创建的资源转换为与 URP 兼容的资源的信息,请参阅页面渲染管线转换器。
当 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();
CoreUtils.SetRenderTarget(cmd, m_DestinationColor, m_DestinationDepth,
clearFlag, clearColor);
context.ExecuteCommandBuffer(cmd);
CommandBufferPool.Release(cmd);
}
}
Forward Renderer 资源重命名为 Universal Renderer 资源。当您在包含 URP 12 的 Unity 编辑器中打开现有项目时,Unity 会将现有的 Forward Renderer 资源更新为 Universal Renderer 资源。
Universal Renderer 资源包含属性渲染路径渲染管线用于渲染图形的技术。选择不同的渲染路径会影响照明和阴影的计算方式。某些渲染路径比其他渲染路径更适合不同的平台和硬件。更多信息
参见 术语表,允许您选择 Forward 或 Deferred 渲染路径。
方法 ClearFlag.Depth
不再隐式清除模板缓冲区存储每个像素 8 位值的内存存储。在 Unity 中,您可以使用模板缓冲区标记像素,然后仅渲染通过模板操作的像素。更多信息
参见 术语表。使用新方法 ClearFlag.Stencil
。
URP 12 及更高版本实现了渲染管线转换器功能。此功能替换了以前在编辑 > 渲染管线 > 通用渲染管线 > 升级…中提供的资源升级功能。
以下着色器图着色器的文件名已重命名。新文件名不包含空格Autodesk Interactive
Autodesk Interactive Masked
Autodesk Interactive Transparent
如果您的代码使用 Shader.Find()
方法搜索着色器,请从着色器在 GPU 上运行的程序。更多信息
参见 术语表名称中删除空格,例如 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.4 而不是 1.0 通常就足够了。
在以前的 URP 版本中,如果渲染器有任何活动的渲染器功能,URP 会通过中间渲染器执行渲染。在某些平台上,这会对性能产生重大影响。在此版本中,URP 以以下方式缓解了此问题:URP 期望渲染器功能使用 ScriptableRenderPass.ConfigureInput
方法声明其输入。该方法提供了 URP 用于自动确定是否需要通过中间纹理进行渲染的信息。
出于兼容性目的,通用渲染器中有一个新的属性中间纹理。如果在属性中选择始终,则 URP 使用中间纹理。选择自动启用新行为。仅当渲染器功能未使用 ScriptableRenderPass.ConfigureInput
方法声明其输入时,才使用始终选项。
为了确保现有项目正常工作,所有使用任何渲染器功能(不包括 URP 中包含的功能)的现有通用渲染器资源都已在中间纹理属性中选择了始终选项。任何新创建的通用渲染器资源都已选择自动选项。
首先升级到 URP 7.2.0。请参阅将通用渲染管线升级到 7.2.0 版本。
URP 8.x.x 不支持包 Post-Processing Stack v2。如果您的项目使用包 Post-Processing Stack v2,请首先迁移使用该包的效果。