高清渲染管线 (High Definition Render Pipeline) 中的阴影
高清渲染管线的光源可以将阴影从一个游戏对象投射到另一个游戏对象上。这些阴影可以凸显游戏对象的位置和比例,因此能够为场景添加一定程度的深度和真实感,否则看起来会显得扁平。
阴影贴图分辨率
光源的阴影贴图的分辨率决定了其阴影贴图的大小。阴影贴图越大,阴影就越精确,高清渲染管线 (HDRP) 捕获阴影投射几何体中的小细节的能力也越强。以更高分辨率渲染阴影贴图会使其看起来更清晰。
可以在光源组件的 Shadows 部分中设置特定光源的阴影贴图分辨率。
HDRP 为每个光源渲染的阴影贴图数量取决于光源的类型 (Type):
- 聚光灯渲染一个阴影贴图。
- 点光源渲染六个阴影贴图(立方体贴图中的面数)。
- 方向光为每个级联渲染一个阴影贴图。可以从场景体积 (Volume) 的高清阴影设置 (HD Shadow Settings) 中设置方向光的级联数。默认值为四个级联。
阴影图集
HDRP 使用一个阴影贴图图集为所有精准光源阴影渲染一个帧的所有实时阴影,并为方向光阴影渲染另一个阴影贴图图集。
可以在 Unity 项目的 HDRP 资源中设置这些图集的大小。图集大小决定了场景中阴影的最大分辨率。
例如,图集的默认大小为 4096 x 4096,可以容纳:
- 16 个 1024 x 1024 像素的阴影贴图。
- 2 个 2048 x 2048 的阴影贴图 + 4 个 1024 x 1024 的阴影贴图 + 8 个 512 x 512 的阴影贴图 + 32 个 256 x 256 的阴影贴图。
控制屏幕上的最大阴影数量
除了图集,还可以设置 HDRP 在单个帧中能够渲染的最大阴影贴图数。要执行此操作,请打开 Unity 项目的 HDRP 资源,导航到 Shadows 部分,然后输入 Max Shadows on Screen 的值。如果屏幕上的阴影贴图数量高于此上限,则 HDRP 不会渲染它们。
阴影偏差 (Shadow Bias)
阴影贴图本质上是从光源视角投射的纹理。HDRP 在投影中使用偏差使阴影投射几何体不会产生自我阴影。
在 HDRP 中,每个单独的光源组件使用以下参数控制其自身的阴影偏差:
- Near Plane
- Slope-Scale Depth Bias
- Normal Bias
在 Shadows 部分下可以找到这些设置。如果缺少某些属性字段,请单击更多选项齿轮图标来显示它们。有关每个属性如何控制阴影偏差的详细信息,请参阅光源文档。
使用较高的阴影偏差值可能会导致光线通过网格“泄漏”。此问题出现在阴影与其投射物之间存在明显差距的位置,导致阴影形状无法精确表示其投射物。
阴影过滤
HDRP 捕获阴影贴图后,会对贴图进行过滤处理,从而减轻低分辨率阴影贴图上出现的锯齿效果。不同的过滤器会影响阴影的感知清晰度。
要更改 HDRP 使用的过滤器,方法取决于要使用的过滤质量以及 HDRP 项目是使用前向渲染还是延迟渲染。
- 前向渲染:更改 Unity 项目的 HDRP 资源中的 Filtering Quality 属性。此方法适用于每种过滤质量。目前有三种用于方向光和精准光源的过滤质量预设。如需了解有哪些可用的过滤质量,请参阅过滤质量表。
- 延迟渲染:过滤质量为低 (Low) 和中 (Medium) 时,使用与前向渲染相同的方法。如果要使用高 (High) 质量 (PCSS) 过滤,必须在 HDRP 配置包中启用该设置。如需了解如何执行此操作,请参阅配置包文档的“示例”部分。
阴影遮罩 (Shadowmasks)
HDRP 支持两种混合光照模式:
启用阴影遮罩
要在 HDRP 中使用阴影遮罩,必须在 Unity 项目的 HDRP 资源中启用阴影遮罩支持,然后让摄像机在其帧设置 (Frame Settings) 中使用阴影遮罩:
- 在 Render Pipeline Supported Features 下,启用 Shadowmask 复选框。这样就能在 Unity 项目中启用阴影遮罩支持。
- 接下来,必须使摄像机使用阴影遮罩。在 HDRP 资源中,导航到 Default Frame Settings > Lighting,然后启用 Shadowmask 复选框,使摄像机默认使用阴影遮罩。
HDRP 中的特定设置
为了实现灵活的关照设置,HDRP 允许选择阴影遮罩针对每个光源的行为方式。可以通过更改光源的 Shadowmask Mode 来更改阴影遮罩的行为。将光源的 Mode 设置为 Mixed 即可在 Shadow 部分的 Shadow Map 下拉选单中显示 Shadowmask Mode。
Shadowmask Mode | 描述 |
---|---|
Distance Shadowmask | 当摄像机和光源之间的距离小于精准光源的 Fade Distance 时,使光源为所有游戏对象投射实时阴影。请参阅下文,了解方向光使用的替代距离属性。当光源和摄像机之间的距离大于 Fade Distance 时,HDRP 停止计算光源的实时阴影。此时将对静态游戏对象使用阴影遮罩,而非静态游戏对象不投射阴影。 |
Shadowmask | 使光源仅对非静态游戏对象投射实时阴影。当摄像机和光源之间的距离小于 Fade Distance 时,随后会为静态游戏对象将这些阴影与阴影遮罩合并起来。当光源和摄像机之间的距离大于 Fade Distance 时,HDRP 停止计算光源的实时阴影。此时将对静态游戏对象使用阴影遮罩,而非静态游戏对象不投射阴影。 |
方向光不使用 Fade Distance,而是使用位于场景体积的高清阴影设置 (HD Shadow Settings) 中的 Max Distance 属性。
Distance Shadowmask 更耗费 GPU 资源,但视觉效果更逼真,因为更靠近光源的实时光照比选用低分辨率来表示更远区域的阴影遮罩纹理更精确。
Shadowmask 更耗内存,这是因为摄像机使用阴影遮罩纹理来渲染靠近摄像机的静态游戏对象,从而需要更大分辨率的阴影遮罩纹理。
阴影更新模式 (Shadow Update Mode)
可以使用 Update Mode 来指定 HDRP 用于更新光源的阴影贴图的计算方法。可用的 Update Mode 值如下:
Update Mode | 描述 |
---|---|
Every Frame | HDRP 每帧都更新光源的阴影贴图。 |
On Enable | HDRP 在您每次启用游戏对象时更新光源的阴影贴图。 |
On Demand | HDRP 在您每次提出相应请求时更新光源的阴影贴图。为此,请在光源的 HDAdditionalLightData 组件中调用 RequestShadowMapRendering() 方法。 |
注意:不管光源使用哪种 Update Mode,如果 Unity 调整了阴影图集的内容大小(由于阴影贴图无法以原始分辨率适应图集),Unity 也会更新阴影贴图以执行所需的缩放。
接触阴影 (Contact Shadows)
接触阴影是 HDRP 光线在深度缓冲区内的屏幕空间中行进的阴影,位于近距离范围内。它们可以提供几何体的细小阴影,而这是阴影贴图通常无法捕获的。
有关如何启用和自定义接触阴影的详细信息,请参阅接触阴影 (Contact Shadows) 覆盖文档。
一次只能有一个光源可以投射接触阴影。这意味着,如果有多个光源可以投射在屏幕上可见的接触阴影,则只有占据主导优势的光源会渲染接触阴影。HDRP 根据光源包围盒的屏幕空间大小来选择占主导优势的光源。投射接触阴影的方向光始终为占主导优势的光源。