此页面介绍如何从旧版本的通用渲染管线一系列操作,用于获取场景内容并在屏幕上显示。Unity 允许您选择预构建的渲染管线,或编写自己的渲染管线。 更多信息
参见 术语表 (URP) 升级到 URP 15(Unity 2023.1)。
有关将为内置渲染管线项目创建的资源转换为与 URP 兼容的资源的信息,请参阅页面 渲染管线转换器。
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
属性分配 RTHandle
目标,并将它们设置为除 0 之外的任何值。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.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 不支持包后期处理 Stack v2。如果您的项目使用包后期处理 Stack v2,请首先迁移使用该包的效果。