方向性阴影详情

本页将详细说明方向 (Directional) 灯的阴影。

注意:在移动平台上,方向灯的实时阴影始终使用 1 个阴影级联,并为硬阴影 (Hard Shadows)。

方向灯大多用于室外游戏的关键性灯光 – 日光或月光 – 中。可见距离非常大,特别是在第一人称和第三人称游戏中,往往需要对阴影进行一些调整,以获得最佳质量和性能平衡效果,适应当时的情况。

首先从第三人称角度游戏效果优良的阴影设置开始:

图中的阴影看起来非常漂亮!

在该图中,可见距离大约为 50 游戏单位,所以在质量设置 (Quality Settings) 中将阴影距离 (Shadow Distance) 设为 50。同样,阴影级联 (Shadow Cascades) 设为 4,阴影分辨率 (Shadow Resolution) 设为高,灯光使用软阴影 (Soft Shadows)。

下列章节仔细分析了方向灯阴影的每个方面:

  • 硬阴影与软阴影
  • 阴影级联 (Shadow Cascade) 数
  • 阴影距离很重要!


   硬阴影与软阴影

采用相同灯光设置,如果将阴影类型 (Shadow Type) 切换成硬阴影 (Hard Shadows),那么从照明区域到阴影区域的过度为“硬”,对象完全在阴影下或完全在照明区。硬阴影渲染较快,但通常看起来不太真

距离为 50,带 4 个级联的硬阴影。


阴影级联 (Shadow Cascade) 数

对于方向灯,Unity 可使用级联阴影贴图 (Cascaded Shadow Maps)(或者叫做“平行分割阴影贴图 (Parallel Split Shadow Maps)”)提供很好的阴影效果,特别是可视距离较长的情况。级联阴影将可视区域分割成几个逐步变大的部分,每个部分使用相同大小的阴影贴图,使接近观看者的对象的阴影贴图像素比远距离对象的较高。

在下图中,我们将使用硬阴影,因为阴影像素在该图中的可见度更高。

如果未使用级联阴影贴图,整个阴影距离(依然是 50 单位)必须被阴影纹理均匀覆盖。没有级联,硬阴影看起来就像这样:

距离为 50 的硬阴影,无级联。

每个地方的阴影纹理像素大小都相同。在远处看起来还不错,但不是越近质量就越高。阴影纹理覆盖整个可视区域。如果将其可视化,看起来就像这样:

无级联,阴影纹理均匀覆盖整个可视区域。

使用两个阴影级联时,整个阴影距离分成靠近观看者的一小块和远距离的一大块。带两个级联的硬阴影看起来就像这样:


距离为 50,带 2 个级联的硬阴影。

牺牲一点点性能,我们可获得近处更好的阴影分辨率。

带 2 个级联,两个阴影纹理覆盖可视区域中大小不同的部分。

最后,使用 4 个级联时,阴影距离被分成四个逐渐变大的部分。带 4 个级联的硬阴影看起来就像这样:

距离为 50,带 4 个级联的硬阴影。快看,可以看到了!

带 4 个级联,4 个阴影纹理覆盖可视区域中大小不同的部分。


阴影距离很重要!

阴影距离 (Shadow Distance) 对于方向灯阴影的质量和性能都极其重要。同阴影级联数一样,阴影距离也可在质量设置 (Quality Settings) 中设定,轻松按比例降低性能较低硬件中的阴影。

在阴影距离末端,阴影淡出,更远的对象无阴影。在大多数情况下,游戏中超过特定距离的阴影不会被注意到!

没有阴影级联,阴影距离设为 20 的硬阴影效果见下图。请注意,远处的阴影会淡出。同时,阴影质量比没有级联且距离为 50 单位的质量要高。

距离为 20,无级联的硬阴影。

如果将阴影距离设得太高,效果看起来会很差。在该图中,将距离设为 100 只会降低质量和性能,没有太大意义,场景中没有哪个对象超过 50 米远!

距离为 100,无级联的硬阴影。哎!

带级联大小和距离的阴影贴图要好得多。比如,相机前覆盖 300 单位的 4 级联软阴影见下图。在一定程度上说比本页顶端的图片效果差,但阴影距离增大 6 倍后也不错(当然,在该场景中阴影距离大没有什么意义)。

距离为 300,带 4 个级联的软阴影。