环境光遮挡 (Ambient Occlusion)
环境光遮挡效果可以使挨着折痕线、小孔、相交线和平行表面的地方变暗。在现实世界中,这些区域往往会阻挡或遮挡周围的光线,因此它们会显得更暗。
URP 将实时屏幕空间环境光遮挡 (Screen Space Ambient Occlusion, SSAO) 效果实现为渲染器功能。
注意:SSAO 效果是一种渲染器功能,独立于 URP 中的后期处理效果。此效果不依赖于体积 (Volumes),也不与体积相互作用。
以下几个图显示的场景分别将环境光遮挡效果关闭、打开以及只有环境光遮挡纹理。
场景已将环境光遮挡效果关闭。
场景已将环境光遮挡效果打开。
场景只有环境光遮挡纹理。
向渲染器添加 SSAO 渲染器功能
URP 将环境光遮挡效果实现为渲染器功能。
要在项目中使用环境光遮挡效果,请执行以下操作:
在 Project 窗口中,选择 URP 资源使用的渲染器。
Inspector 窗口显示渲染器属性。
在 Inspector 窗口中,选择 Add Renderer Feature。在列表中,选择 Screen Space Ambient Occlusion。
Unity 向渲染器添加 SSAO 渲染器功能。
现在,只要摄像机使用的渲染器带有 SSAO 渲染器功能,便具有环境光遮挡效果。
属性
本节将介绍 SSAO 渲染器功能的属性。
SSAO 渲染器功能属性。
Name
渲染器功能的名称。
Downsample
选中此复选框会将计算环境光遮挡效果的通道的分辨率降低到二分之一。
性能影响:很高。
将环境光遮挡通道的分辨率降低到二分之一会使要处理的像素数减少到四分之一。这会显著降低 GPU 的负担,但会降低效果的细节级别。
Source
选择法线矢量值的源。SSAO 渲染器功能使用法线矢量来计算表面上每个点在环境光照下的暴露程度。
可用选项:
- Depth Normals:SSAO 使用由
DepthNormals
通道生成的法线纹理。此选项可让 Unity 使用更准确的法线纹理。 - Depth:SSAO 不使用
DepthNormals
通道来生成法线纹理。SSAO 改用深度纹理来重建法线矢量。仅当希望避免在自定义着色器中使用DepthNormals
Pass 代码块时,才应使用此选项。选择此选项将启用 Normal Quality 属性。
性能影响:取决于应用。
在 Depth Normals 和 Depth 选项之间切换时,性能可能会有所不同,这取决于目标平台和应用。在广泛的应用中,性能差异很小。在大多数情况下,Depth Normals 会产生更好的视觉效果。
有关 Source 属性的更多信息,请参阅实现详细信息一节。
Normal Quality
此属性将在您在 Source 属性中选择 Depth 选项时激活。
更高质量的法线矢量会产生更平滑的 SSAO 效果。
可用选项:
- Low
- Medium
- High
性能影响:中等。
在某些情景中,Depth 选项产生的结果与 Depth Normals 选项相当。但在特定情况下,Depth Normals 选项可显著提高质量。以下几个图显示了这种情况的一个示例。
Source:Depth。Normal Quality:Low。
Source:Depth。Normal Quality:Medium。
Source:Depth。Normal Quality:High。
Source:Depth Normals。
有关更多信息,请参阅实现详细信息一节。
Intensity
此属性定义变暗效果的强度。
性能影响:微不足道。
Direct Lighting Strength
此属性定义该效果在暴露于直接光照下的区域中的可见程度。
性能影响:微不足道。
以下几个图显示了 Direct Lighting Strength 值如何影响不同区域(具体取决于它们是否处于阴影中)。
Direct Lighting Strength:0.2。
Direct Lighting Strength:0.9。
Radius
在计算环境光遮挡值时,SSAO 效果会从当前像素中获取此半径内的法线纹理样本。
性能影响:高。
降低 Radius 设置可提高性能,因为 SSAO 渲染器功能会采样更接近源像素的像素。这样可以提高缓存效率。
在距离摄像机较近的对象上计算环境光遮挡通道比距离摄像机较远的对象花费的时间更长。这是因为 Radius 属性会随对象缩放。
Sample Count
对于每个像素,SSAO 渲染功能会在指定半径内采用此数量的样本来计算环境光遮挡值。增加此值会使效果更平滑、细节更多,但会降低性能。
性能影响:高。
将 Sample Count 值从 4 增加到 8 会使 GPU 上的计算负担加倍。
实现详细信息
SSAO 渲染器功能使用法线矢量来计算表面上每个点在环境光照下的暴露程度。
URP 10.0 采用 DepthNormals
Pass 代码块为当前帧生成法线纹理 _CameraNormalsTexture
。默认情况下,SSAO 渲染器功能使用此纹理来计算环境光遮挡值。
如果您采用自定义 SRP,并且不想在着色器中实现 DepthNormals
Pass 代码块,则可以使用 SSAO 渲染器功能并将其 Source 属性设置为 Depth。在这种情况下,Unity 不使用 DepthNormals
通道来生成法线矢量,而是使用深度纹理来重建法线矢量。
在 Source 属性中选择 Depth 选项将启用 Normal Quality 属性。此属性中的选项(Low、Medium 和 High)决定了 Unity 在从深度纹理重建法线矢量时采用的深度纹理样本数。每个质量级别的样本数:Low:1,Medium:5,High:9。