關(guān) 閉

新聞中心

EEPW首頁 > 工控自動化 > 設(shè)計(jì)應(yīng)用 > GPU光線跟蹤算法加速結(jié)構(gòu)研究

GPU光線跟蹤算法加速結(jié)構(gòu)研究

作者: 時(shí)間:2012-06-27 來源:網(wǎng)絡(luò) 收藏

同Carr等人的程序不同,本文所采用的程序不存在浮點(diǎn)精度太低的問題,因?yàn)镃eforce 7300在整個(gè)管線中支持真正的32位浮點(diǎn)操作。

3.加速結(jié)構(gòu)的實(shí)現(xiàn)和比較

3.1均勻柵格

均勻柵格是第一個(gè)在上實(shí)現(xiàn)的加速結(jié)構(gòu)。Purcell給出了很多選擇均勻柵格作為加速結(jié)構(gòu)的理由,但是Purcell沒有詳細(xì)的說明為什么均勻網(wǎng)格對于硬件實(shí)現(xiàn)而言比其它的加速結(jié)構(gòu)要更加的簡單。當(dāng)在探討了均勻柵格的一些主要特性的時(shí)候,更加清晰的知道了均勻柵格為什么會成為一個(gè)好的機(jī)速結(jié)構(gòu)。

首先,只用使用簡單的算術(shù)運(yùn)算,就能夠?qū)τ诿總€(gè)體素的遍歷在常量時(shí)間能被定位和存取。這就消除了對樹的遍歷的需要,以及重復(fù)的紋理查找工作,而紋理查找是相當(dāng)耗時(shí)的。

其次,體素的遍歷是通過遞增算術(shù)運(yùn)算來完成的。這就消除了對堆棧的需要,使得我們能夠從光線的起始點(diǎn)開始,以距離遞增的順序訪問體素成為可能。

再其次,由于對于體素的訪問是沿著光線,以距離遞增的方式遍歷的,所以,一旦在一個(gè)被訪問的體素中報(bào)道發(fā)現(xiàn)有一個(gè)交點(diǎn),就可以停止這條光線對體素的遍歷過程,從而提高整個(gè)遍歷過程的速度。

最后,用于遍歷的代碼非常適合用向量編寫,而向量形式的編碼風(fēng)格又非常適合的指令集。

然而,均勻柵格的缺點(diǎn)就是由于它是空間細(xì)分結(jié)構(gòu)的一種特殊情況,多個(gè)體素可能包含相同三角形的多個(gè)引用。由于無法使用mailbox技術(shù),這就意味著需要對于相同的光線和三角形之間進(jìn)行不止一次的相交測試。

3.2 KD-tree

最近,Havran等人對基于CPU的的加速結(jié)構(gòu)進(jìn)行了比較,得出的結(jié)論是對于眾多不同類型的測試場景,平均而言,KD-tree是最快的。所以,有必要考察一下對于基于KD-tree的GPU,是否也會有相似的結(jié)論。

就像均勻柵格一樣,KD-tree也是一種空間細(xì)分結(jié)構(gòu)。同均勻網(wǎng)格不同的是,KD-tree利用一個(gè)二叉樹將場景表示成一個(gè)層次結(jié)構(gòu)。

在二叉樹中,我們將內(nèi)部節(jié)點(diǎn)和葉子節(jié)點(diǎn)區(qū)分開。葉子節(jié)點(diǎn)用來表示體素和與之相關(guān)的保存在該體素內(nèi)的三角形的引用。一個(gè)內(nèi)部節(jié)點(diǎn)用來表示空間區(qū)域的某個(gè)部分。所以,內(nèi)部節(jié)點(diǎn)包含一個(gè)分裂面的兩個(gè)子樹的引用,而葉子節(jié)點(diǎn)只包含一個(gè)三角形列表。

KD-tree的創(chuàng)建過程從上而下,根據(jù)一個(gè)評價(jià)函數(shù),通過放置一個(gè)分離平面,遞歸的將場景分離成兩個(gè)體素。我們能夠以遞歸的方式遍歷KD-tree,但是由于GPU沒有堆棧結(jié)構(gòu),所以無法應(yīng)用遞歸的策略。取而代之的是,我們能夠通過記住我們沿著光線前進(jìn)了多遠(yuǎn)來向上或者向下遍歷樹。這種策略消除了需要堆棧的限制,使得用CPU來完成對KD-tree結(jié)構(gòu)的遍歷成為可能。

當(dāng)使用GPU對KD-tree進(jìn)行遍歷的時(shí)候,KD-tree像均勻柵格那樣被表示成一個(gè)紋理的集合。這就意味著有一個(gè)保存樹數(shù)據(jù)的紋理,一個(gè)保存三角形列表的紋理,和一個(gè)保存實(shí)際的三角形數(shù)據(jù)的紋理。GPU的遍歷首先調(diào)用一個(gè)初始化內(nèi)核,然后按照需要,多次調(diào)用合并后的遍歷和求交內(nèi)核。

3.3 包圍體層次(BVH)

給定一些隨機(jī)的光線,通過計(jì)算遍歷包圍體層次的平均花費(fèi),就可以測量出該包圍體層次的質(zhì)量。迄今為止,還沒有構(gòu)建最優(yōu)的包圍體層次的,也就是說,如何準(zhǔn)確的測量一個(gè)包圍體層次的平均遍歷時(shí)間還不是很明顯。

Goldsmith和Salmon提出了一個(gè)評價(jià)函數(shù),通常被稱為表面積啟發(fā)式函數(shù)。他們通過父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的表面積之比來形式化的表述這個(gè)關(guān)系,此評價(jià)函數(shù)如下所示:

此處,hit(n)是光線擊中節(jié)點(diǎn)n的情況,Sn是節(jié)點(diǎn)n的表面積,c和p分別表示父節(jié)點(diǎn)和孩子節(jié)點(diǎn)。

這個(gè)評價(jià)函數(shù)給出了,當(dāng)用一條隨機(jī)的光線同層次結(jié)構(gòu)求交的時(shí)候,成本上的估計(jì)。由于沒有最優(yōu)的方法去有效的構(gòu)造一個(gè)最優(yōu)的BVH,提出了不同的構(gòu)造技巧。下面,將列出比較通用的方法。

在實(shí)踐中,對于包圍體應(yīng)用的最廣泛的就是軸對齊包圍盒(AABB)。

AABB易于實(shí)現(xiàn),并且同光線的求交測試非???。大多數(shù)有關(guān)BVH的論文在描述BVH的創(chuàng)建的時(shí)候,通常分別以Kay和Kajiya,或者Goldsmith和Salmon這兩種基本的想法為基礎(chǔ)。Kay和Kajiaya建議以自上而下遞歸的方式進(jìn)行BVH的創(chuàng)建。

Goldsmith和Salmon提出了一個(gè)更加復(fù)雜的自底向上的構(gòu)造方式。Goldsmith和Salmon指出,BVH的質(zhì)量同作為輸入傳人的三角形的順序有關(guān)。因此,他們建議在構(gòu)造BVH之前,隨機(jī)打亂三角形的順序。下述算法就是利用Kay/Kajiya的思想創(chuàng)建某個(gè)場景的包圍體層次的方法:

4.結(jié)束語

本文成功的在GPU上實(shí)現(xiàn)了用于算法中的各種加速結(jié)構(gòu),并對這些加速結(jié)構(gòu)在GPU上的加速效果進(jìn)行了比較。均勻柵格作為第一個(gè)在CPU上實(shí)現(xiàn)的光線跟蹤器的加速結(jié)構(gòu),也被證明是最慢的,除非是只包含一個(gè)單獨(dú)的物體的場景的情況。均勻柵格不適合幾何體的密度非常高的場景。另外,對于均勻柵格的CPU上的遍歷表示,也需要大量的數(shù)據(jù)。Foley和Sugerman認(rèn)為,對于大多數(shù)場景,KD-tree的效率要比均勻柵格高。但是,在KD-tree的遍歷過程中,無論是重置階段還是回退階段,片元程序都非常的復(fù)雜,但這種復(fù)雜性也使得其能夠在場景的幾何體的密度改變的時(shí)候做出適當(dāng)?shù)恼{(diào)整。本文實(shí)現(xiàn)的BVH被證明在加速效果上要超過均勻柵格和KD-tree,在現(xiàn)階段,BVH是在GPU上實(shí)現(xiàn)的最快的加速結(jié)構(gòu)。并且在GPU上實(shí)現(xiàn)BVH加速結(jié)構(gòu)要比實(shí)現(xiàn)其他加速結(jié)構(gòu)更加的簡單。

參考文獻(xiàn):

[1]Randima Femado編,姚勇,王小琴譯.GPU精粹一實(shí)時(shí)圖形編程的技術(shù),技巧和技藝[M].北京:人民郵電出版社,2006.

[2] Matt Pharr編著,龔敏敏譯.GPU精粹2-高性能圖形芯片和通用計(jì)算編程技巧[M].北京:清華大學(xué)出版社.

[3]昊恩華,柳有權(quán).基于圖形處理器(GPU)的通用計(jì)算叨.計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào),2004,16(5): 601-612.

[4] Philip J.Schneider,David H.Eberly著,周長發(fā)譯,計(jì)算機(jī)圖形學(xué)幾何工具算法詳解[M].北京:電子工業(yè)出版社,2005.

[5] Martin Christen. Implementing ray tracing on GPU. Masteracute;sthesis, University of Applied Sciences Basel


上一頁 1 2 下一頁

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉