Deferred Lighting (延遲光照) + Light Pre-Pass 實現多光源動態陰影

http://blog.csdn.net/pizi0475/article/details/37877955

 一直以來,不明白多光源動態陰影應該如何高效的實現,直到在網上查閱了大量的文章,得知虛幻3引擎裏用到了 Deferred Lighting (延遲光照)渲染系統,實現了多光源的動態光照和陰影,我猜其它遊戲中的實現方法也一定是大同小異了。
  於是我花了兩個星期研究,有了現在的結果。延遲光照來源於一種基本的思想,三維變二維的處理方式,不過它變的很完整,除了把整個視口的顏色信息畫到紋理,還把幾何數據(座標,法線)也分別畫到了紋理上,使每個像素都有了完整的頂點信息。這一組紋理被稱作“G-Buffer”,我一直覺得不知道怎樣翻譯比較好,“幾何紋理緩存”?總之每幀的渲染中幾何模型只畫了一次,剩下的都是圖像處理了,每加一個光照,就用G-Buffer的信息處理一次光照效果,累加到最終的輸出。如果有一盞以上的燈光,最終場景的顏色亮度會超過1.0,所以必須用浮點紋理,也必須進行後期HDR效果處理,整個渲染過程變的十分完美。在這些步驟中,控制各種特效的開和關變的很容易,我覺得這是一大好處,雖然它本身的實現過程很麻煩。
  在具體的實現中,要解決的問題還是很多的,主要是畫半透明物體的問題。網上很多文章都是大概雷同的解釋,就是對半透明物體依然使用傳統的方法繪製,單獨走一個管線。我覺得這是個最差的設計。畫出那麼多G-Buffer就是爲了方便進行各種後期效果處理的,加上必須要做HDR處理,已經消耗很多時間了,中間要做一次傳統方法的繪製豈不是嚴重效率低下?而且效果是要統一的,所有的材質效果,光照效果,陰影效果,無論是否半透明都要在兩套渲染過程中做的一模一樣,實在不是一件容易的事。於是我想了一個把半透明物體也畫到G-Buffer中的辦法,對於半透明的物體,顯示的顏色是自身和後方物體顏色的混合值,但是對座標紋理和法線紋理的渲染就要有複雜一點的處理,當物體透明度較高時,不足以產生陰影了,就認爲所在像素的深度是後方物體的深度,如果半透明度比較低,希望產生陰影,則像素的深度是半透明物體自身的深度,所以只要在HLSL中加上這樣的判斷,決定是否輸出座標紋理和法線紋理的像素後,把相應像素的w值置爲0或1即可。
  在設計過程中,對光照階段的處理加入了 Light Pre-Pass。Light Pre-Pass 在網上有一些爭論,我覺得不必非要和 Deferred Lighting 一較高下,最好是結合起來一起發揮功效。Light Pre-Pass不是直接用G-Buffer和每個燈光畫出最終效果,而是把光照信息單獨放到一個紋理處理(所謂的 Light Pre-Pass 過程),然後預先算出所有光源的照射亮度,累加到一個浮點紋理上(數值已經HDR了),最後和G-Buffer中的數據計算物體的最終顏色,可以得到一個HDR顏色數值的場景,然後做HDR效果處理。本來希望這樣處理可以節約一些時間,但是從實際來看效率提高不多,可能是逐像素光照計算太耗時了,這一步無論如何都逃不掉,不過可以使程序邏輯更爲清晰。
  性能評價:
  在整個流程中,只運行了一次VS,剩下的所有處理都靠PS,而且每個PS都相當複雜,每幀要反覆十幾次圖像處理。所以對顯卡的性能要求還是有點高了。理論上講,只要顯卡足夠強,可以畫出任意多個光源的光照和陰影,但是前提是每個光源都要預先渲染一個自己的ShadowMap,畫ShadowMap是根據光照空間進行特殊的裁剪,而且光照空間一般都很大,由於這個原因,想畫出多個光源的陰影仍然是個困難事。在GeForce-7300GT上,最多畫4個光源,再多就變幻燈片了,而且模型數量不能太多。
  缺點總結:
  延遲光照的優點當然就不用說了,所以直接說它的缺點。主要就是消耗存儲資源太多,現在的硬件在多目標渲染時要求所有目標緩存格式相同,爲了保存座標和法線,被迫要使用A32B32G32R32F這種大浮點紋理,結果G-Buffer的所有紋理,包括DiffuseMap和EmissiveMap都變成A32B32G32R32F了,實在是浪費空間,加上超大的ShadowMap(一般在2048x2048或更高)現在變成了N個,如果渲染的屏幕尺寸超過1600x1200,256MB顯存都要變成最低要求了。如果希望DiffuseMap和EmissiveMap使用傳統32位顏色來節約空間,生成G-Buffer就要渲染多次場景消耗更多時間,所以只能用空間代價換取時間。
  展望一下未來:
  如果希望照顧不支持 Shader Model 3.0 的顯卡,延遲光照渲染在一段時間內還是無法普及的。但是無論怎樣,這是一種比較先進的渲染方法,就支持多光源動態效果來說最合適不過了,算是真正的次時代圖形技術:)儘管現在的硬件對它的實現很吃力,但這只是時間的問題,希望以後普及1GB顯存時,顯存空間不再成爲一個約束。
  連續兩週每天睡5小時搞這個東西,終於可以告一段落,有建議請留言,我先睡覺去了。。。

 

附圖:一組完整的G-Buffer和一張最終效果圖

 

  G-Buffer之一:世界空間座標 A32B32G32R32F

 

  G-Buffer之二:世界空間法線 A32B32G32R32F

 

  G-Buffer之三:Diffuse Color Map A32B32G32R32F(太奢侈了)

 

  G-Buffer之四:Emissive Color Map A32B32G32R32F(依然是很奢侈)

 

  最終的效果:放了兩個圍繞世界中心旋轉的平行光源 場景終於有了多個陰影:)

 

發佈了9 篇原創文章 · 獲贊 23 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章