專利名稱:基于gpu的構(gòu)建bvh樹并行光線追蹤方法
技術(shù)領(lǐng)域:
本發(fā)明屬于計算機圖形學領(lǐng)域,具體涉及一種利用GPU構(gòu)建BVH樹進行并行光線追蹤方法的方法,該技術(shù)能夠大大降低傳統(tǒng)CPU光線追蹤的計算時間。
背景技術(shù):
光線追蹤算法是真實感圖形學領(lǐng)域中的重要算法,它通過模擬光線在傳播過程中的反射、折射現(xiàn)象,將光線的顏色與物體的材質(zhì)屬性結(jié)合建模,能對復雜的三維物體做出較好的仿真,適合繪制表面光潔度高或具有透明表面和鏡面的場景。在整個算法中,計算量最大的就是光線與場景圖形元的求交過程。若考慮動態(tài)光線追蹤,還需要加上整個場景空間結(jié)構(gòu)的建立。隨著GPU性能正以每年翻倍的速度發(fā)展,動態(tài)光線追蹤生成動畫越來越成為工業(yè)界的趨勢。在對場景進行空間劃分的方法中,最常用的就是KD-tree和BVH-tree。這兩種方法都可以完成光線追蹤,但是在動態(tài)場景當中,BVH-tree性能更加優(yōu)于KD-tree。同時,實驗研究已經(jīng)表明表面積啟發(fā)SAH方法可以生成高質(zhì)量的生成樹,但卻需要極大的時間開銷,這阻礙了 BVH-tree的快速構(gòu)建,且即使通過優(yōu)化SAH機制還是無法達到動態(tài)光線追蹤的效果。但是如果利用GPU完成BVH-tree的建立,并用GPU計算SAH函數(shù),就可以大大加快光線追蹤前期準備速度,而且利用GPU并行處理求交還可以很好彌補CPU串行計算求交的低效性。
發(fā)明內(nèi)容
本發(fā)明要克服先有光線跟蹤方法效率較低的缺點,提出一種在GPU上快速高效建立BVH-tree進行并行光線追蹤的方法。該方法通過在GPU上高效地建立BVH-tree來加快光線追蹤速度,并利用GPU并行計算光射線與圖形元相交處的信息,從而提高光線追蹤效率。本發(fā)明的技術(shù)方案為基于GPU的構(gòu)建BVH樹并行光線追蹤方法,其步驟為I)讀取3D場景模型,設(shè)置三角形的模型圖形元,將這些數(shù)據(jù)存儲在GPU顯存中。2)創(chuàng)建一個動態(tài)增長存儲BVH節(jié)點的空間。3)根據(jù)模型圖形元,分別求X軸、Y軸和Z軸的跨度,并計算出最大值,以這個最大值的坐標軸使用SAH機制劃分空間。4)判斷由步驟3)分割的子節(jié)點當中的三角形數(shù)目是否大于1,若大于I則返回到3)。5) BVH-tree構(gòu)造完畢,輸出線性結(jié)構(gòu)BVHlist數(shù)組。6)根據(jù)視點和投影面構(gòu)造射線。7)構(gòu)造一個BVH元素的堆棧,聲明變量stackoffset=0。8)取當前射線與當前所指BVHlist節(jié)點做相交測試。
9)如果當前射線與這個BVH節(jié)點不相交,而且如果stackoffset為0,表明當前光線與場景無相交,則結(jié)束當前射線的光線追蹤;反之stackoffset大于0,那么stackoffset減1,并且把當前節(jié)點設(shè)置為堆棧中偏移量為stackoffset的節(jié)點,返回步驟8);如果當前射線與這個BVH節(jié)點相交轉(zhuǎn)移到步驟10)。10)判斷該BVH節(jié)點中是否有圖形元三角形,如果有,說明當前射線與一個BVH樹的葉子節(jié)點正方體有相交,并繼續(xù)測試該射線與節(jié)點內(nèi)的三角形是否相交,如果相交就把當前的節(jié)點和三角形序號交給該射線。若stackoffset大于0就減1,并且把當前節(jié)點設(shè)置為堆棧中偏移量為stackoffset的節(jié)點,返回步驟8)。如果BVH節(jié)點沒有圖形元三角形就轉(zhuǎn)移到步驟11)。11)根據(jù)當前節(jié)點的右節(jié)點標記變量,把右節(jié)點序號放入堆棧中,然后stackoffset加I,把當前節(jié)點設(shè)置為之前節(jié)點的左節(jié)點,返回步驟8)。本發(fā)明的效果如下首次在GPU上對3D模型實現(xiàn)了高質(zhì)量的BVH-Tree的并行構(gòu)建方法,每次劃分空間采用SAH劃分機制,這極大提高了 BVH-Tree的平衡性。并且通過對光線與模型做并行相交運算,大大減少了原先串行計算的復雜度。
圖1為本發(fā)明的算法流程2為本發(fā)明的BVH空間劃分3為本發(fā)明的射線與正方體求交方法4為本發(fā)明的BHV-tree保存結(jié)構(gòu)圖
具體實施例方式以下實施方式結(jié)合附圖對本發(fā)明進行詳細的描述,參照附圖,本發(fā)明包括以下步驟I)讀取3D場景模型,并設(shè)置三角形的模型圖形元,這些數(shù)據(jù)存儲在GPU顯存中。這些數(shù)據(jù)是以DirectX規(guī)定的SRV格式保存的,一共有兩個SRV。第一個SRV中保存用于遍歷的圖形元三角形序號數(shù)組。第二個SRV中保存圖形元三角形的頂點數(shù)組。2)創(chuàng)建一個動態(tài)增長存儲BVH節(jié)點的空間。若在未來添加節(jié)點的時候,發(fā)現(xiàn)空間不夠,可以把原來創(chuàng)建的BVH空間擴大一定數(shù)量,視需求而定。3)根據(jù)模型圖形元,分別求X軸、Y軸Z軸的跨度。這里用2D的情況解釋一下具體方法,如圖2所示最大的長方形內(nèi)部的三角形,顯然橫向跨度為(V2max-Vlmin )的x值,縱向跨度為(V2max-Vlmin )的y值,顯然這里x比y大,我們以x坐標軸使用SAH機制劃分空間。SAH假設(shè)光線是隨機發(fā)射的,因此碰到長方體的幾率也是一樣的,它保證空間劃分的時候盡量保證兩個子空間內(nèi)部的長方體面積相等。這樣得到的BVH-tree平衡性較高。4)為了發(fā)揮BVH的最大效率,我們選擇每個葉子節(jié)點能夠容納的最大一個三角形,以此判斷由3)分割的子節(jié)點當中的三角形數(shù)是否大于1,若大于I返回到步驟3),反之轉(zhuǎn)到步驟5)。5) BVH-tree構(gòu)造完畢,輸出線性結(jié)構(gòu)BVHlist數(shù)組,該數(shù)組結(jié)構(gòu)如圖3所示。一個BVH節(jié)點保存著一個長方體坐標最小點Vmin和一個坐標大點Vmax,這兩個點就可以確定一個長方體。我們默認該數(shù)組中節(jié)點的下一個元素即為節(jié)點的左節(jié)點,因此必須保存一個該節(jié)點的右節(jié)點和內(nèi)部三角形圖形元個數(shù)。若該節(jié)點是葉子節(jié)點,那么三角形圖形元個數(shù)就為O。6)設(shè)定視點和投影面,為了方便可以設(shè)置視點為(0,0,0),投影面的左下角為(-1,-1, 2)和右上角為(I, I, 2)。7)構(gòu)造一個節(jié)點元素堆棧,這個棧的大小也可以默認設(shè)定一個值,我們設(shè)定初始值為34,當棧溢出的時候可以動態(tài)增加一定的值,并且申明變量當前棧標記stackoffset=0o8)把當前射線與當前的節(jié)點長方體做相交測試。如圖4所示,每條射線表示為r=e+t*d,其中e為視點(0,0, 0),d為射線的方向,t為射線與某個空間結(jié)構(gòu)相交時的參數(shù)。根據(jù)圖2,首先我們計算射線與直線X=Xmin相交的參數(shù)txmin= (Xmin -Xe)/Xd。用相同的方法可以求得txmax, tymin, tymax。這條射線若與這個長方體相交,那么[txmin , txmax]和[tymin , tymax]應該相交。9)如果當前射線與這個BVH節(jié)點不相交,而且如果stackoffset為0,則表明當前光線沒有與場景相交,則結(jié)束當前射線光線追蹤;反之stackoffset大于0,那么stackoffset減I,并且把當前節(jié)點設(shè)置為棧中偏移量為stackoffset的節(jié)點,轉(zhuǎn)移到步驟8)。如果當前射線與這個BVH節(jié)點相交則轉(zhuǎn)移到步驟10)。10)判斷該BVH節(jié)點中是否有圖形元三角形,如果有,說明當前射線與一個BVH樹的葉子節(jié)點正方體有相交,并繼續(xù)用經(jīng)典的重心交點測試法測試該射線與節(jié)點內(nèi)的三角形是否相交,如果相交就把當前的節(jié)點和三角形序號交給該射線。若stackoffset等于0,則結(jié)束當前射線的光線追蹤;若stackoffset大于0就減1,并且把當前節(jié)點設(shè)置為堆棧中偏移量為stackoffset的節(jié)點,轉(zhuǎn)移到步驟8)。如果BVH節(jié)點沒有圖形元三角形就轉(zhuǎn)移到步驟11)。11)根據(jù)當前節(jié)點的右節(jié)點標記變量,把右節(jié)點序號放入棧中,然后stackoffset加1,把當前節(jié)點設(shè)置為之前節(jié)點的左節(jié)點?;氐讲襟E8)繼續(xù)測試。
權(quán)利要求
1.GPU上構(gòu)建BVH樹并行光線追蹤方法,其步驟為 O讀取3D場景模型,設(shè)置三角形的模型圖形元,這些數(shù)據(jù)存儲在GPU顯存中; 2)創(chuàng)建一個動態(tài)增長存儲BVH節(jié)點的空間; 3)根據(jù)模型圖形元,分別求X軸、Y軸和Z軸的跨度,并且求出最大值,以這個最大值的坐標軸使用SAH機制劃分空間; 4)判斷由步驟3)分割的子節(jié)點當中的三角形數(shù)目是否大于1,若大于I返回到步驟3),反之下一步; 5)BVH-tree構(gòu)造完畢,輸出線性結(jié)構(gòu)BVHlist數(shù)組; 6)根據(jù)視點和投影面構(gòu)造射線; 7)構(gòu)造一個BVH元素的堆棧,聲明變量stackoffset=0; 8)取當前射線與當前所指BVHlist節(jié)點做相交測試; 9)如果當前射線與這個BVH節(jié)點不相交,而且如果stackoffset為O,表明當前光線沒有與場景相交,結(jié)束當前射線的光線追蹤;反之stackoffset大于O,那么stackoffset減1,并且把當前節(jié)點設(shè)置為棧中偏移量為stackoffset的節(jié)點,轉(zhuǎn)移到步驟8);如果當前射線與這個BVH節(jié)點相交轉(zhuǎn)移到步驟10); 10)判斷該BVH節(jié)點中是否有圖形元三角形,如果有,說明當前射線與一個BVH樹的葉子節(jié)點正方體有相交,并繼續(xù)測試該射線與節(jié)點內(nèi)的三角形是否相交,如果相交就把當前的節(jié)點和三角形序號交給該射線。同時若stackoffset等于O,則結(jié)束當前射線的光線追蹤;若stackoffset大于O就減1,并且把當前節(jié)點設(shè)置為棧中偏移量為stackoffset的節(jié)點,轉(zhuǎn)移到步驟8)。如果BVH節(jié)點沒有圖形元三角形就轉(zhuǎn)移到步驟11); 11)根據(jù)當前節(jié)點的右節(jié)點標記變量,把右節(jié)點序號放入棧中,然后stackoffset加I,把當前節(jié)點設(shè)置為之前節(jié)點的左節(jié)點,轉(zhuǎn)移到步驟8)。
全文摘要
本發(fā)明公開了一種GPU上的并行構(gòu)建BVH樹進行光線追蹤方法,屬于計算機圖形學領(lǐng)域。圖形學中有些在傳統(tǒng)CPU上的串行計算方法已經(jīng)逐漸轉(zhuǎn)移到采用擁有強大并行計算能力的GPU來處理。本發(fā)明的方法為:應用GPU并行特性進行BVH空間劃分的數(shù)據(jù)結(jié)構(gòu)設(shè)計;采用SAH機制并行劃分空間;利用GPU并行計算射線與圖形元相交信息,從而提高光線追蹤效率。本發(fā)明能夠在GPU處理器架構(gòu)上并行高效地構(gòu)建輸入3D模型的高質(zhì)量BVH空間劃分結(jié)構(gòu),其效率要比傳統(tǒng)CPU串行優(yōu)化指令SIMD高。特別是在動態(tài)光線追蹤的情形下,其加速效率要遠高于目前比較流行的KD-Tree空間劃分方法。
文檔編號G06T15/06GK103021018SQ20121044105
公開日2013年4月3日 申請日期2012年11月7日 優(yōu)先權(quán)日2012年11月7日
發(fā)明者吳哲夫, 虞鴻, 何熊熊, 陳濱 申請人:浙江工業(yè)大學