專利名稱:圖形處理器上的表面積啟發(fā)式構建kd樹并行方法
技術領域:
本發(fā)明涉及圖形處理器并行計算領域,尤其涉及3D模型空間剖分結構的并行構
建方法。
背景技術:
在計算機圖形學中,為了生成真實感的照片級別的效果,就需要模擬真實場景的光線原理。即對每一條光線進行跟蹤,準確地計算其反射、折射和陰影,便可以得到照片級別真實感的渲染效果。在這整個計算過程中,最為費時的是光線跟3D場景的求交過程?,F(xiàn)有的各種各樣版本的光線跟蹤方法及其變形,無一不是要先對場景進行空間剖分,建立空間剖分樹;然后再進行光線跟蹤。在對場景進行空間剖分的方法中,主要有三種空間剖分方法,Octree, BVH-tree和KD-tree。這三種空間剖分結構盡管都可以用加速光線和3D場景的求交過程,但是KD-Tree的加速效果確是最好的。在眾多的空間剖分樹生成算法中,為了保證生成樹的質量,必須使用SAH (表面積啟發(fā))方法來進行進行空間剖分,這個經典剖分優(yōu)化方法經過無數(shù)實驗證明是極為有效的。 但是該優(yōu)化剖分算法在帶來高質量的KD-Tree的同時,卻需要極大的時間開銷,這就使得快速構建空間剖分樹變得極為困難。目前的絕大部分KD-Tree快速構造算法都是選擇忽略 SAH優(yōu)化函數(shù)的計算或者只是近似計算SAH優(yōu)化函數(shù),以便于加速KD-Tree的構建。但近年來的許多研究表明,這些近似方法所產生的KD-Tree質量是非常之低下的,盡管加快了構建速度,但是卻極大地影響了光線跟3D場景求交的效率。如果利用GPU (圖形處理器)來計算準確的SAH優(yōu)化函數(shù)的話,傳統(tǒng)的CPU上的串行方法卻不能很好地發(fā)揮GPU流架構的強大并行計算能力。并且當前的GPU上的KD-Tree并行構建方法的缺陷在于首先,并沒有采用SAH優(yōu)化剖分方法,而是直接忽略了 SAH優(yōu)化,直接進行空間中分,降低了 KD-Tree的質量。其次,當前的GPU和多核CPU上構建KD-Tree的方法,并沒有在剖分過程中對三角面片進行切分,所以在最終生成的KD-Tree結構中有許多冗余的幾何信息,這就極大地降低了 KD-Tree的質量和光線求交的效率。
發(fā)明內容
本發(fā)明提出了一種在GPU流架構上對3D模型高效構建SAH KD-Tree的并行方法, 用以解決當前GPU流計算架構上,光線跟蹤渲染應用中的高效率地構建高質量的KD-Tree 的問題。本發(fā)明方法包括以下步驟
步驟1 輸入3D模型數(shù)據(jù),對于非三角面片的幾何場景,進行三角面片化。然后將場景數(shù)據(jù)存儲到GPU的顯存中。步驟2:根據(jù)輸入的3D模型的三角面片數(shù)目n,分配大小為η的節(jié)點鏈表 nodelist,大小為η節(jié)點分裂隊列iqueue和oqueue。在構建過程如有發(fā)生溢出,則對nodelist, iqueue 禾口 oqueue 的大小擴展一倍。步驟3 生成樹的根節(jié)點root,同時對落在root內的所有三角面片的包圍盒在三條坐標軸上的投影區(qū)域的極大值^liax和極小值^llin所組成的三個序列進行排序。然后把根節(jié)點root壓入節(jié)點鏈表nodelist和分裂隊列iqueue。步驟4 判斷分裂隊列是否為空,如果為空,則轉移到步驟5,反之轉移到步驟6。步驟5 =KD-Tree構造完畢,輸出節(jié)點鏈表nodelist,結束。步驟6 把iqueue中的待分裂節(jié)點,加入到節(jié)點鏈表nodelist中。步驟7 利用標準并行原語scan并行計算iqueue中待分裂節(jié)點的SAH優(yōu)化函數(shù), 并利用規(guī)約原語segmentecLreduce選取每一個待分裂節(jié)點的最優(yōu)SAH剖分。步驟8 根據(jù)步驟7中得到的iqueue隊列中待分裂節(jié)點的最優(yōu)剖分,對節(jié)點進行剖分,并且對剖分新生成的節(jié)點中的非葉結點,全部添加到oqueue中。步驟9 對oqueue中節(jié)點所包含的三角面片的包圍盒端點,按照三條坐標軸方向, 利用父節(jié)點的面片區(qū)間一定會覆蓋整個子節(jié)點的面片區(qū)間的原理,進行快速并行排序。步驟10 交換隊列iqueue和oqueue,返回步驟4。本發(fā)明有益效果如下該發(fā)明首次在GPU流計算架構上對3D模型實現(xiàn)了高質量的SAH KD-Tree的并行構建方法。其次在構建KD-Tree空間剖分樹的每一個節(jié)點,都是采用SAH優(yōu)化剖分方法,同時在剖分的過程中,對三角面片都進行了裁剪切分,這極大地提高了 KD-Tree的質量。對比傳統(tǒng)的KD-Tree并行構建方法,該發(fā)明提出了創(chuàng)新的快速計算全 SAH優(yōu)化剖分函數(shù)和快速排序包圍盒的并行方法。
圖1為算法流程圖。圖2節(jié)點中的三角形的包圍盒示意圖。圖3三角形包圍盒在坐標軸上的投影區(qū)域極值圖。圖4 SAH優(yōu)化函數(shù)并行計算圖。圖5和父節(jié)點剖分平面相垂直的情況視圖。圖6和父節(jié)點剖分平面相平行的情況視圖。
具體實施例方式以下結合附圖對本發(fā)明作進一步說明,如圖1所示,本發(fā)明包括以下步驟
步驟1 輸入3D模型數(shù)據(jù),對于非三角面片的3D場景,進行三角面片化。然后將場景數(shù)據(jù)存儲到GPU的顯存中。其中3D場景包含的數(shù)據(jù)為兩個數(shù)組,即三角面片定點數(shù)組和三角面片頂點索引數(shù)組。步驟2 根據(jù)輸入的3D模型數(shù)據(jù)的三角面片數(shù)目n,分配大小為η的節(jié)點鏈表 node 1 i st,大小為η節(jié)點分裂隊列iqueue和oqueue。在構建過程如有發(fā)生溢出,則對 nodelist, iqueue和oqueue的大小擴展一倍。其中nodelist的數(shù)據(jù)結構為5個數(shù)組 tlist(三角面片索引),pf_lch(節(jié)點第一個三角面片地址或者左節(jié)點指針),pn_rCh(節(jié)點所包含的三角面片數(shù)目或者右節(jié)點指針),sp (剖分平面位置,最后2個bit (比特位)表示所在坐標軸和節(jié)點類型),aabb (節(jié)點的包圍盒)。
而分裂隊列iqueue和oqueue的數(shù)據(jù)結構為8個數(shù)組modeid (當前待分裂節(jié)點在nodelist中的索引值),pf(待剖分節(jié)點所包含的第一個三角面片在plist中的索引),pn(待剖分節(jié)點所包含的三角面片數(shù)目hnodeaabb(待剖分節(jié)點的包圍盒),powner (三角面片屬于的待剖分節(jié)點索引),plist (包含在待剖分節(jié)點中的三角面片序列),esort (plist中的三角面片的包圍盒在三條坐標軸上的投影區(qū)域的最大值Emax和最小值^lin (圖3)所組成的三個有序序列),epos (記錄plist中每個三角面片的包圍盒(圖 2)在三條坐標軸上的投影區(qū)域的最大最小值^liax和Emin在esort有序序列中的索引)。步驟3 生成樹的根節(jié)點root,同時對落在root內的所有三角面片的包圍盒(見圖 2)在三條坐標軸上的投影的極大值^iax和極小值^llin (如圖3)所組成的三個序列進行排序。然后把根節(jié)點root壓入節(jié)點鏈表nodelist和分裂隊列iqueue。排序使用標準的并行排序原語radixsort。步驟4 判斷分裂隊列是否為空,如果為空,則轉移到步驟5,反之轉移到步驟6。步驟5 =KD-Tree構造完畢,輸出節(jié)點鏈表nodelist,結束。步驟6 把iqueue中的待分裂節(jié)點,加入到節(jié)點鏈表nodelist中。步驟7 利用標準并行原語scan并行計算iqueue中待分裂節(jié)點的SAH優(yōu)化函數(shù), 并利用規(guī)約原語segmentecLreduce選取每一個待分裂節(jié)點的最優(yōu)SAH剖分。具體步驟如圖4所示,假定某一節(jié)點包含3個三角面片則
7-1.首先分配和iqueue中esort. size 一樣大小的輔助標記數(shù)組flags。7-2.發(fā)起數(shù)目為iqueue中plist. size的多線程,每一個線程k(其中k=0,l,2,.. plist. size - 1)分別讀取印Os [k],然后把相應的flags數(shù)組進行置位,即對于epos[k]. start (三角形包圍盒投影到坐標軸的投影區(qū)域的最小值)和印osDO. end (三角形包圍盒投影到坐標軸的投影區(qū)域的最大值)分別置對應的flags值為1和0。7-3.然后對flags數(shù)組利用并行原語scan運算,結果導出到sflag數(shù)組。7-4.發(fā)起數(shù)目為iqueue中plist. size的多線程,每個線程計算對應的SAH優(yōu)化函數(shù)CT + C1 (NlSl + NeSe) / S,其中只有Nl和Nk是未知的,可以通過如下兩個公式對其進行快速計算Njk] =Sflag [k],Ne [k] = 3 - (k - sflag [k]) _(1_ flags [k]),然后代入SAH優(yōu)化函數(shù)計算公式進行計算。7-5.利用并行原語segmentjeduce根據(jù)上一步驟7_4計算出來的SAH采樣值得到iqueue中每一個帶分裂節(jié)點的最優(yōu)剖分平面。步驟8 根據(jù)步驟7中得到的iqueue隊列中待分裂節(jié)點的最優(yōu)剖分,對節(jié)點進行剖分,并且對剖分新生成的節(jié)點中的非葉結點,全部添加到oqueue中。步驟9 對oqueue中節(jié)點所包含的三角面片的包圍盒端點,按照三條坐標軸方向, 利用父節(jié)點的esort區(qū)間一定會覆蓋整個子節(jié)點的esort區(qū)間的原理。進行快速并行排序。 具體計算過程如圖5和圖6所示,這時分為兩種情況進行討論
9-1.對于和剖分平面相垂直的子節(jié)點的esort序列,經過剖分平面的切分之后并沒有出現(xiàn)亂序,比如圖5所示節(jié)點包含3個三角面片0,1,2,經過剖分平面S2的切割之后,盡管有的三角形的包圍盒發(fā)生了變化,并且產生了新的投影邊界比如ΕΓ和S1’,但子節(jié)點的 esort數(shù)組的大小順序并沒有受到影響。也就是說子節(jié)點直接繼承了父節(jié)點的有序性。9-2.對于和剖分平面相平行的子節(jié)點的esort序列,經過剖分平面切割之后出現(xiàn)了亂序邊界ΕΓ和Si’,但是根據(jù)父節(jié)點的esort區(qū)間一定會覆蓋整個子節(jié)點的esort區(qū)間的原理(如圖6所示),可以利用父節(jié)點的esort有序序列形成的區(qū)間來對子節(jié)點的esort 序列進行排序。整個排序過程分為四個步驟,第一步分配四個臨時數(shù)組bid (記錄對應的區(qū)間索引),Iid (記錄在對應區(qū)間內的局部位置),bbegin (記錄區(qū)間開始位置),count (每個區(qū)間內的計數(shù)器)。第二步對子節(jié)點的esort的每一個元素發(fā)起一個線程,然后通過二分查找找到對應的區(qū)間索引,然后對該區(qū)間的計數(shù)器進行原子操作加一,并把原子操作結果記錄在對應的Iid中。第三步對區(qū)間計數(shù)器count數(shù)組進行并行scan操作,把結果寫到IDbegin數(shù)組中。也就是得到了區(qū)間的新的起始位置。然后把子節(jié)點的esort的第k個元素移動到新的位置t3begin[bi(Uk]]+lidl·]。通過這一個步驟,所有落在同一個區(qū)間中的元素都相鄰的排在了一起,區(qū)間之間的序已排好,但區(qū)間內的序列還可能是亂序。第四步 因為每一個區(qū)間內的元素數(shù)目都是很小的,所以可以對子節(jié)點的esort的每一個元素發(fā)起一個線程,對每一個區(qū)間內的元素進行兩兩排序。
步驟10 交換隊列iqueue和oqueue,返回步驟4。
權利要求
1.圖形處理器上的表面積啟發(fā)式構建KD樹并行方法,其特征在于該方法包括以下步驟步驟1 輸入3D模型數(shù)據(jù),對于非三角面片的幾何場景,進行三角面片化,然后將場景數(shù)據(jù)存儲到GPU的顯存中;步驟2 根據(jù)輸入的3D模型的三角面片數(shù)目n,分配大小為η的節(jié)點鏈表nodelist,大小為η節(jié)點分裂隊列iqueue和節(jié)點分裂隊列oqueue,在構建過程如有發(fā)生溢出,則對節(jié)點鏈表nodelist、節(jié)點分裂隊列iqueue和節(jié)點分裂隊列oqueue的大小擴展一倍;步驟3 生成樹的根節(jié)點root,同時對落在根節(jié)點root內的所有三角面片的包圍盒在三條坐標軸上的投影區(qū)域的極大值Emax和極小值Emin所組成的三個序列進行排序,然后把根節(jié)點root壓入節(jié)點鏈表nodelist和分裂隊列iqueue ;步驟4 判斷分裂隊列是否為空,如果為空,則轉移到步驟5,反之轉移到步驟6 ; 步驟5 =KD-Tree構造完畢,輸出節(jié)點鏈表nodelist,結束; 步驟6 把節(jié)點分裂隊列iqueue中的待分裂節(jié)點,加入到節(jié)點鏈表nodelist中; 步驟7 利用標準并行原語scan并行計算節(jié)點分裂隊列iqueue中待分裂節(jié)點的SAH優(yōu)化函數(shù),并利用規(guī)約原語segmentecLreduce選取每一個待分裂節(jié)點的最優(yōu)SAH剖分;步驟8 根據(jù)步驟7中得到的節(jié)點分裂隊列iqueue中待分裂節(jié)點的最優(yōu)剖分,對節(jié)點進行剖分,并且對剖分新生成的節(jié)點中的非葉結點,全部添加到節(jié)點分裂隊列oqueue中;步驟9 對節(jié)點分裂隊列oqueue中節(jié)點所包含的三角面片的包圍盒端點,按照三條坐標軸方向,利用父節(jié)點的面片區(qū)間一定會覆蓋整個子節(jié)點的面片區(qū)間的原理,進行快速并行排序;步驟10 交換節(jié)點分裂隊列iqueue和節(jié)點分裂隊列oqueue,返回步驟4。
全文摘要
本發(fā)明公開了一種圖形處理器上的表面積啟發(fā)式構建KD樹并行方法。傳統(tǒng)的CPU上的串行方法卻不能很好地發(fā)揮GPU流架構的強大并行計算能力。本發(fā)明方法包括輸入3D場景數(shù)據(jù)描述;KD-Tree空間剖分結構的數(shù)據(jù)結構設計;SAH優(yōu)化函數(shù)并行計算;并行三角面片切割和排序。本發(fā)明能夠在GPU流架構上高效并行地對輸入的3D模型構建高質量的KD-Tree空間剖分結構,其效率要比傳統(tǒng)的CPU上的串行和并行方法都要高,而且在對光線求交的加速比方面要遠遠高于當前GPU上較流行的BVH-Tree加速方法。
文檔編號G06T15/06GK102426710SQ201110241419
公開日2012年4月25日 申請日期2011年8月22日 優(yōu)先權日2011年8月22日
發(fā)明者劉新國, 吳哲鋒, 趙福凱 申請人:浙江大學