URP 的影子為什麼模糊? Sphere Fit、Tight Fit 與高度切片的差異
遊戲當中的陰影,時常面臨鋸齒的困擾。最直接的做法是提高 Shadow Map 的尺寸,但這會大幅增加記憶體開銷。因此,如何在有限的解析度下「更有效率地利用 Shadow Map」,就成了關鍵。 斜視角遊戲常見的問題:角色靠近相機時,影子邊緣有明顯的鋸齒,甚至出現縫隙。原因不在貼圖解析度不夠,而在於 貼圖涵蓋了太大的世界範圍 。 這邊從 Shadow Map 的原理講起,再比較三種把 Shadow Map 對準畫面的做法: Sphere Fit 、 Tight Fit ,以及加上 高度切片 的 Tight Fit 。 影子是怎麼畫出來的 即時影子用的是 Shadow Map:先從光源視角渲染一張深度貼圖,再讓每個像素和它比較,判斷是否被擋住。貼圖解析度固定(例如 2048×2048),涵蓋的範圍越大,每個像素(texel)對應的面積就越大,邊緣就越粗糙。 為了讓近處更精細,常把視錐沿深度切成幾段(Cascade),每段各做一張貼圖。每一段要決定光源用多大的正交投影框去涵蓋它,這一步叫 擬合(fit) 。框越貼近真正需要的範圍,貼圖就越不浪費。 三種擬合方式 下圖是側視示意:相機斜著往下看,藍色梯形是視錐的一段切片,切到地面以下的部分是灰色。彩色斜帶是 Shadow Map 涵蓋的範圍(沿著光線方向延伸)。 Sphere Fit Tight Fit Tight Fit + 高度切片 涵蓋寬度 100% 涵蓋寬度 約 84% 涵蓋寬度 約 59% 示意圖。圖中的寬度比例是由圖面座標算出,不是引擎的實測數字。 1. Sphere Fit(Unity URP 預設) 用一顆球把這一段視錐切片整個包起來,再以球的直徑當作投影框的邊長。 優點: 球的大小不會隨相機旋轉改變,所以 Shadow Map 非常穩定,轉動相機時影子邊緣不會閃爍。 缺點: 球一定比視錐切片大,多出來的範圍都在浪費貼圖。 2. Tight Fit 把切片的 8 個角點轉到光源空間,取最小的軸向包圍盒(AABB)當投影框。 優點: 範圍比球小,同一張貼圖的 texel 更密,影子更清楚。 缺點: 包圍盒的大小會隨相機旋轉而變,所以旋轉時陰影邊緣可能輕微爬動。平移相機時,把框對齊 texel 格線就能保持穩定,旋轉時則無法完全消除。另外,圖中灰色的地面以下部分、以及天空,仍然在涵蓋範圍內。 3. Tight F...