Shadow技術-起點

起因

項目的Shadow開始出現了問題,有2個BUG報到了我的身上

  1. 比較薄的Mesh出現了漏光(Light leaking)現象
  2. Cube旋轉到一定角度,表面出現了“瑕疵”(Shadow Acne)

我開始意識到,確實需要一套比較完備、可控的陰影方案了

對Shadow的積累

目前我對Shadow技術的積累,僅限簡單的Shadow Map原理和知道CSM大致的實現方式。
在看到前面兩個BUG的時候,我大概知道是什麼導致的,可以通過調整ShadowMap的尺寸以及兩個bias參數來緩解這兩個BUG,但是還是想借這個機會,“一勞永逸”的解決項目Shadow方案同時提升一下自己在Shaodw方面的積累

解決路線

傳統手遊項目對於靜態物體大多使用烘焙陰影方案,動態物體可能使用Projector方式或者ShadowMap方式,配合Unity的Distance ShadowMask實現動靜結合,還是非常不錯的方案,效果和效率能達到一種完美的平衡(個人認爲)
但是,由於項目的特殊需求,場景並不能使用烘焙方式來作爲陰影解決方案(即使使用也可能需要實現一套Lightmap烘焙方案)。
目前項目使用的是傳統的Shadowmap方式,基於Unity LWRP(4.0),Distance默認設置爲25,1024尺寸
在這個配置下,無論如何調整bias都無法完美解決Light leaking、error Self-Shadow和Peter paning這三種問題
本質上,還是Shadowmap的精度問題。雖然可以通過提高Shadowmap的尺寸,但是我個人認爲2048對於移動平臺並不合適

調整Depth Bias和Normal Bias

首先通過調整這兩個參數看是否能解決問題
這兩個參數通過拉近物體的z值,和縮小物體來緩解Shadow Acne和錯誤的Self-Shadow問題
但是這兩個值過大都會導致Peter Paning(Light leaking)問題,物體會看起來懸浮在平面上
而解決Light leaking問題,有兩種方案

  • 一個是通過避免使用過薄的Mesh
  • 一種方法是進行Cull Front
    第一種就不說了,是一種避免方式,不是解決方式
    第二種其實在兩個物體過於貼近的情況下,反而會產生更嚴重的懸浮問題,但是在距離不是很近的情況下,確實能很好的解決shadow acne和懸浮問題

Close Fit和Stable Fit

調整bias無望,開始選擇對比Standard(Unity內置管線)對於陰影的實現,主要是因爲目前使用的4.0版本的LWRP其實缺陷比較多,從Standard找到“穩定”的方式也是有可能的,通過對比發現Close Fit確實能提高不少陰影的效果
但是Close Fit實際上對於特定場景結構下,選擇最小的光源視錐範圍進行Shadowmap的生成,本質上是提高Shadowmap的精度。在Caster物體比較多、大的情況下,會退化到Stable Fit的效果上
雖然沒有解決我的問題,但是提出了關鍵的線索-提高Shadowmap精度

思考

其實,調整bias來解決shadow的一些瑕疵問題是正確的,但是前提是shadowmap的精度足夠,close fit在特定情況下能解決,也是因爲close fit本質上在提高shadowmap的精度
在調整shadowmap尺寸不可行的情況下,調整shadow distance也是一個方案,但是調的過小,遠處物體陰影丟失(因爲沒有烘焙的陰影)也是無法忍受的現象

CSM

CSM是解決shadowmap精度和性能直接平衡問題一種比較好的方法,之前考慮到性能問題關閉了CSM而使用傳統的shadowmap,不過仔細一想,可能CSM性能的消耗不是很大
CSM會在距離相機較近的物體上使用精度較高、光源視錐更小(合適)來進行Shadowmap的渲染,遠處物體使用更低精度、更大的光源視錐進行渲染
遠處物體使用更小尺寸的Shadowmap,更大的光源視錐對比傳統shadowmap方式應該性能更加節省,但是具體還沒有性能測試,但是理論上感覺即使比傳統shadowmap費,也費不了多少
準備研究一下CSM進行實驗,如果一切順利,CSM是項目即使使用的陰影方式(Mobile+PC)
具體細節,等仔細研究CSM過程中發現吧

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章