ShadowMap & ShadowVolume

來源:互聯網
上載者:User

標籤:style   blog   http   color   使用   strong   2014   問題   

【ShadowMap】

  一個物體之所以會處在陰影當中,是由於在它和光源之間存在著遮蔽物,或者說遮蔽物離光源的距離比物體要近,這就是 shadow mapping 演算法的基本原理。

  Pass1: 以光源為視點,或者說在光源座標系下面對整個情境進行渲染,目的是要得到一副所有物體相對於光源的 depth map (也就是我們所說的shadow map),也就是這副映像中每個象素的值代表著情境裡面離光源最近的 fragment 的深度值。由於這個pass中我們感興趣的只是象素的深度值,所以可以把所有的光照計算關掉,開啟 z-test 和 z-write 的 render state 。

  Pass2: 將視點恢複到原來的正常位置,渲染整個情境,對每個象素計算它和光源的距離,然後將這個值和 depth map中相應的值比較,以確定這個象素點是否處在陰影當中。然後根據比較的結果,對 shadowed fragment 和 lighted fragment 分別進行不同的光照計算,這樣就可以得到陰影的效果了。 

  從上面的分析可以看出來,depth map的渲染只和光源的位置以及情境中物體的位置有關,無論視點怎麼運動,只要光源和物體的相互位置關係不變,shadow map就可以被重複使用,因此對於沒有動態光源的情境,shadow mapping 是很明智的一種選擇。

【ShadowVolume】

1、z-pass 演算法。

  z-pass 是 shadow volume 一開始的標準演算法,用來確定某一個象素是否處於陰影當中。其原理是:

  Pass1:enable z-buffer write ,渲染整個情境,得到關於所有物體的 depth map 。注意這裡的 depth map 和 shadowmapping 裡面的區別是 shadow volume 裡面的 depth map 是以真實視點作為視點得到的,而 shadowmapping 裡面的 depth map 是以光源為視點得到的。

  Pass2:disable z-buffer write ,enable stencil buffer write,然後渲染所有的 shadow volume 。對於 shadow volume 的 front face( 既面對視點的這一面 ) ,如果 depth test 的結果是 pass,那麼和這個象素對應的 stencil 值加1,否則stencil 值不變。而對於 shadow volume 的 back face(遠離視點的一側 ) ,如果 depth test 的結果是 pass,stencil 值減1,否則保持不變。

  用一句簡單的話來概括 z-pass的演算法就是從視點向物體引一條視線,當這條射線進入 shadow volume 的時候, stencil 值加1,而當這條射線離開 shadowvolume 的時候,stencil 值減1。如果 stencil 值為零,則表示實現進入和離開 shadow volume的次數相等,自然就表示物體不在 shadow volume 內了。

  

  Pass3:第二步完成以後,根據每個象素的 stencil 值判斷其是否處於陰影當中(如果 stencil 的值大於零,則這個象素在 shadow volume 內,否則在 shadow volume 的外面),然後據此繪製陰影製作效果。

2、Z-Pass的問題。

  以上的討論都是基於視點在 shadow volume 外面的情況。在這個條件可以得到滿足的情況下,z-pass 演算法工作的很好,不過一旦視點進入到了 shadow volume 裡面,z-pass 演算法就會立即失效。   

  

3、Z-Fail演算法。

  Z-Fail 演算法是 John Carmack,Bill Bilodeau 和 Mike Songy 各自獨立發明的,其目的就是解決視點進入 shadow volume 後 z-pass 演算法失效的問題。

  Pass1:enable z-write/z-test, 渲染整個情境,得到 depth map 。 ( 這一步和 z-pass 的完全一樣 )

  Pass2:disable z-write, enable z-test/stencil-write 。渲染 shadow volume, 對於它的 back face ,如果 z-test 的結果是fail, stencil 值加1,如果 z-test 的結果是 pass,stencil 值不變。對於 front face,如果z-test 的結果是 fail,stencil 值減1 ,如果結果是 pass,stencil 值不變。

  

  Z-Fail演算法其目的就是解決視點進入 shadow volume 後 z-pass 演算法失效的問題。

參考:http://blog.163.com/wmk_2000_ren/blog/static/138846192201019114117466/

 

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.