陰影體演算法
① 影子傳說——三種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,供讀者參考。