阴影体算法
① 影子传说——三种Shadowmap改进算法的原理与在Unity中的实现
本文深入探讨了三种改进Shadowmap的算法——ESM(Exponential Shadow Mapping)、VSM(Variance Shadow Mapping)和EVSM(Exponential Variance Shadow Mapping)。Shadowmap是处理阴影、间接光照和反射等问题的通用解决方案。然而,基础Shadowmap存在自阴影和阴影悬浮等固有缺陷,且只产生非0即1的阴影值,导致阴影边缘产生锯齿。为了解决这些问题,人们发明了PCF(Percentage Closer Filtering)算法,以生成软阴影并抗锯齿。然而,PCF算法仍存在诸多问题,因此出现了预过滤Shadowmap算法,如ESM、VSM和EVSM。
ESM通过使用指数函数替代基础Shadowmap中的深度函数,以实现阴影边界渐变,减少突变现象。实现方法包括ESM的预过滤,使用软硬件模糊手段提前过滤Shadowmap,降低计算阴影的时间复杂度。然而,ESM存在漏光问题,且在特定场景下效果有限。VSM算法将阴影问题视为概率问题,通过单边切比雪夫不等式求阴影值的最大值,以实现软阴影效果。VSM同样存在漏光问题,以及在特定场景下的光渗问题。解决方法是通过重映射阴影值,调整效果的硬软程度。此外,VSM在16位深度下效果不佳,基本无法在移动平台上应用。
EVSM算法通过结合ESM和VSM的优点,采用特定函数Wrap(x)对z和d求切比雪夫不等式,以实现软阴影效果。实践中,EVSM通常使用额外的函数进一步优化,减少漏光问题。尽管EVSM在性能和效果上有所改善,但在移动平台上仍受限于需要使用四通道纹理。
综上所述,尽管预过滤Shadowmap算法在某些方面有所改进,但最通用且有效的阴影解决方案仍然是PCF。然而,了解这些新算法对于提高图形渲染效率和视觉效果具有重要意义。最后,本文中所使用的项目地址为SilverClawko/PrefilterShadow,供读者参考。