通用渲染管线中的阴影
通用渲染管线的光源可以将阴影从一个游戏对象投射到另一个游戏对象上。这些阴影可以凸显游戏对象的位置和比例,因此能够为场景添加一定程度的深度和真实感,否则看起来会显得扁平。
阴影贴图分辨率
光源的阴影贴图的分辨率决定了其阴影贴图的大小。阴影贴图越大,阴影就越精确,通用渲染管线捕获阴影投射几何体中的小细节的能力也越强。以更高分辨率渲染阴影贴图会使其看起来更清晰。
Universal RP 为每个光源渲染的阴影贴图数量取决于光源的类型 (Type):
- 聚光灯渲染一个阴影贴图。
- 点光源渲染六个阴影贴图(立方体贴图中的面数)。
- 方向光为每个级联渲染一个阴影贴图。可以从项目的通用渲染管线资源中设置方向光的级联数。
Universal RP 将尝试根据场景中需要的阴影贴图数量以及阴影图集的大小使用最佳分辨率。
阴影图集
Universal RP 使用一个通用阴影贴图图集为所有精准光源阴影(即聚光灯和点光源的阴影)渲染一个帧的所有实时阴影,并为方向光阴影渲染另一个阴影贴图图集。
可以在 Unity 项目的 通用渲染管线资源中设置这些图集的大小。图集大小决定了场景中阴影的最大分辨率。
例如,大小为 1024 x 1024 的图集可以容纳:
- 四个 512 x 512 像素的阴影贴图。
- 16 个 256 x 256 像素的阴影贴图。
将阴影图集分辨率与内置 RP 设置匹配
在使用内置渲染管线的项目中,通过在项目的 Quality Settings 中选择阴影分辨率级别(“Low”、“Medium”、“High”、“Very High”)来控制阴影贴图分辨率。 然后,对于每个阴影贴图,Unity 根据关于阴影贴图的内置 RP 手册页中介绍的算法决定实际使用的分辨率。 然后,可以在帧调试器 (Frame Debugger) 中检查实际用于特定阴影贴图的分辨率。
在通用渲染管线中,可以设置阴影图集的分辨率。因此,可以控制应用程序为阴影分配的视频内存量。
如果要确保 Universal RP 用于项目中特定精准光源阴影的分辨率不会低于特定值,应考虑场景中所需的阴影贴图数量,并选择足够大的阴影图集分辨率。
例如:如果场景中有四个聚光灯和一个点光源,并希望每个阴影贴图分辨率至少为 256x256。 该场景需要渲染 10 个阴影贴图(每个聚光灯一个,点光源六个),每个阴影贴图的分辨率为 256x256。 使用大小为 512x512 的阴影图集是不够的,因为这个大小只能包含四个大小为 256x256 的贴图。因此,应该使用大小为 1024x1024 的阴影图集,这个大小最多可以包含 16 个大小为 256x256 的贴图。
阴影偏差 (Shadow Bias)
阴影贴图本质上是从光源视角投射的纹理。Universal RP 在投影中使用偏差使阴影投射几何体不会产生自我阴影。
在 Universal RP 中,每个单独的 Light 组件使用以下参数控制其自身的阴影偏差:
- Depth Bias
- Normal Bias
- Near Plane
在 Shadows 部分下可以找到这些设置。如果属性不可见,请将 Bias 设置从“Use Pipeline Settings”更改为“Custom”以将它们显示出来。
使用较高的阴影偏差值可能会导致光线通过网格“泄漏”。此问题出现在阴影与其投射物之间存在明显差距的位置,导致阴影形状无法精确表示其投射物。
性能
以下是一些帧时间示例(使用 SRP 包修订版 78d514f756c 和 Unity 2020.2.0b 观察得到):
- 在 Galaxy S20+ 上的 Universal RP 项目模板场景中的位置 (2, 1, 1) 添加具有硬阴影的点光源时产生的影响:+1.9ms(总帧时间 22.2ms)
- 在 PC - GeForce RTX 2080 Ti(全高清)上的 Universal RP 项目模板场景中的位置 (2, 1, 1) 添加具有硬阴影的点光源时产生的影响:+0.1ms(总帧时间 16.6ms)