2D 光照系统简介
URP 附带的 2D 光照系统包含对美术师友好的工具和运行时组件,可通过核心 Unity 组件(例如精灵渲染器 (Sprite Renderer))以及 2D Light 组件(用作熟悉的 3D Light 组件所对应的 2D 组件),帮助您快速创建 2D 光照场景。
根据设计,这些工具可无缝集成 2D 渲染器,例如精灵渲染器 (Sprite Renderer)、瓦片地图渲染器 (Tilemap Renderer) 和精灵形状渲染器 (Sprite Shape Renderer)。这套工具和组件系统经过优化,适用于移动系统以及在多个平台上运行。
与 3D 光源的区别
2D 光源与 3D 光源的实现及行为之间存在许多重要区别,包括以下几点:
新增特定于 2D 的组件和渲染通道
2D 光照系统包括自己的一套 2D Light 组件、Shader Graph 子目标和一个自定义的 2D 渲染通道,这些都是专为 2D 光照和渲染而设计的。用于 2D 光源和通道配置的编辑器工具也包含在了包中。
共面
2D 光照模型专门设计用于处理共面和多层的 2D 世界。2D 光源不需要在它和它所照射的对象之间进行深度分离。2D 阴影系统也支持共面,因此不需要深度分离。
不是基于物理
2D 光源中的光照计算不像 3D 光源那样基于物理。此处介绍了光照模型计算的详细信息。
与 3D 光源和 3D 渲染器之间没有互操作性
目前 3D 和 2D 光源只能分别影响 3D 和 2D 渲染器。2D 光照对 3D 渲染器(如网格渲染器)不起作用或没有影响,而 3D 光照同样对 2D 渲染器(如精灵渲染器)没有影响。未来可能会开发各个光源和渲染器之间的互操作性,但目前可以通过使用摄像机堆叠技术在单个场景中实现 2D 和 3D 光源以及 2D 和 3D 渲染器的组合。
2D 光照图形管线的技术细节
2D 光照图形管线渲染过程可以分为两个不同的阶段: 1) 绘制光源渲染纹理 2) 绘制渲染器
光源渲染纹理是包含有关光源颜色和形状(以屏幕空间表示)的信息的渲染纹理。
只会针对每组明显照亮的光源层重复这两个阶段。换句话说,如果排序图层 1 到 4 具有完全相同的一组光源,则只会执行一次上述这组操作。
默认设置允许在绘制渲染器之前提前绘制多个批次以减少目标切换。理想的设置将允许管线渲染所有批次的光源渲染纹理,然后才继续绘制渲染器。这可以防止加载和卸载颜色目标。请参阅优化以了解更多详细信息。
前期阶段:计算排序图层批处理
在进行渲染阶段之前,2D 光照图形管线首先分析场景,以评估哪些图层可以在单个绘制操作中一起进行批处理。以下是确定是否对图层一起进行批处理的标准:
- 它们是连续的图层。
- 它们共享完全相同的一组光源。
强烈建议对尽可能多的图层进行批处理,以最大限度减少光源渲染纹理绘制操作的数量并提高性能。
阶段 1:绘制光源渲染纹理
在前期阶段的批处理之后,管线会为该批次绘制光源纹理。此操作实质上是将光源的形状绘制到渲染纹理上。根据光源的设置,可以使用 Additive 或 Alpha Blended 将光源的颜色和形状混合到目标光源渲染纹理上。
值得注意的是,仅在至少有一个 2D 光源以某个光源渲染纹理为目标时才会创建这个光源渲染纹理。例如,如果一个图层的所有光源都只使用 Blendstyle #1,则只会创建一个光源渲染纹理。
阶段 2:绘制渲染器
绘制完所有光源渲染纹理后,管线将继续绘制渲染器。系统将跟踪哪组渲染器由哪组光源渲染纹理绘制。在前期阶段的批处理过程中会将它们关联起来。
当绘制渲染器时,它将可以访问所有(每个混合样式一个)可用的光源渲染纹理。在着色器中会通过使用指定操作将输入颜色与光源渲染纹理中的颜色进行组合来计算最终颜色。
此设置示例具有四种活动混合样式,说明了多种混合样式如何组合在一起。在大多数情况下,通常只需要两种混合样式即可实现所需的效果。
优化
除了标准的优化技术(例如减少绘制调用、剔除和优化着色器)之外,还有 2D 光照图形管线独有的一些技术和注意事项。
混合样式的数量
提高渲染性能的最简单方法是减少使用的混合样式数量。每个混合样式都是一个需要渲染并随后上传的渲染纹理。
减少混合样式的数量对性能有直接影响。对于简单的场景,一个混合样式可能就足够了。在一个场景中使用最多 2 个混合样式也很常见。
光源渲染纹理比例
2D 光照系统依赖于屏幕空间光源渲染纹理来捕获光照贡献。这意味着有很多的渲染纹理绘制后续上传。选择正确的渲染纹理大小将直接影响性能。
默认情况下,此值设置为屏幕分辨率的 0.5 倍。较小的光源渲染纹理大小将提供更好的性能,但会以视觉瑕疵为代价。设置为屏幕大小分辨率的一半可以提供良好的性能,并且在大多数情况下几乎没有明显的瑕疵。
请多尝试,找出最适合项目的比例值。
图层批处理
为了进一步减少光源渲染纹理的数量,使排序图层可被批处理至关重要。一起进行批处理的图层共享同一组光源渲染纹理。具有独特光照的图层将具有自己的设置,因此会增加所需的工作量。
如果图层共享同一组光源,则它们可以一起批处理。
光源渲染纹理的预渲染
在绘制渲染器之前可以渲染多组光源渲染纹理。在理想情况下,所有光源渲染纹理都将预先渲染,然后管线才会继续将渲染器绘制到最终颜色输出上。这样可以减少加载/卸载/重新加载最终颜色输出的需求。
在具有许多明显照亮的图层的非常复杂的设置中,预渲染所有光源渲染纹理可能不切实际。在 2D Renderer Data Inspector 中可以配置这一限制值。
法线贴图
使用法线贴图来模拟深度目前是一项成本非常高昂的操作。如果启用此功能,则会在深度预通道期间创建全尺寸的渲染纹理,并会将渲染器绘制到该渲染纹理之上。对于每个图层批次都会进行此操作。
如果不需要通过法线贴图效果来模拟深度感知,请确保所有光源都禁用法线贴图选项。