本页面介绍如何从旧版本的通用 渲染管线一系列将场景内容呈现到屏幕上的操作。Unity 允许您选择预构建的渲染管线,或编写自己的渲染管线。 更多信息
参见 词汇表 (URP) 升级到 URP 14(Unity 2022.2)。
有关将为内置渲染管线项目制作的资源转换为与 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
属性设置为除 0 以外的任何值来分配 RTHandle
目标。cameraDepthTarget
属性必须与 cameraColorTarget
属性分开。
以下辅助函数允许您使用 RTHandle
系统以类似于以前使用 GetTemporaryRT
方法的方式创建和使用临时渲染目标
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 资源。当您在 Unity 编辑器中打开包含 URP 12 的现有项目时,Unity 会将现有 Forward Renderer 资源更新为 Universal Renderer 资源。
Universal Renderer 资源包含属性 渲染路径渲染管线用来渲染图形的技术。选择不同的渲染路径会影响光照和阴影的计算方式。一些渲染路径比其他路径更适合不同的平台和硬件。 更多信息
参见 词汇表,允许您选择 Forward 或 Deferred 渲染路径。
方法 ClearFlag.Depth
不再隐式清除 模板缓冲区存储每个像素 8 位值的内存存储。在 Unity 中,您可以使用模板缓冲区来标记像素,然后只渲染通过模板操作的像素。 更多信息
参见 词汇表。请使用新的方法 ClearFlag.Stencil
。
URP 12 及更高版本实现了 渲染管线转换器 功能。此功能替换了以前在 编辑 > 渲染管线 > 通用渲染管线 > 升级… 中可用的资源升级功能。
以下 Shader Graph 着色器的文件名已重命名。新文件名没有空格Autodesk Interactive
Autodesk Interactive Masked
Autodesk Interactive Transparent
如果您的代码使用 Shader.Find()
方法来搜索着色器,请从着色器名称中删除空格,例如 Shader.Find("AutodeskInteractive)
。
从 10.0.x 版本开始,URP 可以生成一个名为 _CameraNormalsTexture
的法线纹理。要在您的自定义着色器中渲染到此纹理,请添加一个名为 DepthNormals
的 Pass。有关示例,请查看 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
Pass 和 _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 不支持包后期处理堆栈 v2。如果您的项目使用包后期处理堆栈 v2,请先迁移使用该包的效果。