GPU光線跟蹤算法加速結構研究
同Carr等人的程序不同,本文所采用的程序不存在浮點精度太低的問題,因為Ceforce 7300在整個管線中支持真正的32位浮點操作。
3.加速結構的實現和比較
3.1均勻柵格
均勻柵格是第一個在GPU上實現的加速結構。Purcell給出了很多選擇均勻柵格作為加速結構的理由,但是Purcell沒有詳細的說明為什么均勻網格對于硬件實現而言比其它的加速結構要更加的簡單。當在探討了均勻柵格的一些主要特性的時候,更加清晰的知道了均勻柵格為什么會成為一個好的GPU機速結構。
首先,只用使用簡單的算術運算,就能夠對于每個體素的遍歷在常量時間能被定位和存取。這就消除了對樹的遍歷的需要,以及重復的紋理查找工作,而紋理查找是相當耗時的。
其次,體素的遍歷是通過遞增算術運算來完成的。這就消除了對堆棧的需要,使得我們能夠從光線的起始點開始,以距離遞增的順序訪問體素成為可能。
再其次,由于對于體素的訪問是沿著光線,以距離遞增的方式遍歷的,所以,一旦在一個被訪問的體素中報道發現有一個交點,就可以停止這條光線對體素的遍歷過程,從而提高整個遍歷過程的速度。
最后,用于遍歷的代碼非常適合用向量編寫,而向量形式的編碼風格又非常適合GPU的指令集。
然而,均勻柵格的缺點就是由于它是空間細分結構的一種特殊情況,多個體素可能包含相同三角形的多個引用。由于無法使用mailbox技術,這就意味著需要對于相同的光線和三角形之間進行不止一次的相交測試。
3.2 KD-tree
最近,Havran等人對基于CPU的光線跟蹤算法的加速結構進行了比較,得出的結論是對于眾多不同類型的測試場景,平均而言,KD-tree是最快的。所以,有必要考察一下對于基于KD-tree的GPU光線跟蹤算法,是否也會有相似的結論。
就像均勻柵格一樣,KD-tree也是一種空間細分結構。同均勻網格不同的是,KD-tree利用一個二叉樹將場景表示成一個層次結構。
在二叉樹中,我們將內部節點和葉子節點區分開。葉子節點用來表示體素和與之相關的保存在該體素內的三角形的引用。一個內部節點用來表示空間區域的某個部分。所以,內部節點包含一個分裂面的兩個子樹的引用,而葉子節點只包含一個三角形列表。
KD-tree的創建過程從上而下,根據一個評價函數,通過放置一個分離平面,遞歸的將場景分離成兩個體素。我們能夠以遞歸的方式遍歷KD-tree,但是由于GPU沒有堆棧結構,所以無法應用遞歸的策略。取而代之的是,我們能夠通過記住我們沿著光線前進了多遠來向上或者向下遍歷樹。這種策略消除了需要堆棧的限制,使得用CPU來完成對KD-tree結構的遍歷成為可能。
當使用GPU對KD-tree進行遍歷的時候,KD-tree像均勻柵格那樣被表示成一個紋理的集合。這就意味著有一個保存樹數據的紋理,一個保存三角形列表的紋理,和一個保存實際的三角形數據的紋理。GPU的遍歷首先調用一個初始化內核,然后按照需要,多次調用合并后的遍歷和求交內核。
3.3 包圍體層次(BVH)
給定一些隨機的光線,通過計算遍歷包圍體層次的平均花費,就可以測量出該包圍體層次的質量。迄今為止,還沒有構建最優的包圍體層次的算法,也就是說,如何準確的測量一個包圍體層次的平均遍歷時間還不是很明顯。
Goldsmith和Salmon提出了一個評價函數,通常被稱為表面積啟發式函數。他們通過父節點和孩子節點的表面積之比來形式化的表述這個關系,此評價函數如下所示:
此處,hit(n)是光線擊中節點n的情況,Sn是節點n的表面積,c和p分別表示父節點和孩子節點。
這個評價函數給出了,當用一條隨機的光線同層次結構求交的時候,成本上的估計。由于沒有最優的方法去有效的構造一個最優的BVH,提出了不同的構造技巧。下面,將列出比較通用的方法。
在實踐中,對于包圍體應用的最廣泛的就是軸對齊包圍盒(AABB)。
AABB易于實現,并且同光線的求交測試非常快。大多數有關BVH的論文在描述BVH的創建的時候,通常分別以Kay和Kajiya,或者Goldsmith和Salmon這兩種基本的想法為基礎。Kay和Kajiaya建議以自上而下遞歸的方式進行BVH的創建。
Goldsmith和Salmon提出了一個更加復雜的自底向上的構造方式。Goldsmith和Salmon指出,BVH的質量同作為輸入傳人的三角形的順序有關。因此,他們建議在構造BVH之前,隨機打亂三角形的順序。下述算法就是利用Kay/Kajiya的思想創建某個場景的包圍體層次的方法:
4.結束語
本文成功的在GPU上實現了用于光線跟蹤算法中的各種加速結構,并對這些加速結構在GPU上的加速效果進行了比較。均勻柵格作為第一個在CPU上實現的光線跟蹤器的加速結構,也被證明是最慢的,除非是只包含一個單獨的物體的場景的情況。均勻柵格不適合幾何體的密度非常高的場景。另外,對于均勻柵格的CPU上的遍歷表示,也需要大量的數據。Foley和Sugerman認為,對于大多數場景,KD-tree的效率要比均勻柵格高。但是,在KD-tree的遍歷過程中,無論是重置階段還是回退階段,片元程序都非常的復雜,但這種復雜性也使得其能夠在場景的幾何體的密度改變的時候做出適當的調整。本文實現的BVH被證明在加速效果上要超過均勻柵格和KD-tree,在現階段,BVH是在GPU上實現的最快的加速結構。并且在GPU上實現BVH加速結構要比實現其他加速結構更加的簡單。
參考文獻:
[1]Randima Femado編,姚勇,王小琴譯.GPU精粹一實時圖形編程的技術,技巧和技藝[M].北京:人民郵電出版社,2006.
[2] Matt Pharr編著,龔敏敏譯.GPU精粹2-高性能圖形芯片和通用計算編程技巧[M].北京:清華大學出版社.
[3]昊恩華,柳有權.基于圖形處理器(GPU)的通用計算叨.計算機輔助設計與圖形學學報,2004,16(5): 601-612.
[4] Philip J.Schneider,David H.Eberly著,周長發譯,計算機圖形學幾何工具算法詳解[M].北京:電子工業出版社,2005.
[5] Martin Christen. Implementing ray tracing on GPU. Masteracute;sthesis, University of Applied Sciences Basel
評論