基于GPU的光線跟蹤算法分析
發(fā)布時(shí)間:2014-07-28 21:19
基于GPU的光線跟蹤
2.1 相關(guān)工作
當(dāng)前,主要由兩種方法利用CPU來(lái)加速光線跟蹤算法。第一種是Carr等人提出來(lái)的,將CPU轉(zhuǎn)換為一個(gè)蠻力的執(zhí)行光線一三角形求交的計(jì)算器,而將任何的光線生成以及著色過(guò)程在CPU上完成。這就需要CPU依然執(zhí)行絕大部分的渲染工作。C arr等人指出,在ATI Radeon 8500上,每秒最快能夠執(zhí)行1億2千萬(wàn)次的光線一三角形求交。同時(shí),作者也指出,由于GPU的單精度浮點(diǎn)的限制,圖片上依然存在一些不太真實(shí)的地方。第二種方法由Purcell等人提出的,改種方法將整個(gè)光線跟蹤器都移植到CPU上進(jìn)行實(shí)現(xiàn)。從光線的產(chǎn)生,加速結(jié)構(gòu)的遍歷,到最后的著色過(guò)程都在GPU上執(zhí)行。此后,有很多相同的項(xiàng)目都是基于Purcell的模型上進(jìn)行的。
2.2 GPU上的光線跟蹤算法的映射方式
將傳統(tǒng)的CPU上執(zhí)行的光線跟蹤算法,映射成為一個(gè)GPU協(xié)助的,或者基于GPU的光線跟蹤器有眾多方法。下面重點(diǎn)介紹Purcell提出的映射模型,以及在本文的實(shí)現(xiàn)中提出的一個(gè)基于CPU的Whitted模型的光線跟蹤器。該光線跟蹤器的布局如圖2.1所示:
在Purcell的論文中,它將光線一三角形求交,以及遍歷過(guò)程分離成兩個(gè)獨(dú)立的遍歷內(nèi)核和求交內(nèi)核。本文的實(shí)現(xiàn)中,也按照上述模型圖,將光線跟蹤算法分解成光線生成,光線一三角形求交,著色這三個(gè)步驟。在對(duì)光線進(jìn)行跟蹤之前,需要生成從視點(diǎn)指向屏幕的原始光線( primary ray)。在一個(gè)GPU上,能夠使用光柵器的插值的能力,在一個(gè)單一的內(nèi)核調(diào)用中,產(chǎn)生所有的原始光線。
給定觀察矩形(被采樣用于產(chǎn)生圖片的投影平面的一部分)的四個(gè)角,以及視點(diǎn),首先計(jì)算出這個(gè)視錐體的四條邊線。如果讓光柵器在這4條光線之間,按照512×512規(guī)格,筆耕論文新浪博客,在這四條光線之間按照方向進(jìn)行插值,最終就可以獲得能夠產(chǎn)生一幅512×512圖片(一個(gè)像素一個(gè)采樣點(diǎn))的所有原始光線的方向。同時(shí)能夠?qū)⑦@些方向存儲(chǔ)在一個(gè)紋理里,并把它作為求交內(nèi)核的輸入。所有的原始光線具有相同的起始點(diǎn),但是仍然把它存儲(chǔ)在一個(gè)同方向紋理具有相同維度的紋理內(nèi)。因?yàn)楫?dāng)生成陰影光線或者反射光線的時(shí)候,光線的原點(diǎn)會(huì)發(fā)生改變。
加速結(jié)構(gòu)的實(shí)現(xiàn)和比較
3.1均勻柵格
均勻柵格是第一個(gè)在GPU上實(shí)現(xiàn)的加速結(jié)構(gòu)。Purcell給出了很多選擇均勻柵格作為加速結(jié)構(gòu)的理由,但是Purcell沒有詳細(xì)的說(shuō)明為什么均勻網(wǎng)格對(duì)于硬件實(shí)現(xiàn)而言比其它的加速結(jié)構(gòu)要更加的簡(jiǎn)單。當(dāng)在探討了均勻柵格的一些主要特性的時(shí)候,更加清晰的知道了均勻柵格為什么會(huì)成為一個(gè)好的GPU機(jī)速結(jié)構(gòu)。
首先,只用使用簡(jiǎn)單的算術(shù)運(yùn)算,就能夠?qū)τ诿總(gè)體素的遍歷在常量時(shí)間能被定位和存取。這就消除了對(duì)樹的遍歷的需要,以及重復(fù)的紋理查找工作,而紋理查找是相當(dāng)耗時(shí)的。其次,體素的遍歷是通過(guò)遞增算術(shù)運(yùn)算來(lái)完成的。這就消除了對(duì)堆棧的需要,使得我們能夠從光線的起始點(diǎn)開始,以距離遞增的順序訪問體素成為可能。再其次,由于對(duì)于體素的訪問是沿著光線,以距離遞增的方式遍歷的,所以,一旦在一個(gè)被訪問的體素中報(bào)道發(fā)現(xiàn)有一個(gè)交點(diǎn),就可以停止這條光線對(duì)體素的遍歷過(guò)程,從而提高整個(gè)遍歷過(guò)程的速度。最后,用于遍歷的代碼非常適合用向量編寫,而向量形式的編碼風(fēng)格又非常適合GPU的指令集。然而,均勻柵格的缺點(diǎn)就是由于它是空間細(xì)分結(jié)構(gòu)的一種特殊情況,多個(gè)體素可能包含相同三角形的多個(gè)引用。由于無(wú)法使用mailbox技術(shù),這就意味著需要對(duì)于相同的光線和三角形之間進(jìn)行不止一次的相交測(cè)試。
3.2 KD-tree
在二叉樹中,我們將內(nèi)部節(jié)點(diǎn)和葉子節(jié)點(diǎn)區(qū)分開。葉子節(jié)點(diǎn)用來(lái)表示體素和與之相關(guān)的保存在該體素內(nèi)的三角形的引用。一個(gè)內(nèi)部節(jié)點(diǎn)用來(lái)表示空間區(qū)域的某個(gè)部分。所以,內(nèi)部節(jié)點(diǎn)包含一個(gè)分裂面的兩個(gè)子樹的引用,而葉子節(jié)點(diǎn)只包含一個(gè)三角形列表。
KD-tree的創(chuàng)建過(guò)程從上而下,根據(jù)一個(gè)評(píng)價(jià)函數(shù),通過(guò)放置一個(gè)分離平面,遞歸的將場(chǎng)景分離成兩個(gè)體素。我們能夠以遞歸的方式遍歷KD-tree,但是由于GPU沒有堆棧結(jié)構(gòu),所以無(wú)法應(yīng)用遞歸的策略。取而代之的是,我們能夠通過(guò)記住我們沿著光線前進(jìn)了多遠(yuǎn)來(lái)向上或者向下遍歷樹。這種策略消除了需要堆棧的限制,使得用CPU來(lái)完成對(duì)KD-tree結(jié)構(gòu)的遍歷成為可能。
3.3 包圍體層次(BVH)
Goldsmith和Salmon提出了一個(gè)評(píng)價(jià)函數(shù),通常被稱為表面積啟發(fā)式函數(shù)。他們通過(guò)父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的表面積之比來(lái)形式化的表述這個(gè)關(guān)系,此評(píng)價(jià)函數(shù)如下所示:此處,hit(n)是光線擊中節(jié)點(diǎn)n的情況,Sn是節(jié)點(diǎn)n的表面積,c和p分別表示父節(jié)點(diǎn)和孩子節(jié)點(diǎn)。這個(gè)評(píng)價(jià)函數(shù)給出了,當(dāng)用一條隨機(jī)的光線同層次結(jié)構(gòu)求交的時(shí)候,成本上的估計(jì)。由于沒有最優(yōu)的方法去有效的構(gòu)造一個(gè)最優(yōu)的BVH,提出了不同的構(gòu)造技巧。下面,將列出比較通用的方法。
在實(shí)踐中,對(duì)于包圍體應(yīng)用的最廣泛的就是軸對(duì)齊包圍盒(AABB)。AABB易于實(shí)現(xiàn),并且同光線的求交測(cè)試非?臁4蠖鄶(shù)有關(guān)BVH的論文在描述BVH的創(chuàng)建的時(shí)候,通常分別以Kay和Kajiya,或者Goldsmith和Salmon這兩種基本的想法為基礎(chǔ)。Kay和Kajiaya建議以自上而下遞歸的方式進(jìn)行BVH的創(chuàng)建。
本文編號(hào):6722
2.1 相關(guān)工作
當(dāng)前,主要由兩種方法利用CPU來(lái)加速光線跟蹤算法。第一種是Carr等人提出來(lái)的,將CPU轉(zhuǎn)換為一個(gè)蠻力的執(zhí)行光線一三角形求交的計(jì)算器,而將任何的光線生成以及著色過(guò)程在CPU上完成。這就需要CPU依然執(zhí)行絕大部分的渲染工作。C arr等人指出,在ATI Radeon 8500上,每秒最快能夠執(zhí)行1億2千萬(wàn)次的光線一三角形求交。同時(shí),作者也指出,由于GPU的單精度浮點(diǎn)的限制,圖片上依然存在一些不太真實(shí)的地方。第二種方法由Purcell等人提出的,改種方法將整個(gè)光線跟蹤器都移植到CPU上進(jìn)行實(shí)現(xiàn)。從光線的產(chǎn)生,加速結(jié)構(gòu)的遍歷,到最后的著色過(guò)程都在GPU上執(zhí)行。此后,有很多相同的項(xiàng)目都是基于Purcell的模型上進(jìn)行的。
2.2 GPU上的光線跟蹤算法的映射方式
將傳統(tǒng)的CPU上執(zhí)行的光線跟蹤算法,映射成為一個(gè)GPU協(xié)助的,或者基于GPU的光線跟蹤器有眾多方法。下面重點(diǎn)介紹Purcell提出的映射模型,以及在本文的實(shí)現(xiàn)中提出的一個(gè)基于CPU的Whitted模型的光線跟蹤器。該光線跟蹤器的布局如圖2.1所示:
在Purcell的論文中,它將光線一三角形求交,以及遍歷過(guò)程分離成兩個(gè)獨(dú)立的遍歷內(nèi)核和求交內(nèi)核。本文的實(shí)現(xiàn)中,也按照上述模型圖,將光線跟蹤算法分解成光線生成,光線一三角形求交,著色這三個(gè)步驟。在對(duì)光線進(jìn)行跟蹤之前,需要生成從視點(diǎn)指向屏幕的原始光線( primary ray)。在一個(gè)GPU上,能夠使用光柵器的插值的能力,在一個(gè)單一的內(nèi)核調(diào)用中,產(chǎn)生所有的原始光線。
給定觀察矩形(被采樣用于產(chǎn)生圖片的投影平面的一部分)的四個(gè)角,以及視點(diǎn),首先計(jì)算出這個(gè)視錐體的四條邊線。如果讓光柵器在這4條光線之間,按照512×512規(guī)格,筆耕論文新浪博客,在這四條光線之間按照方向進(jìn)行插值,最終就可以獲得能夠產(chǎn)生一幅512×512圖片(一個(gè)像素一個(gè)采樣點(diǎn))的所有原始光線的方向。同時(shí)能夠?qū)⑦@些方向存儲(chǔ)在一個(gè)紋理里,并把它作為求交內(nèi)核的輸入。所有的原始光線具有相同的起始點(diǎn),但是仍然把它存儲(chǔ)在一個(gè)同方向紋理具有相同維度的紋理內(nèi)。因?yàn)楫?dāng)生成陰影光線或者反射光線的時(shí)候,光線的原點(diǎn)會(huì)發(fā)生改變。
加速結(jié)構(gòu)的實(shí)現(xiàn)和比較
3.1均勻柵格
均勻柵格是第一個(gè)在GPU上實(shí)現(xiàn)的加速結(jié)構(gòu)。Purcell給出了很多選擇均勻柵格作為加速結(jié)構(gòu)的理由,但是Purcell沒有詳細(xì)的說(shuō)明為什么均勻網(wǎng)格對(duì)于硬件實(shí)現(xiàn)而言比其它的加速結(jié)構(gòu)要更加的簡(jiǎn)單。當(dāng)在探討了均勻柵格的一些主要特性的時(shí)候,更加清晰的知道了均勻柵格為什么會(huì)成為一個(gè)好的GPU機(jī)速結(jié)構(gòu)。
首先,只用使用簡(jiǎn)單的算術(shù)運(yùn)算,就能夠?qū)τ诿總(gè)體素的遍歷在常量時(shí)間能被定位和存取。這就消除了對(duì)樹的遍歷的需要,以及重復(fù)的紋理查找工作,而紋理查找是相當(dāng)耗時(shí)的。其次,體素的遍歷是通過(guò)遞增算術(shù)運(yùn)算來(lái)完成的。這就消除了對(duì)堆棧的需要,使得我們能夠從光線的起始點(diǎn)開始,以距離遞增的順序訪問體素成為可能。再其次,由于對(duì)于體素的訪問是沿著光線,以距離遞增的方式遍歷的,所以,一旦在一個(gè)被訪問的體素中報(bào)道發(fā)現(xiàn)有一個(gè)交點(diǎn),就可以停止這條光線對(duì)體素的遍歷過(guò)程,從而提高整個(gè)遍歷過(guò)程的速度。最后,用于遍歷的代碼非常適合用向量編寫,而向量形式的編碼風(fēng)格又非常適合GPU的指令集。然而,均勻柵格的缺點(diǎn)就是由于它是空間細(xì)分結(jié)構(gòu)的一種特殊情況,多個(gè)體素可能包含相同三角形的多個(gè)引用。由于無(wú)法使用mailbox技術(shù),這就意味著需要對(duì)于相同的光線和三角形之間進(jìn)行不止一次的相交測(cè)試。
3.2 KD-tree
在二叉樹中,我們將內(nèi)部節(jié)點(diǎn)和葉子節(jié)點(diǎn)區(qū)分開。葉子節(jié)點(diǎn)用來(lái)表示體素和與之相關(guān)的保存在該體素內(nèi)的三角形的引用。一個(gè)內(nèi)部節(jié)點(diǎn)用來(lái)表示空間區(qū)域的某個(gè)部分。所以,內(nèi)部節(jié)點(diǎn)包含一個(gè)分裂面的兩個(gè)子樹的引用,而葉子節(jié)點(diǎn)只包含一個(gè)三角形列表。
KD-tree的創(chuàng)建過(guò)程從上而下,根據(jù)一個(gè)評(píng)價(jià)函數(shù),通過(guò)放置一個(gè)分離平面,遞歸的將場(chǎng)景分離成兩個(gè)體素。我們能夠以遞歸的方式遍歷KD-tree,但是由于GPU沒有堆棧結(jié)構(gòu),所以無(wú)法應(yīng)用遞歸的策略。取而代之的是,我們能夠通過(guò)記住我們沿著光線前進(jìn)了多遠(yuǎn)來(lái)向上或者向下遍歷樹。這種策略消除了需要堆棧的限制,使得用CPU來(lái)完成對(duì)KD-tree結(jié)構(gòu)的遍歷成為可能。
3.3 包圍體層次(BVH)
Goldsmith和Salmon提出了一個(gè)評(píng)價(jià)函數(shù),通常被稱為表面積啟發(fā)式函數(shù)。他們通過(guò)父節(jié)點(diǎn)和孩子節(jié)點(diǎn)的表面積之比來(lái)形式化的表述這個(gè)關(guān)系,此評(píng)價(jià)函數(shù)如下所示:此處,hit(n)是光線擊中節(jié)點(diǎn)n的情況,Sn是節(jié)點(diǎn)n的表面積,c和p分別表示父節(jié)點(diǎn)和孩子節(jié)點(diǎn)。這個(gè)評(píng)價(jià)函數(shù)給出了,當(dāng)用一條隨機(jī)的光線同層次結(jié)構(gòu)求交的時(shí)候,成本上的估計(jì)。由于沒有最優(yōu)的方法去有效的構(gòu)造一個(gè)最優(yōu)的BVH,提出了不同的構(gòu)造技巧。下面,將列出比較通用的方法。
在實(shí)踐中,對(duì)于包圍體應(yīng)用的最廣泛的就是軸對(duì)齊包圍盒(AABB)。AABB易于實(shí)現(xiàn),并且同光線的求交測(cè)試非?臁4蠖鄶(shù)有關(guān)BVH的論文在描述BVH的創(chuàng)建的時(shí)候,通常分別以Kay和Kajiya,或者Goldsmith和Salmon這兩種基本的想法為基礎(chǔ)。Kay和Kajiaya建議以自上而下遞歸的方式進(jìn)行BVH的創(chuàng)建。
本文編號(hào):6722
本文鏈接:http://sikaile.net/kejilunwen/jisuanjikexuelunwen/6722.html
最近更新
教材專著