[ZZ] KlayGE 遊戲引擎 之 Order Independent Transparency(OIT)

轉載請註明出處爲KlayGE遊戲引擎,本文的永久連接爲http://www.klayge.org/?p=2233web

http://dogasshole.iteye.com/blog/1429665算法

http://www.gdcvault.com/api

 

2009年AMD在發佈HD 5800的時候也發佈了一個Order Independent Transparency(OIT)的demo,但只有介紹,沒有多少能夠參考的東西。GDC 2010上的OIT and GI using DX11 linked lists纔給出了比較完整的算法細節。雖然說這幾年也有很多新的OIT算法出現,但做爲具備標杆意義的OIT算法,Per-Pixel Linked Lists仍是值得實現到KlayGE的開發版本中,以作對比。數據結構

算法

顧名思義,Per-Pixel Linked Lists的意思就是每一個pixel上一個鏈表,存放屬於該pixel的全部fragment。這種不均勻的數據結構對GPU來講是很要命的。框架

在Per-Pixel Linked Lists中,鏈表須要兩個額外的buffer,一個稱爲fragments buffer,須要是屏幕尺寸的N倍,負責存放全部的fragment;另外一個是start offset buffer,和屏幕尺寸相同,存放每一個pixel的鏈表隊頭。構造出存儲的數據結構後,算法自己就變得很簡單了,只有兩步:ssh

  1. PS計算出shading後的顏色,讓fragments buffer自帶的計數器加一,獲得一個空間後把顏色和深度存進去,同時更新該像素位置對應的start offset buffer。
  2. 在post process裏,PS從start offset buffer讀到隊頭,由此索引這個pixel的整個鏈表,根據深度進行排序,而後按順序作alpha blending。

因而可知,該算法只須要在原有流水線PS里加上幾行,同時多一個全屏post process便可完成。全部的fragment只須要通過PS一次,絕無浪費。相對於之前流行的OIT方法Depth Peeling來講,在相同層數的狀況下,Per-Pixel Linked Lists的結果與其徹底相同,並無近似計算,但理論性能要高得多。由於Depth Peeling若是要peeling N層,全部的fragment就要生成N次,並丟棄大部分fragment,就剩下須要剝離的那層fragment。wordpress

實際測試的結果也證明了以前的分析,一樣的結果,在NVS 4200M上,Per-Pixel Linked Lists能夠跑到62.47FPS,而Depth Peeling只能46.05FPS。post

Per-Pixel Linked Lists

限制

固然,Per-Pixel Linked Lists至少要在D3D11的硬件上才能實現。以前的硬件不支持PS寫入UAV,也沒有附在buffer上的原子計數器。因此除非用GPGPU的方法實現一個軟件光柵化,不然無法繞開這些限制。性能

另外一個明顯的限制來自於空間佔用。由於沒法事先知道鏈表會有多長,fragments buffer只能申請一個比較大的空間,可能會浪費很多,也可能會溢出。並且由於fragment添加的順序是亂的,無法像Depth Peeling那樣只要前幾層。因此,這個方法的空間消耗是不可控的。測試

除了OIT還能作什麼

理論上,全部非近似的OIT方法,都能用來作voxelization。在去年的一篇blog將來屬於SVO?中就提到了如何用從conservative rasterize配合Per-Pixel Linked Lists,在一個pass內直接把mesh轉成voxel表達。

因爲存儲了場景的全部fragment,甚至能夠直接在裏面作光線跟蹤。不過顯然這麼作不如就用SVO那套框架有效率了。

 

 

 

 

http://dogasshole.iteye.com/blog/1429665

http://www.gdcvault.com/這裏能夠下到。

 

per pixel link list能夠作到order independent translucency rendering。

以前一直噁心你們的這個東西終於能夠在dx11幹掉了,screenshot:

 

 

糾纏api沒什麼意思,比較有意義的是能夠作到能夠給每一個pixel創建一個linklist這件事情:

 

這個太nice了,除了order independent translucency,不少酷的算法均可以作到了像:translucency deferred lighting等。

 

這個性能消耗估計也會「物有所值」了。

相關文章
相關標籤/搜索