文档变更记录: 由 Daniel Wright 创建。
概述
带符号的距离场阴影是一种不同的预计算阴影编码方法,它第一次被引入是在版本QA_APPROVED_BUILD_JUL_2009中,目前仅在主光源中使用。
请查看技术博客查看关于‘主定向光源 (Dominant Directional Light) ’的更多信息。
它们的工作原理
距离场阴影是基于一篇最近在经过 alpha 测试的放大功能(作者 Valve Software)上的论文实现的。它的原理是使用到最近阴影过渡的距离代替标准的阴影因数存储(0 代表阴影,1 代表没有阴影)。然后为了在运行时重新构建阴影,只要简单地缩放或偏移到想得到的半影尺寸的距离即可。这样最大的好处是如果分辨率降低,阴影过渡可以随着距离场更温和地下降。当直接地存储阴影因数时,降低分辨率将会导致斑驳和锯齿阴影。当在使用距离场阴影时,降低分辨率,阴影的过渡仍然是同样的尖锐度,但是在阴影过渡的角落或高频率拐角处会变得更加弯曲。在我们测试的关卡中,在主光源下的距离场阴影在 1/2 分辨率(在每个维度)的情况下要比存储阴影因数的方法在全分辨率的情况下的阴影看上去更好,尽管距离场阴影使用内存的量仅是存储因数方法产生阴影的 1/4。
限制
有一个弊端是仅可以重新建全亮到全黑的阴影过渡,所以植被的细节阴影在使用老的阴影产生方法看上去更好一些,并且不再存储半影的尺寸(为了减少内存的使用量),所以在任何地方都使用同样的半影尺寸。也不支持来自主光源的半透明阴影,并且预计算的环境遮挡不能影响来自主光源的直接光照。
对比 1
具有变化的半影尺寸的距离场阴影。注意:实际上迁入的阴影有统一的半影尺寸来使内存使用量减半。这个是每个贴图像素占 2 个字节。
和上面的距离场阴影具有同样分辨率的阴影因数阴影。它是其它的可切换的光源使用的,每个贴图像素占 1 个字节。
在较高分辨率下的阴影因数阴影,调整它的分辨率来尝试获得和距离场阴影同样的效果。分辨率在每个维度上增加 2-4 倍,最终的光照贴图内存消耗大约比每个贴图像素占两个字节的距离场阴影高 3.7 倍。
对比 2
距离场阴影。
和上面的距离场阴影具有同样分辨率的阴影因数阴影。
在较高分辨率下的阴影因数阴影,调整它的分辨率来尝试获得和距离场阴影同样的效果。