<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          關(guān) 閉

          新聞中心

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

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

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

          同Carr等人的程序不同,本文所采用的程序不存在浮點精度太低的問題,因為Ceforce 7300在整個管線中支持真正的32位浮點操作。

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

          3.1均勻柵格

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

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

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

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

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

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

          3.2 KD-tree

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

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

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

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

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

          3.3 包圍體層次(BVH)

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

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

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

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

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

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

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

          4.結(jié)束語

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

          參考文獻:

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

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

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

          [4] Philip J.Schneider,David H.Eberly著,周長發(fā)譯,計算機圖形學(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)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();