Order-Independent Transparency

半透物體的實時渲染是一件讓遊戲開發者很頭疼的事情,以下圖所吐槽。須要排序,一旦出現geometry交叉的狀況,半透計算還必出錯。算法

image

這幾天從理論到實踐地研究了下所謂的OIT技術,對半透問題有了必定的瞭解,現做個記錄。測試

最簡單的OIT方法是Nvidia 2001年的那篇老paper(「Interactive order-independent transparency 」)介紹的depth-peeling。真的是很簡單的方法,由於連我都看得懂!核心算法以下:spa

image

 

看得出來,每一個半透物體須要多個pass渲染,每一個pass剝離一層最近深度,同時該方法須要2個depth buffer的協做。若是用D3D或opengl來實踐的話,必然比較麻煩,你會發現原paper一共10頁,大部分是在講怎麼用opengl的trick來表達出算法。因此我在本身的soft renderer中進行了實踐,事實證實真是簡單的一逼,軟渲就是靈活自由,絕對是預研的正確選擇。3d

 

下面是實踐的過程。測試場景是2個半透的雙面的交叉的teapot~orm

 

  • Solid View

solid_view

這是非半透渲染方式,提供遮擋關係供半透渲染時參考。能夠得出咱們指望的正確結果是,左邊圈中部分應該是綠裏透紅,右邊圈中部分應該是紅裏透綠。。blog

 

  • Normal Transparency

wrong_transparency

這是普通的半透渲染。能夠看到,綠茶壺的茶柄是綠裏透紅,看上去像是該部分在紅茶壺的前面,這是不正確的。排序

 

  • OIT with 4 layers

OIT_4_layer

這是4層depth peeling的結果。注意觀察綠茶壺的茶柄部分是紅裏透綠,像是處在紅茶壺的內部,這纔是正確的。遊戲

ps:唉,個人軟渲光柵化仍是有問題,那些點線。。暫時解決不了,真頭疼,不要在乎那些細節。。遊戲開發

 

再看個例子,sponza場景的花壇,它總體是一個模型。開發

下圖左邊是max中實時渲染的,右邊是render出來的,無論是ray trace仍是depth peel,確定是準確的。

 

下面是我軟渲中的對比(考眼力,看輪廓,一致的纔對):

 

 

接下來有空研究下那個什麼per-pixel linked list OIT和DXSDK sample中的硬件實現方式。

相關文章
相關標籤/搜索