袁 斌
(北京應(yīng)用物理與計(jì)算數(shù)學(xué)研究所,北京 100088)
在醫(yī)學(xué)、計(jì)算物理等領(lǐng)域涉及大規(guī)模的體數(shù)據(jù)集,需要合適的可視化技術(shù)。體繪制技術(shù)是重要的可視化技術(shù)之一。體繪制的研究多集中于無(wú)結(jié)構(gòu)數(shù)據(jù)場(chǎng)和均勻數(shù)據(jù)場(chǎng)的研究,比如,對(duì)于均勻數(shù)據(jù)場(chǎng)有光線投射方法[1],shear-warp 方法[2],紋理體繪制方法[3?5]和GPU 光線投射方法[6?9]。Steven P 采用k-buffer 較好地實(shí)現(xiàn)了無(wú)結(jié)構(gòu)數(shù)據(jù)場(chǎng)體繪制[10]。
可編程圖形處理器GPU 是特殊的SIMD 硬件,提供了片元編程技術(shù),它提供了許多SIMD指令[11]。SIMD 是單指令多數(shù)據(jù)的并行機(jī)制。SIMD 技術(shù)適合于3D 數(shù)據(jù)場(chǎng)的繪制,3D 點(diǎn)的位置可以用坐標(biāo)向量(x, y, z)表示,也可以用齊次坐標(biāo)向量(x, y, z, w)表示,而顏色用向量(r, g, b, a)表示。圖形數(shù)據(jù)很適合于用向量表示,在圖形繪制中采用SIMD 技術(shù)是很自然的事情。借助于紋理映射,在片元處理階段,可以進(jìn)行光線積分。GPU 光線投射方法可以看作光柵化方法和光線投射方法結(jié)合的方法,在GPU 中, 首先要繪制三角面片,才能執(zhí)行相應(yīng)的片元處理?;贕PU片元編程的算法是一種SIMD 算法。
在目前的3D 科學(xué)計(jì)算中經(jīng)常使用非均勻直線網(wǎng)格(Non-uniform Rectilinear Grid),它根據(jù)物理量的變化自適應(yīng)地調(diào)整網(wǎng)格間隔。非均勻直線網(wǎng)格與均勻網(wǎng)格的區(qū)別在于,它的每個(gè)方向的網(wǎng)格間隔是變化的。在CPU 光線積分中,需要判別采樣點(diǎn)所在的位置,對(duì)于均勻網(wǎng)格很容易通過(guò)簡(jiǎn)單的取整計(jì)算即可以實(shí)現(xiàn),對(duì)于非均勻網(wǎng)格不能采用這種方法。在GPU 體繪制中,紋理圖像相當(dāng)于均勻網(wǎng)格,它不能直接表示非均勻網(wǎng)格。因而,無(wú)法使用目前業(yè)已存在的針對(duì)均勻網(wǎng)格的基于切片的紋理體繪制方法和GPU 光線投射方法。一般處理辦法是將非均勻直線網(wǎng)格轉(zhuǎn)換成均勻網(wǎng)格, 然后利用這兩種方法進(jìn)行體繪制。但是,這樣會(huì)導(dǎo)致數(shù)據(jù)量大大增加,并且需要重采樣,必然會(huì)花費(fèi)相當(dāng)?shù)挠?jì)算時(shí)間和帶來(lái)一定的誤差。這里以Lared-S 密度數(shù)據(jù)(非均勻直線網(wǎng)格)為例,來(lái)說(shuō)明這一點(diǎn)。它的節(jié)點(diǎn)數(shù)為220×80×80,如果把它轉(zhuǎn)換成均勻網(wǎng)格,為了減小失真,在每個(gè)方向上,均勻網(wǎng)格的網(wǎng)格間距必須不大于原網(wǎng)格最小間距的一半,這樣網(wǎng)格節(jié)點(diǎn)至少為15250×159×159,是原來(lái)網(wǎng)格的273.8 倍。這里均勻網(wǎng)格梯度計(jì)算的時(shí)間必然遠(yuǎn)大于原網(wǎng)格梯度計(jì)算的時(shí)間,而且重采樣需要花費(fèi)大量的計(jì)算時(shí)間。因而,研究針對(duì)非均勻直線網(wǎng)格的GPU 體繪制方法是很有意義的。
本文首先給出針對(duì)非均勻直線網(wǎng)格的CPU光線投射方法,一方面它為后面的內(nèi)容作鋪墊,另一方面可以用來(lái)比較。接著給出針對(duì)非均勻直線網(wǎng)格的基于輔助紋理的GPU 光線投射和基于切片的3D 紋理體繪制方法。最后,對(duì)這些方法進(jìn)行了比較分析。
本文先給出針對(duì)非均勻直線網(wǎng)格的CPU 光線投射方法。
光線投射方法的基本思想是,對(duì)每個(gè)像素發(fā)出一條光線,沿光線進(jìn)行光亮度積分。在光線積分過(guò)程中,沿光線進(jìn)行均勻采樣。當(dāng)光線跨出數(shù)據(jù)包圍盒,或不透明度接近1,停止追蹤。對(duì)于非均勻直線網(wǎng)格,在光線積分過(guò)程中,借助均勻的輔助網(wǎng)格,快速確定采樣點(diǎn)所在的單元。
輔助網(wǎng)格的設(shè)計(jì)應(yīng)該使它具有最少的存儲(chǔ)量和最簡(jiǎn)單的計(jì)算形式。按照這種想法,本文中使用的輔助網(wǎng)格,是隱式網(wǎng)格,它的每個(gè)網(wǎng)格單元或節(jié)點(diǎn)并不占用內(nèi)存。輔助網(wǎng)格的網(wǎng)格面與原網(wǎng)格的網(wǎng)格面平行,輔助網(wǎng)格的每個(gè)方向的網(wǎng)格間隔應(yīng)該小于非均勻網(wǎng)格的相應(yīng)方向的最小網(wǎng)格間隔,這樣在每個(gè)方向上,輔助網(wǎng)格單元至多與原網(wǎng)格的1 個(gè)網(wǎng)格面相交。設(shè)輔助網(wǎng)格的尺寸為nx×ny×nz。非均勻直線網(wǎng)格的坐標(biāo)數(shù)組(或稱為坐標(biāo)向量)為X, Y, Z 在實(shí)際計(jì)算中,需要把它們變換到輔助網(wǎng)格的體素空間。這里需要3 個(gè)索引數(shù)組xindex,yindex,zindex(它們的數(shù)組元素的個(gè)數(shù)分別為nx, ny, nz),分別定義為
例如,如圖1 所示,非均勻直線網(wǎng)格的邊界與輔助網(wǎng)格的邊界重合,實(shí)線為非均勻網(wǎng)格的網(wǎng)格線,虛線為輔助網(wǎng)格的網(wǎng)格線,xindex[0] =0,xindex[1]=1,xindex[2]= index[3]=2。按照這個(gè)定義,每個(gè)索引只保存一個(gè)整數(shù)值。在實(shí)際計(jì)算中,xindex 用O(n)的算法實(shí)現(xiàn):
yindex,zindex 采用類似的方法計(jì)算。
實(shí)現(xiàn)輔助網(wǎng)格占用的空間為O(nx+ ny+ nz),而不是O(nx×ny×nz)。
在光線積分過(guò)程中,先通過(guò)取整,計(jì)算采樣點(diǎn)所在的輔助網(wǎng)格單元,再利用索引快速發(fā)現(xiàn)采樣點(diǎn)所在的直線網(wǎng)格單元,光線的當(dāng)前采樣點(diǎn)的位置為(xs, ys, zs)。通過(guò)如下方法得到的(icx, icy, icz),即是采樣點(diǎn)所在單元的結(jié)構(gòu)坐標(biāo)。
然后,進(jìn)行插值計(jì)算,通過(guò)查表計(jì)算不透明度,如果不透明度不為0,通過(guò)查表計(jì)算光照效果,累積顏色和不透明度。在這個(gè)算法中,單元(xindex[ix], yindex[iy], zindex[iz])稱為推薦單元;當(dāng)前采樣點(diǎn)所在的單元,稱為當(dāng)前單元。推薦單元未必是當(dāng)前單元,通過(guò)修正得到當(dāng)前單元。
非均勻直線網(wǎng)格中,節(jié)點(diǎn)(i, j, k)的梯度采用如下的加權(quán)差分公式計(jì)算,梯度作為法向量用于光照計(jì)算,采用Phone 的光照模型,這樣光照效果反映了數(shù)據(jù)的局部變化。
圖1 輔助網(wǎng)格
在體繪制中有些數(shù)據(jù)的不透明度值為0,對(duì)體繪制積分沒(méi)有任何貢獻(xiàn),視為無(wú)效數(shù)據(jù)。包含所有有效單元的最小長(zhǎng)方體,稱為有效區(qū)域。在繪制時(shí)只對(duì)有效區(qū)域進(jìn)行繪制。這樣不訪問(wèn)無(wú)用的單元,大大提高性能。本文只對(duì)有效區(qū)域內(nèi)的光線段進(jìn)行體繪制積分,這樣可以忽略大片的空白區(qū)域,加快繪制速度。
在體繪制時(shí)按照Nyquist 采樣定理,光線上采樣點(diǎn)的間隔取為最小網(wǎng)格間隔的一半。如果要得到更精確的圖像可以用更小的采樣間隔。
GPU 的光線投射的基本步驟是:
(1) 把數(shù)據(jù)場(chǎng)裝入GPU 內(nèi)存;
(2) 裝入片元程序;
(3) 設(shè)置片元程序的輸入?yún)?shù);
(4) 啟用片元程序;
(5) 繪制有效數(shù)據(jù)體包圍盒的前表面。
在對(duì)一個(gè)數(shù)據(jù)場(chǎng)進(jìn)行交互繪制時(shí),只在第一次繪制時(shí)需要數(shù)據(jù)裝入操作。為了加快繪制,只繪制有效區(qū)域,因而只需裝入有效區(qū)域的數(shù)據(jù)。通過(guò)繪制有效數(shù)據(jù)體包圍盒的前表面,對(duì)它所覆蓋的每個(gè)片元(fragment),調(diào)用片元程序,進(jìn)行光線積分。在光線積分過(guò)程中,需要計(jì)算每個(gè)采樣點(diǎn)的標(biāo)量值和梯度值,然后通過(guò)查傳輸函數(shù)獲得采樣點(diǎn)的材質(zhì)(Material,包括顏色和不透明度),采用Phone 的光照模型計(jì)算顏色,并進(jìn)行累積。對(duì)于均勻網(wǎng)格,在把標(biāo)量數(shù)據(jù)和梯度數(shù)據(jù)裝入紋理內(nèi)存后,可以直接通過(guò)紋理映射快速計(jì)算每個(gè)采樣點(diǎn)的標(biāo)量值和梯度值。然而,對(duì)于非均勻直線網(wǎng)格需要借助于輔助紋理來(lái)完成這一過(guò)程。
對(duì)于模型空間V(或稱為物理空間)內(nèi)的非均直線網(wǎng)格R,可以通過(guò)“擠壓變換”T 強(qiáng)制其間隔均等,使R 變成一個(gè)均勻網(wǎng)格S,它作為三維紋理圖像裝入GPU 內(nèi)存,該紋理空間記為Q,紋理裝入實(shí)現(xiàn)了一個(gè)線性變換M,把S 映射為Q中的均勻網(wǎng)格,不妨表示為MTR,MTR 的每個(gè)節(jié)點(diǎn)為紋元(texel)的中心。T 是一個(gè)非線性變換,但它是分段線性變換, 當(dāng)它約束到每個(gè)單元空間,即為線性變換。R 的輔助網(wǎng)格A 是模型空間V 中的均勻網(wǎng)格,在實(shí)際計(jì)算時(shí),需要用線性變換L,把A 變換成輔助紋理空間B 中的均勻網(wǎng)格,記為L(zhǎng)A。用L 把R 變換到B,仍然得到一個(gè)非均勻直線網(wǎng)格,不妨用LR 表示。A 的體素(voxel)空間為C,變換H 把A 變換為C 中的間隔為1的均勻網(wǎng)格;H 把R 變換到C,仍然得到一個(gè)非均勻直線網(wǎng)格,不妨用HR 表示。MTL-1是非線性變換,它可以把輔助紋理空間B 中采樣點(diǎn)的坐標(biāo)轉(zhuǎn)換為Q 中的坐標(biāo),進(jìn)而通過(guò)紋理映射得到標(biāo)量和梯度。
對(duì)每個(gè)方向只要一維的輔助紋理,它保存原網(wǎng)格的索引,稱為索引紋理,這里索引紋理的尺寸應(yīng)該為2 的冪。每個(gè)索引紋理保存MTR 的垂直于相應(yīng)坐標(biāo)軸的網(wǎng)格面的截距。在此,xindex的定義修正為
這里,X 是HR 的坐標(biāo)向量。
yindex, zindex 的定義和計(jì)算方法也要作相應(yīng)修正。
由于GPU 中紋理的最大尺寸為4096。而輔助網(wǎng)格的尺寸會(huì)超過(guò)這個(gè)值,因此,把索引信息均分成幾段,每一段作為2D 紋理的一行,這樣把一維紋理折疊成2 維紋理。3 個(gè)方向的索引紋理的高度分別用xh, yh, zh 表示,輔助紋理空間B為[0, xh]×[0, yh]×[0, zh],繪制有效區(qū)域時(shí),其包圍盒頂點(diǎn)的紋理坐標(biāo)設(shè)置為L(zhǎng)A 包圍盒的頂點(diǎn)坐標(biāo)。另外,對(duì)每個(gè)方向,還要有一維紋理保存紋理空間B 中非均勻直線網(wǎng)格LR 的坐標(biāo)向量,稱為坐標(biāo)紋理。為了保證精度,索引紋理和坐標(biāo)紋理,均采用32 位浮點(diǎn)紋理,它們的放大和縮小濾波方式均設(shè)置為GL_NEAREST。
作者按照公式(1)計(jì)算梯度量和梯度,保存到3D 紋理圖像中;把標(biāo)量和梯度數(shù)據(jù)裝入GPU 內(nèi)存。此外,還要把索引紋理和坐標(biāo)紋理裝入到GPU 內(nèi)存。在片元程序中,在輔助紋理空間B中進(jìn)行積分。在光線積分中,對(duì)每個(gè)采樣點(diǎn)p,計(jì)算MTL-1p,得到Q 中的紋理坐標(biāo),通過(guò)紋理映射得到標(biāo)量值和梯度,由傳輸函數(shù)(用紋理表示)得到采樣點(diǎn)的材質(zhì),通過(guò)光照計(jì)算得到采樣點(diǎn)的顏色,累積顏色和不透明度。
在直線網(wǎng)格中,單元(i, j, k)有8 個(gè)頂點(diǎn),均為網(wǎng)格節(jié)點(diǎn);其中,節(jié)點(diǎn)(i, j, k)稱為它的第一頂點(diǎn),節(jié)點(diǎn)(i+1, j+1, k+1)稱為它的第8 頂點(diǎn)。計(jì)算變換MTL-1的算法思想是,根據(jù)光線采樣點(diǎn)的坐標(biāo)查索引紋理,查得推薦單元第一頂點(diǎn)在紋理空間Q 中的坐標(biāo),保存到t1,通過(guò)LR 的坐標(biāo)向量紋理,由t1 查得第一頂點(diǎn)在B 中的坐標(biāo),把它與當(dāng)前采樣點(diǎn)的坐標(biāo)比較,修正t1 得到當(dāng)前單元的第一頂點(diǎn)在Q 中的紋理坐標(biāo),計(jì)算當(dāng)前單元的第8 頂點(diǎn)在Q 中的紋理坐標(biāo)tb;通過(guò)LR 的坐標(biāo)向量紋理,由t1 查得當(dāng)前單元第一頂點(diǎn)在B 中的坐標(biāo)a,第8 頂點(diǎn)在B 中的紋理坐標(biāo)b,計(jì)算當(dāng)前采樣點(diǎn)在當(dāng)前單元中的插值參數(shù);進(jìn)而計(jì)算當(dāng)前采樣點(diǎn)在Q 中的紋理坐標(biāo)。下面給出具體算法,這是向量算法。索引紋理映射可以用函數(shù)XIndex(v), YIndex(v), ZIndex(v)表示,v 是向量,為2D 紋理坐標(biāo)。spacing.x, spacing.y, spacing.z分別表示Q 中s, t, r 方向相鄰紋元的間隔。這里用X(s), Y(s), Z(s)表示直線網(wǎng)格LR 的坐標(biāo)向量紋理映射,s 為1D 紋理坐標(biāo)。如果操作數(shù)為向量,+, – ,*, / 為向量運(yùn)算。a.x, b.x 等為標(biāo)量,無(wú)“.”的變量為4 維向量。向量函數(shù)SLT(u, v)表示向量比較指令SLT[11]。texcoord 為輔助紋理坐標(biāo)。向量函數(shù)fraction(v)取v 的每個(gè)分量的小數(shù)部分,向量函數(shù)floor(v)取v 的每個(gè)分量的整數(shù)部分。算法如下:
算法1 計(jì)算變換MTL-1的算法
用算法1 計(jì)算出t1 后,用t1 通過(guò)紋理映射查詢標(biāo)量值和梯度值。
光線積分在輔助紋理空間B 中進(jìn)行,需要對(duì)采樣步長(zhǎng)進(jìn)行修正。下面說(shuō)明這一點(diǎn)。
由此可見(jiàn),在透視變換下,如果在LA 中,采用同樣的步長(zhǎng)進(jìn)行采樣,不同方向的光線在模型空間V 中的相應(yīng)采樣步長(zhǎng)很可能不同。因此,要使得各方向光線的采樣步長(zhǎng)變換到模型空間V中保持相同,必須在B 中根據(jù)光線方向計(jì)算采樣步長(zhǎng)。設(shè)在輔助紋理空間B 中光線方向?yàn)関(單位向量),在模型空間V 中設(shè)定采樣步長(zhǎng)為d,那么,該光線在輔助紋理空間B 中的采樣步長(zhǎng)是
首先實(shí)現(xiàn)了針對(duì)均勻網(wǎng)格的GPU 光線投射方法,在實(shí)現(xiàn)過(guò)程中,參考了S Stegmaier 等人的片元程序[6]和vtk[12]的3D 紋理體繪制中的片元程序。整個(gè)光線投射算法是用ARB fp1 匯編語(yǔ) 言[11]實(shí)現(xiàn),為了采用分支命令和循環(huán)命令,在程序開(kāi)頭加上OPTION NV_fragment_program2。在實(shí)現(xiàn)的用于光線積分的片元程序中采用了光線早終止技術(shù),只要累積不透明度大于0.98, 就終止光線積分,這樣節(jié)省計(jì)算。如果采樣點(diǎn)的透明度為0,則跳過(guò)采樣點(diǎn),不進(jìn)行光照計(jì)算,這樣也可以節(jié)省計(jì)算。在此基礎(chǔ)上,把前面的算法1用ARB fp1 匯編語(yǔ)言實(shí)現(xiàn),并插入到光線積分循環(huán)中每步的開(kāi)頭,從而實(shí)現(xiàn)了基于輔助網(wǎng)格的針對(duì)非均勻直線網(wǎng)格的GPU 光線投射方法。
算法采用標(biāo)量傳輸函數(shù)(它把采樣點(diǎn)的標(biāo)量轉(zhuǎn)換成顏色和不透明度)和梯度量傳輸函數(shù)(它把梯度量轉(zhuǎn)換成調(diào)制因子)。算法用數(shù)組表示傳輸函數(shù),并裝入一維紋理,這樣通過(guò)紋理映射實(shí)現(xiàn)傳輸函數(shù)。通過(guò)采用梯度量調(diào)制,可以突出梯度變化大的區(qū)域,使物質(zhì)分界面更清晰。
作者又把2.1 節(jié)的算法與基于切片的3D 紋理體繪制算法結(jié)合,得到針對(duì)非均勻直線網(wǎng)格的3D 紋理體繪制方法。在該算法中不必對(duì)采樣步長(zhǎng)進(jìn)行校正。算法中所用的切片平行于視平面。為了提高繪制精度,切片的間隔為最小網(wǎng)格間隔的一半。
作者實(shí)現(xiàn)了針對(duì)非均勻直線網(wǎng)格的CPU 光線投射和GPU 光線投射,以及基于切片的3D 紋理體繪制。為了便于描述,在下文中分別簡(jiǎn)稱為GPU 光線投射,CPU 光線投射和3D 紋理體繪制。
在Intel P4 3.0GHz 的機(jī)器上測(cè)試上述算法,它裝有Nvidia Geforce 6800GT 圖形卡。在測(cè)試中GPU 光線投射和CPU 光線投射采用一致的采樣步長(zhǎng)(即把兩種方法的采樣點(diǎn)映射到同樣的坐標(biāo)系下,兩者的采樣步長(zhǎng)是相等的),相當(dāng)于3D 紋理體繪制中相鄰切片的距離。為了保證繪制質(zhì)量,采樣步長(zhǎng)均為最小網(wǎng)格間隔的一半。
如圖2,對(duì)于vtk 的非均勻直線網(wǎng)格RectGrid數(shù)據(jù)進(jìn)行繪制,數(shù)據(jù)尺寸47×33×44,圖像尺寸(視區(qū)尺寸)512×512,采用初始傳輸函數(shù)。CPU光線投射方法繪制時(shí)間6.375 秒, 最大積分步數(shù)156。如圖2(b),GPU 光線投射,繪制時(shí)間0.265秒。如圖2(d)所示,用3D 紋理體繪制方法,繪制到普通幀緩存,圖像質(zhì)量較差,這是由于普通幀緩存,R、G、B、A 分量各占8 位,因而精度不夠, 當(dāng)不透明度小于1/256 時(shí),便被忽略,不能正確累積顏色。解決辦法是將圖像繪制到浮點(diǎn)緩存中,再把浮點(diǎn)緩存綁定到紋理,再通過(guò)片元程序把紋理繪制到普通幀緩存中。每次繪制切片需要采用圖形流水線中的混合操作,把顏色累計(jì)到浮點(diǎn)緩存中。采用Pbuffer 實(shí)現(xiàn)浮點(diǎn)緩存。Nvidia Geforce 6800GT 的混合操作運(yùn)算是16 位的浮點(diǎn)運(yùn)算[13],把Pbuffer 配置成浮點(diǎn)緩存,并且每個(gè)顏色分量配置成16 位浮點(diǎn)數(shù),這樣,其計(jì)算精度必然低于光線投射方法。圖2(c)是采用16 位浮點(diǎn)緩存的3D 紋理體繪制結(jié)果,繪制時(shí)間0.093 秒,切片數(shù)155。在這里,圖2(a),圖2(b), 圖2(c)圖像質(zhì)量相當(dāng)。圖2(f)的質(zhì)量低于圖2(e),這說(shuō)明3D 紋理體繪制,即使采用了16 位浮點(diǎn)緩存,其圖像質(zhì)量仍低于GPU 光線投射。
在后面的測(cè)試結(jié)果中,如果沒(méi)有特別聲明,基于切片的3D 紋理繪制采用16 位浮點(diǎn)緩存。
圖3 是Lared-S 密度數(shù)據(jù)(非均勻直線網(wǎng)格)的繪制結(jié)果,數(shù)據(jù)尺寸220×80×80,圖像尺寸512×512,為繪制這個(gè)圖像,調(diào)整了傳輸函數(shù),對(duì)數(shù)據(jù)進(jìn)行多次平移和旋轉(zhuǎn)變換。圖3(a)是CPU光線投射方法的圖像,繪制時(shí)間16.578 秒。光線積分步數(shù)是708。圖3(b)是GPU 光線投射圖像,繪制時(shí)間0.843 秒。圖3(c)是3D 紋理體繪制算法繪制的圖像。繪制這幅圖像,用了1112 個(gè)切片,繪制時(shí)間0.39 秒。前兩幅圖像質(zhì)量相當(dāng),(把圖像放大后可以看出)3D 紋理體繪制圖像質(zhì)量稍差一些。
把均勻網(wǎng)格數(shù)據(jù)Hydrogen 和fish,按照正弦函數(shù)調(diào)整x 方向的網(wǎng)格間隔,得到非均勻直線網(wǎng)格數(shù)據(jù),RectHydrogen,Rectfish。這里用RectHydrogen 和Rectfish 對(duì)算法進(jìn)行測(cè)試。
Rectfish 數(shù)據(jù)尺寸256×256×512,圖像尺寸512×512,圖4(a)采用CPU 光線投射,繪制時(shí)間18.797 秒,最大積分步數(shù)637;圖4(b)采用GPU光線投射方法,繪制時(shí)間1.218 秒;圖4(c)采用3D 紋理體繪制方法,繪制時(shí)間0.671 秒,切片數(shù)758。圖4(b)比圖4(a)稍有差別,因?yàn)樘荻鹊木幋a方法有所不同。圖4(b)與圖4(c)質(zhì)量相當(dāng),但后者繪制速度更快一些。
RectHydrogen 數(shù)據(jù)尺寸128×128×128,圖像尺寸512×512,圖5(a)采用GPU 光線投射方法,繪制時(shí)間1.062 秒;圖5(b)和圖5(c)采用3D紋理體繪制方法,切片數(shù)741,圖5(b)使用的繪制緩沖區(qū)的每個(gè)顏色分量為16 位浮點(diǎn)數(shù),繪制時(shí)間0.593 秒;圖5(c)使用的繪制緩沖區(qū)的每個(gè)顏色分量為8 位整數(shù),繪制時(shí)間0.593 秒。圖5(b)與圖5(a)質(zhì)量相當(dāng),圖5(c)的質(zhì)量較差一些。
圖2 RectGrid 數(shù)據(jù)
圖3 Lared-S 密度數(shù)據(jù)
圖4 Rectfish 數(shù)據(jù)
圖5 RectHydrogen 數(shù)據(jù)
采用GPU 光線投射具有與CPU 方法相似的精度,而繪制速度得到大幅度提高。一般情況下,3D 紋理體繪制比GPU 光線投射快,但GPU 光線投射可以獲得更好的精度。在GPU 光線積分算法中,一旦累積不透明度超過(guò)0.98 即終止光線積分,并且只對(duì)不透明的采樣點(diǎn)計(jì)算光照,這樣整體的計(jì)算量小于3D 紋理繪制的計(jì)算量,但GPU 光線投射繪制的速度卻小于3D 紋理體繪制的速度,這是因?yàn)镚PU 擁有多條片元處理流水線,在GPU 光線投射算法中,各個(gè)片元處理流水線的負(fù)載嚴(yán)重不平衡,而在3D 紋理體繪制中各流水線的負(fù)載基本平衡。這說(shuō)明片元處理流水線之間的負(fù)載平衡對(duì)于GPU 繪制是十分有意義的。
對(duì)于較大規(guī)模的數(shù)據(jù)場(chǎng),繪制大幅面的精確圖像,其速度仍難達(dá)到交互。有兩種方法解決這個(gè)問(wèn)題:一是降低數(shù)據(jù)的分辨率,另一個(gè)是降低圖像的分辨率。對(duì)于后者,可以先繪制到Pbuffer, 然后把它連接到紋理,通過(guò)紋理映射繪制大幅面的圖像。
[1] Marc Levoy. Efficient ray tracing for volume data [J]. ACM Transactions on Graphics, 1990, 9(3): 245-261.
[2] Philippe Lacroute, Marc Levoy. Fast volume rendering using a shear-warp factorization of the viewing transformation [C]//Proceedings of the 21st Annual Conference on Computer Graphics and Interactive Techniques. New York, NY, USA, ACM Press, 1994: 451-458.
[3] Brian Cabral, Nancy Cam, Jim Foran. Accelerated volume rendering and tomographic reconstruction using texture mapping hardware [C]//Proceedings of the 1994 Symposium on Volume Visualization. New York, NY, USA, ACM Press, 1994: 91-98.
[4] Klaus Engel, Martin Kraus, Thomas Ertl. High-quality pre-integrated volume rendering using hardware- accelerated pixel shading [C]//Proceedings of the ACM SIGGRAPH/EUROGRAPHICS Workshop on Graphics Hardware, 2001: 9-16.
[5] 童 欣, 唐澤圣. 基于空間跳躍的三維紋理硬件體繪制算法[J]. 計(jì)算機(jī)學(xué)報(bào), 1998, 21(9): 807-812.
[6] Stegmaier S, Strengert M, Klein T, et al. A simple and flexible volume rendering framework for graphics- hardware-based raycasting[C]//Proceedings of the International Workshop on Volume Graphics ’05. Stony Brook, New York, USA, 2005: 187-195.
[7] Klein T, Strengert M, Stegmaier S, et al. Exploiting frame-to-frame coherence for accelerating high-quality volume raycasting on graphics hardware [C]// Proceedings of IEEE Visualization '05, 2005, IEE, 2005: 223-230.
[8] 儲(chǔ)璟駿, 楊 新, 高 艷. 使用GPU 編程的光線投射體繪制算法[J].計(jì)算機(jī)輔助設(shè)計(jì)與圖形學(xué)學(xué)報(bào), 2007, 19(2): 257-262.
[9] 陳 為, 彭群生, 鮑虎軍. 視點(diǎn)相關(guān)的層次采樣:一種硬件加速體光線投射算法[J]. 軟件學(xué)報(bào), 2006, 17(3): 587-601.
[10] CALLAHAN S P, IKITS M, COMBA J L D, et al. Hardware-assisted visibility sorting for unstructured volume rendering [J]. IEEE Transactions on Visualization and Computer Graphics, 2005, 11(3): 285-295.
[11] NVIDIA. 2007. NVIDIA OpenGL extension specifications[DB/OL]. http://developer.nvidia.com/ object/nvidia_opengl_specs.html
[12] Martin K, Schroeder W, Lorensen B. The visualization toolKit (VTK) [DB/OL]. http://www.vtk.org/2008.
[13] Kilgariff E, Fernando R. The GeForce 6 series GPU architecture [M]. GPU Gems 2, Addison-Wesley, 2005. 471-491.