實時渲染中的軟陰影技術

本文描述的是基於Shadow Mapping的軟陰影技術,讀者應該對Shadow Mapping 有基本的理解。

(本文同步發表在我的博客)

關於陰影走樣

Shadow Mapping 有一個嚴重的問題就是走樣(Aliasing),這一點在我第一次實現Shadow Mapping的時候也非常明顯

圖中陰影邊緣明顯的鋸齒就是走樣

這是一個老生常談的問題了,多年來,相比於Shadow Volume,Shadow Mapping技術更加流行,而走樣問題是由於Shadow Mapping的技術特點產生的,因此在學界近30年都在討論如何解決,也確實取得了不少的進展。由於篇幅所限,我將介紹一些有代表性的技術。

我們首先還是來分析一下Shadow Mapping產生鋸齒的原因。以聚光燈為例,如果光源和遮擋物離場景很遠,當我們對場景中的一點找到對應shadow map中的深度,我們會在很大的矩形範圍內,得到同樣的深度值,這樣就形成了鋸齒。

除了鋸齒的問題,我們發現無論遮擋物有多遠,陰影的邊界依然很明顯,這就是所謂的硬陰影。

綜上,我們需要解決兩個問題鋸齒和明顯的陰影邊界

為了更好地分析問題,我們定義一個shadow test function

s(x) = f(d(x), z(p))

x是攝像機看到的場景中某一點,d(x)是這一點到光源的距離,p是在陰影紋理中遮擋物的位置,z則是遮擋物的深度。

顯然,對於標準陰影貼圖技術

f(d, z) =egin{cases}1, d < z \0, d geq zend{cases}

這個函數是離散的,我們希望對這個函數做一個變換,使其連續化。

我們可以直接對f(d, z)濾波,達到連續化的目的,然而這樣的操作效率並不高,我們希望先一步對z進行濾波處理,這樣我們就能在shadow pre-pass階段進行濾波,不用在光照計算階段進行重複的fetching和計算(這樣效率很低)。

但是如果我們真的直接對z濾波,我們得不到想要的結果。原因很簡單:,對f(d,z)濾波和對z濾波是完全不一樣的,這裡的f(d,z)是一個階躍函數,由卷積定理,下面的式子不成立:

[w ast f(d(x), z)](p) 
eq f(d(x),(w*z)(p))

因此,我們看起來只能從f(d, z)入手,但是有些方法可以先把f(d, z)稍微變換一下,使其能滿足卷積定理,從而應用pre-filtering

軟陰影演算法概覽

軟陰影主要解決兩個問題,1:如何高效的blur,也就是如何生成一致的軟陰影 2:如何利用距離控制陰影軟硬程度,並與1中的演算法結合

一致性軟陰影:

  • Percentage-Closer Filter (PCF)

    PCF是直接對f(d,z)濾波的方法,效率相對較低

  • Convolution Shadow Mapping (CSM)

    CSM把ff變成傅里葉級數求和的形式,從而得到一系列函數的和,對這些函數就有可能應用pre-filtering

  • Variance Shadow Mapping (VSM)

    VSM巧妙地利用了切比雪夫不等式,f(d,z)是一個單邊的近似公式,在這種情況下,對z進行pre-filter的效果是可以接受的

  • Exponential Shadow Mapping (ESM)

    ESM相當簡潔,使用的是一個單邊指數函數來近似,效率和空間都要好的多,支持pre-filtering

距離相關的陰影:

這個方面最著名的是Percentage-Closer Soft Shadows (PCSS)

本文將逐一介紹這些技術

PCF濾波

既然要模糊陰影邊緣,那我們就可以利用多重採樣和插值函數,並將插值的結果作為f(d, z)的值。

這樣,在陰影的邊緣,離陰影越遠的未被陰影照射到的部分採樣結果就越接近照亮部分。

由於多重採樣的平均值相對於單次採樣更接近期望深度,因此這個濾波演算法也被稱為Percentage-Closer Filter

PCF是一種很樸素的思想,帶來的問題也很多。

  • 首先,多重採樣非常影響性能,單次採樣的開銷取決於GPU是否支持Pre-Fetch Texture和這個採樣是否是Simple Texturing(不依賴其他採樣結果的採樣)。但無論單次採樣效率如何,多重採樣在演算法層面效率就低下。

通過控制多重採樣的範圍和步長,我們可以控制採樣的效率和陰影的總體軟硬程度,在相同步長下,一個3x3的PCF不如一個一個5x5的PCF「軟」

  • 其次,PCF還不能支持pre-filtering(所謂pre-filtering是指在渲染陰影紋理的時候就進行filter濾波處理),無法利用mipmap做完美的三線性插值

  • 最後,基於採樣的陰影模糊一般都會有二次走樣的問題,這是基於sampling的方法無法繞過的問題

效率和存儲

存儲:32F

PCF是是完完全全的非pre-filtering的方法,性能取決於場景複雜度和過濾核的大小,通常來說性能表現較差

Convolution Shadow Maps:卷積陰影

CSM的f(d,z)表達式為:

f(d,z) approx  frac{1}{2} + 2sum_{k=1}^Mfrac{1}{c_k}sin[c_k(d-z)]

其中

ck=π(2k?1)ck=π(2k?1)

當M取不同的值的時候,f(d,z)的曲線如下:

考慮到效率和實現效果,M應該取大於4的值,

當d=z的時候,f(d,z)取值0.5,這顯然是不對的,因為當d=z,我們應該得到一個完全無遮擋的表面,所以應對原始的函數取一點偏移, 使d=z時f(d,z)取值1,得到的函數圖像如下:

hustdanielhu.com/images

我們也可以對f(d,z)做一下變形,通過簡單的f(d, z) 
ightarrow 2f(d, z),並裁剪超過1的部分,

這樣也能得到可以接受的圖像

CSM存在的問題

觀察CSM的圖像,在d=z的兩邊曲線都出現了抖動,反應在渲染結果上就是物體在和光源連線上的忽明忽暗

抖動和漏光對CSM來說就像雙刃劍的兩面,要麼抖動多一點,要麼漏光多一點,

效率和存儲

存儲:M*(R8G8B8A8) (M geq 4)

CSM支持pre-filtering,M越大,效率越低,但比起PCF來說要好很多

Variance Shadow Mapping: 深度概率分布和切比雪夫不等式

為了分析陰影邊緣分布的統計規律,我們考慮光源視角的深度為一個隨機變數x。根據切比雪夫不等式的單邊公式,深度大於給定值t的概率有一個上界

p(xgeq t)  leq frac{sigma^2}{sigma^2+(t-mu)^2}

這個上界有多接近於p(x geq t)?我們可以假設一個被稱為single-bounded的理想模型。

假設把深度為d1的平面投影到深度為d2的平行平面,那麼在深度為d1的平面邊緣,可以假設投影深度正好為d2的概率為p(這個p也可以認為是pcf的值)那麼可以得到深度的期望為

E(x) = pd_2+(1-p)d_1

E(x^2) = pd_2^2+(1-p)d_1^2

期望的方差:

sigma^2 = E(x^2) - E(x)^2 = (p-p^2)(d_2-d_1)^2

這樣我們就可以根據上面提到的切比雪夫的單邊公式來計算深度小於d2的概率的上界

egin{align}P{max} & = frac{sigma^2}{sigma^2+(mu-d_2)^2} \& = frac{(p-p^2)(d_2-d_1)^2}{(p-p^2)(d_2-d_1)^2 + (pd_2 + (1-p)d_1-d_2)^2} \& = frac{(p-p^2)(d_2-d_1)^2}{(p-p^2)(d_2-d_1)^2 + (1-p)^2(d_2-d_1)^2} \& = frac{p-p^2}{1-p} \& = pend{align}

這個結果剛好就是p的值, 這表明p_{max}p在理想情況下是一樣的

雖然這是一種非常特殊的情況,只有一次投影,一個遮擋物,但是這個結果表明,由切比雪夫不等式計算出來的上界很可能只有一點點的偏移,我們可以直接採用這個上界作為陰影測試函數f

然而,當對VSM應用一個較大核的濾波,也就是像基於VSM生成軟陰影的時候,將會導致結果有較大偏差

VSM的實現

VSM的實現關鍵在於渲染到深度紋理的同時渲染深度的平方,並在shading pass計算期望和方差。這個深度貼圖會佔用比之前多一倍的內存

實現需要注意幾個地方:一是在shadow pass 的時候就利用mipmap,高斯模糊等技術做好預處理,減少鋸齒和突變。二是在shading 的時候,注意只有深度大於期望的時候才利用切比雪夫公式進行近似計算(這是由於計算的深度是一個上界)

效率和存儲

存儲:32+32

VSM同樣支持pre-filtering但效率比CSM穩定,開銷也更小

Exponential Shadow Mapping(ESM)

在ESM中,s(x)的形式是:

s(x) = f(d, z) = e^{-c(d-z)} = e^{-cd}e^z

顯然這個表達式是單邊有效的,對於d<z的情況,e^{-cd}e^z將會爆炸式增長,我們暫時先假定d<zf(d, z)=1

得到ESM的圖像表示:

有了這個表達式,我們就有可能實現pre-filtering,從而提高性能。

下面的式子證明了經過ESM處理之後filtering和pre-filtering是等價的

egin{align}s_f(x) &= wast f(d(x), z) \&= wast (e^{-cd(x)}e^{cz} \&= e^{-cd(x)}wast e^{cz} \end{align}

常數指數c的選擇會影響ESM的s(x)s(x)曲線:C越大,s(x)越陡峭,也就越接近真實的陰影;當c的值偏小的時候,會造成漏光。

C的上限受到浮點數精度的影響。32位float對應的c的經驗最佳值大概在80左右,這個值生成的陰影比M=16的CSM更好

ESM存在的問題

下面這個圖很好的反應了由shadow map精度帶來的問題

觀察圖中的邊緣,發現有過亮的現象產生,我們用一張圖可以清晰明了的解釋

對於陰影紋理,存儲和採樣點都在紋素中心,當我們計算d(x)-z(p)時就會出現小於0的情況。於是我們得到一個全白的結果,而正確結果應該是有50%的陰影。

這種情況出現在多重陰影的邊緣,原論文中有兩種解決方案,一種是增加一個Z_{max}的pre-pass,還有一種是對e^{-cd}e^z設置一個閾值1+sigma。這兩者都很好理解,Z_{max}的方法通過找找到附近的最大深度值來判斷是否取樣到了比d還遠的表面,閾值檢查e^{-cd}e^z是否超過某個值,若超過某個值就有可能遇到了上面的情況

總的來說,閾值1+sigma的效率比Z_{max}要好,沒有多出來的pre-pass,更何況要計算Z_{max}免不了要採樣多次;閾值的方法雖然不能保證所有的情況都能處理,但勝在效率高,存儲小。

ESM的實現

ESM只需要一個32F的浮點紋理,存儲e^{-cd}e^z的值,之後可以直接對陰影紋理進行線性插值,高斯模糊等操作

存儲和效率

存儲:32F

ESM比之前提到的幾乎所有方法都要好,不需要MRT,支持pre-filtering,沒有震蕩現象,可以說是最優的方案

PCSS

PCSS是Percentage-Closer Soft Shadows的簡稱。PCSS和上面的演算法解決的是不同的問題。

PCSS解決了前述演算法軟陰影的一致性問題。原本的濾波演算法不管遮擋物和陰影接收物體相距多遠,都生成一致的「軟」的陰影。

PCSS 通過一個和光源位置相關的相似三角形來控制軟陰影的採樣搜索範圍。下面這個圖展示了PCSS如何根據光源,遮擋物,和陰影投射目標三者確定搜索範圍

hustdanielhu.com/images

PCSS首先假定光源是一個區域光(area light),這看起來好像很不可思議,但其實這才是我們最常見的光源。

傳統的點光源,聚光燈和平行光,其實都不過是某種模擬,比如點光源模擬小燈泡,聚光燈模擬手電筒,平行光模擬太陽,其實嚴格來說這些都是區域光,軟陰影形成的很大一個原因就是區域光的存在。

為了在舊的光源體系中加入區域的概念,我們假定光源是一個始終平行於接收面的圓形,並用uniform變數控制這個圓形的半徑

這樣,我們就可以估算根據光源,遮擋物,被遮擋物三者的距離估算陰影的軟硬程度

計算公式如下:

W_{Penumbra}=frac{(d_{Recevier}-d_{Blocker})dot{w_{Light}}}{d_{Blocker}}

原理非常簡單,就是利用了一下三角形的相似性

PCSS的主要貢獻在於形成了所謂「動態」的陰影,PCSS確定的這個搜索範圍,也可以看做是某種模糊半徑,或者卷積核的大小,並沒有要求一定按照多重採樣(PCF)的方式來實現,因此可以很好地和VSM,ESM等技術結合

參考文獻

[1] Fernando, Randima. 「Percentage-closer soft shadows.」 ACM SIGGRAPH 2005 Sketches. ACM, 2005. Percentage-closer soft shadowslabri.fr/perso/guenneba

[2] Donnelly, William, and Andrew Lauritzen. 「Variance shadow maps.」 Proceedings of the 2006 symposium on Interactive 3D graphics and games. ACM, 2006. Variance shadow maps

[3] Annen, Thomas, et al. 「Convolution shadow maps.」 Proceedings of the 18th Eurographics conference on Rendering Techniques. Eurographics Association, 2007. Convolution shadow maps

[4] Annen, Thomas, et al. 「Exponential shadow maps.」 Proceedings of graphics interface 2008. Canadian Information Processing Society, 2008. Exponential shadow maps

[5] Bavoil, Louis. 「Advanced soft shadow mapping techniques.」 Presentation at the game developers conference. Vol. 2008. 2008. developer.download.nvidia.com

[6] Shen, Li, Jieqing Feng, and Baoguang Yang. 「Exponential soft shadow mapping.」 Computer graphics forum. Vol. 32. No. 4. Blackwell Publishing Ltd, 2013. Exponential Soft Shadow Mapping


推薦閱讀:

光影之下(一)- 從Logo談起

TAG:计算机图形学 |