Real-Time Shadows 1

Shadow Mapping:從光源處記錄一張場景的最淺深度表,然後再從攝像機處看向場景的某個物體向光源連線,比較此時物體到光源距離和深度表記錄的距離,如果大於深度表記錄的距離,則說明被遮擋在陰影內,如果小於,則不在陰影內。

 

 Shadow Mapping:有兩個問題,自遮擋和陰影鋸齒的問題。

自遮擋是因爲Shadow Map上的像素記錄的深度值是常數,它所記錄的場景是離散的,此時所看到的場景是一片片的,當攝像機看向某個點的時候,該點的位置可能會被前面的場景遮擋。它的實際距離會大於前面場景的距離。

以平面爲例,當光線垂直平面時,就不會有這個問題,當光線與平面幾乎平行時,問題最大。

爲了解決自遮擋的問題,可以忽略那段很小的距離,就把它當作光源能夠照射到上面,這段很小的距離(bias)受光源與平面的夾角影響,夾角越大,距離會越短,相當於光線與平面垂直。夾角越小,相當於光線與平面平行,距離會越大。雖然解決了自遮擋的問題,但會在人物的腳部出現陰影斷連的情detached shadow issue,這是因爲在腳部的陰影也被當作光源能夠照射到了。

 

 有一種解決方法,就是在記錄深度時,不僅記錄最小深度值,還會記錄次小深度值,然後比較的時候使用最小和次小的中位數來比較,但會有一系列問題,並沒有實際使用。實際情況是一般使用一個不會產生自遮擋和陰影斷連的bias來模糊處理。

 

 另外一個問題是陰影的走樣問題,因爲shadow map是用像素來存儲的,如果分辨率不夠大,就會產生走樣的問題。

 

 補充一些微積分公式:

 

 下圖中的約等式,在積分限很小或g(x)變化也很小的時候會很近似相等。

 

 帶有visibility的渲染方程可用這個約等式把visibility拿到前面去

 

 此時,積分限足夠小代表了是點光源,如果Li變化很小,是說明面光源各處發出的Radiance相同,BRDF變化很小是代表了漫反射,在各個方向Radiance的變化都會相同。如果此約當式不符合,說明不適合使用Shadow Mapping。

 

 PCF是陰影的抗鋸齒方法,一般對陰影的判斷是從着色點往光源方向連線,查詢shadow map,PCF是和shadow map上對應像素周圍的(比如9*9,此處的9*9代表了filter的大小)像素比較,然後取平均值。這種方法不但解決了走樣問題,同時還能用於做軟陰影。

 

 

如果不filter的話,就是硬陰影,如果filter比較大,陰影就會比較軟。

 

可根據遮擋物和陰影接收面的距離來動態調整filter,來模仿出更好的實際效果。圖中鋼筆的筆尖部分,陰影比較銳利,是因爲筆尖離紙面(陰影接收物)很近,鋼筆的筆槓部分陰影比較模糊,也是因爲筆桿離紙面比較遠。

 

 

 

從圖中可知, Filter size與blocker distance和麪光源大小有關。

 

 假設面光源大小不變且已知,filter就只和blocker depth有關,PCSS算法的第一步就是確定average blocker depth,也是從着色點連向光源(此處的光源是點光源,因爲面光源沒有shadow map,是在模擬面光源的軟陰影)。記錄周圍能夠遮擋着色點的像素深度,然後取平均值。在獲得average blocker depth後,就可以根據average blocker depth來計算filter大小,然後就是PCF的步驟,從着色點連向光源,記錄filter範圍內的是否遮擋(即0,1值)取平均值。

 

 在PCSS的第一步,需要查詢某個範圍來確定average blocker depth,從着色點連向面光源,也就是下圖中的四棱錐,然後在shadow map上的範圍就是查詢範圍。

 

 

 

 

 

 

 

 

 

 

 

 

 




 

 

 

 

 

 

 

 

 

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