朱 奭
(常熟理工學院 計算機科學與工程學院,江蘇 常熟 215500)
三維數(shù)據(jù)場的可視化從提出以來經(jīng)歷了20多年的發(fā)展,在科學研究,醫(yī)學,石油勘探等領域得到了廣泛的應用.其技術主要分為面繪制和體繪制兩種.其中面繪制通過將三維數(shù)據(jù)構造中間幾何面,然后用傳統(tǒng)的計算機圖形學技術繪制這些幾何面實現(xiàn);而體繪制是直接由三維數(shù)據(jù)場產(chǎn)生相應的二維圖形,故又稱為直接體繪制技術.后者的優(yōu)勢在于能夠很好的展示物體的全貌以及內部的細節(jié),但是也帶來了龐大的計算量.傳統(tǒng)的基于軟件的方法,由于數(shù)據(jù)及計算量的龐大,很難達到實時繪制的要求.雖然提出了不少的基于軟件的加速技術,比如不透明度提前終止,空體元的跳躍技術,視見變換的優(yōu)化等,但還是受制于硬件的瓶頸,加速效果有限.隨著硬件技術的發(fā)展,體繪制開始尋求硬件加速的方法.隨著圖形硬件處理器GPU的出現(xiàn),GPU獨有的可編程管線技術使得可視化的部分工作可以使用GPU完成,減輕了CPU的負擔,提高了可視化的速度;隨著GLSL,HLSL,CG等高級著色語言的出現(xiàn),進一步提高了GPU的可編程性.基于GPU的體繪制方法得到了更好的發(fā)展.
CUDA編程模型的出現(xiàn),實現(xiàn)了在不需要借助圖形學應用程序編程接口的條件下,通過類C高級語言直接操作GPU的硬件資源,并行處理數(shù)據(jù),大大提高處理速度.目前,國內對CUDA技術的研究處于發(fā)展階段,也提出了基于CUDA的一系列直接體繪制的加速技術.本文通過對實現(xiàn)三維數(shù)據(jù)場可視化的光線投射算法進行優(yōu)化和改進.通過將體數(shù)據(jù)以三維紋理的形式存儲在顯存中,利用CUDA的并行運算能力處理數(shù)據(jù),在圖形處理的幾何階段加速數(shù)據(jù)的處理,實現(xiàn)圖形繪制的加速.
CUDA是一種將GPU作為數(shù)據(jù)并行計算設備的軟硬件體系,其編程模型的核心是Grid,Block,Thread三層結構,以線程網(wǎng)格的形式組織,每個Grid由若干個線程塊(Block)組成,每個Block又由若干個線程(Thread)組成.
光線投射是從圖像的每個像素,沿著固定的方向(通常是視線方向)發(fā)射一條光線,光線穿越整個圖像序列,并在這個過程中,對圖像序列進行采樣獲取顏色信息,同時依據(jù)光線吸收模型將顏色值及不透明度進行累加,直至光線穿越整個圖像序列.將所有像素點的顏色拼接起來,就得到一副完整的可視化圖像.
光線投射算法中每個像素出發(fā),沿著固定方向發(fā)射的光線之間的計算過程是相互獨立的,計算方式是相同的,具有高度的并行性.可以根據(jù)其特點,利用CUDA下的每個Thread完成,整個屏幕看成一個Grid,每個像素看成一個Thread,根據(jù)區(qū)域特點屏幕劃分為若干區(qū)域,每個區(qū)域看成一個Block,由此將光線投射法利用CUDA的三層架構進行實現(xiàn),通過CUDA強大的并行運算能力,提高繪制速度.
算法主要分為兩個組成部分,一個是CPU部分(Host部分);另一個是GPU部分(Device部分).
CPU上的工作主要是讀取三維數(shù)據(jù)文件,并存儲在內存中,OpenGL環(huán)境的初始化,并建立與顯存之間的聯(lián)系.接收GPU返回的最終結果,并進行顯示.
GPU上的工作主要就是進行光線的遍歷及與數(shù)據(jù)場求交,進行顏色及不透明度的累積計算,并將最終累積結果返回內存.
具體的算法步驟如下:
CPU上的算法步驟:
(1)讀取三維數(shù)據(jù)場raw文件為一個個unsigned char陣列,存儲在device memory中.
(2)OpenGL環(huán)境的初始化,建立PBO(OpengGl像素緩存對象),PBO與GPU顯存之間的綁定;設置模型變換矩陣,設置視線方向.
(3)根據(jù)數(shù)據(jù)場大小,計算CUDA所需的Block及Thread的大小.
GPU上的算法流程:
(1)CUDA環(huán)境的初始化,建立CUDA 的3D Array及3D Texture,device memory中的三維數(shù)據(jù)場數(shù)據(jù)讀入3D Array,設置紋理參數(shù),并將3D Textrue和3D Array進行綁定.
(2)設定前置參數(shù),根據(jù)線程索引計算對應的屏幕像素位置,視點坐標.
(3)采用包圍盒法,根據(jù)射線方向,分別求出光線進入數(shù)據(jù)體和離開數(shù)據(jù)體的交點坐標pin、pout及和相機的距離.
(4)由前往后,沿射線方向依次按照預設的采樣間距進行采樣,得到采樣點的顏色和不透明度,按照由前往后的方式進行累加合成.并利用不透明度提前截止,若不透明度值接近1.0,停止計算;否則繼續(xù)采樣下一個點,直到到達離開點為止.
(5)將最終累加的顏色和不透明度值寫入PBO.
至此,GPU上工作完成,CPU再通過OpenGl環(huán)境下的API,直接將PBO中的數(shù)據(jù)在屏幕上顯示.
線程映射是將任一光線與CUDA中的Thread進行綁定,實現(xiàn)光線的并行遍歷,是光線投射法并行化處理的關鍵.利用CUDA的四個內建變量,gridDim,blockDim,blockIdx,threadIdx進行控制.其中前兩個內建變量表示了網(wǎng)格和線程塊的規(guī)模,用來計算線程的起始位置,后兩個內建變量表示線程塊的編號和線程的下標,通過兩者的結合表示并行計算線程單元.通過線程索引來對每一條光線編號,線程索引號index通過公式(1)計算.
Index有x,y兩個分量,為了后面計算的方便,利用公式(2)、(3)將其規(guī)范至區(qū)間[-1,1].
其中imageW與imageH代表視平面的寬度與高度.
為了將成像范圍進行約束,采用單位包圍盒,并對視平面大小及視點位置進行初始化規(guī)劃,如圖1所示.其中視點置于z軸(0,0,4)位置,視平面位于(0,0,2)大小2*2單位.Box為單位包圍盒.
圖1 空間關系圖
光線投射算法流程的最后是圖像合成,通過沿著某一光線計算出該方向上每一點的顏色和不透明度值,并將其累加起來合成圖像.首先進行光線的求交運算,對任意一條光線,利用向量表示法對其進行描述,為其設置兩個最基本的參數(shù),起點坐標(ori?gin)和視線方向(direction),則任意一條光線可以表示為公式(4),其中t表示光線在視線方向上的位移.
光線與包圍盒求交采用G.Scott Owen提出的方法,求出一條光線和包圍盒的兩個交點pin和pout,然后以pin為起始點,以pstep為間距沿著視線方向步進.每前進一步,通過公式(5)計算出光線上的某個采樣點在空間中的坐標.
式中eyeRay.o是光線的起始坐標,eyeRay.d*pin是光線入點的坐標,eyeRay.d*pstep是光線的步進距離.由于該坐標位于包圍盒中,坐標值介于(-1,-1,-1)和(1,1,1)之間,通過轉換,將坐標值轉換至紋理坐標[0,1]范圍內.這樣,根據(jù)點的坐標值,提取相應紋理坐標的紋理值,即為該點的灰度值,然后進行不透明度和色彩的累加.色彩和不透明度的合成采用由前往后的合成方法,利用公式(6)、(7)分別進行顏色及不透明度累積.
其中C為顏色值,α為不透明度值.在合成過程中采用不透明度提前終止,若不透明度已經(jīng)達到1,則其后的體元不進行累積,節(jié)省計算時間.最后將累加的結果直接寫入PBO中,形成圖像,在屏幕上顯示.
對上述算法,在硬件系統(tǒng)為Intel Core2雙核 T5550 CPU,2GB DDRII內存,NVIDIA GeForce 8400M GS,512MB顯存,操作系統(tǒng)Windows XP,開發(fā)環(huán)境VC++6.0和CUDA SDK3.1,OpenGL3.1庫下實現(xiàn)三維數(shù)據(jù)場并行可視化,并與基于GPU的光線投射算法進行比較.采用兩種不同分辨率的數(shù)據(jù)場分別進行測試,數(shù)據(jù)場的具體參數(shù)如下表1所示.
表1 實驗數(shù)據(jù)場基本信息表
圖2為對64*64*64的正方體盒重建的效果,圖2a為利用本文算法重建的效果,圖2b為利用基于GPU的算法重建的效果.從成像效果上看,前者細節(jié)的重建效果更好,并且渲染速度達到了10.1fps,滿足交互性要求.
圖3為對256*256*256的頭部MRI體數(shù)據(jù)進行重建,圖3a為本文算法重建效果,圖3b為基于GPU的算法重新的效果,在成像效果上圖3a對大腦內部器官的細節(jié)表現(xiàn)的更好,渲染速度達到了8.7fps,基本滿足交互性要求.通過對兩個數(shù)據(jù)場采用不同算法進行重建的結果分析,本文算法在重建圖像的細節(jié)效果上更優(yōu),并且重建圖像基本滿足交互性要求(fps)6,即滿足交互性.成像效果的優(yōu)化,主要在于在進行數(shù)據(jù)濾波上采用了歸一化線性濾波;另一方面,在體繪制傳遞函數(shù)上進行了適當?shù)膬?yōu)化處理.
圖2 (a)基于CUDA的正方體盒
圖2 (b)基于GPU的正方體盒重建
表2列出了兩組數(shù)據(jù)場在相同硬件環(huán)境下用不同的算法實現(xiàn)所需的時間及加速比的統(tǒng)計情況.從表中看到,基于CUDA的光線投射算法在繪制時間上有明顯的提高,以正方體盒數(shù)據(jù)為例,基于GPU的算法繪制時間為0.68 s,基于 CUDA的算法繪制時間為0.089 s,其加速比達到了7.64.對于MRI人體頭部數(shù)據(jù)場,加速比有所降低,主要是數(shù)據(jù)場的分辨率提高及數(shù)據(jù)場數(shù)據(jù)量增大后,繪制的時間及計算量增加,不過加速比還是在7左右.從實驗的結果來看,基于GPU算法的加速效果,體現(xiàn)了圖形芯片單指令多數(shù)據(jù)流處理的特點及CUDA架構并行處理的優(yōu)點.在以后的實驗中,要充分利用該優(yōu)勢.
圖3 (a)基于CUDA的MRI人體頭部重建
圖3 (b)基于GPU的MRI人體頭部重建
表2 繪制時間和加速比
本文利用CUDA架構的并行技術及可編程硬件技術,采用光線投射算法進行三維數(shù)據(jù)場可視化的研究.通過與基于GPU的光線投射法在相同環(huán)境下對同一組數(shù)據(jù)場進行測試,從成像的效果,繪制的時間兩個方面進行對比,由于CUDA架構具有并行的特點,在繪制上優(yōu)勢明顯,具有較高的加速比.在成像效果上,本文算法能更好的展示細節(jié).后期工作是如何改進傳遞函數(shù),對感興趣的數(shù)據(jù)突出顯示,以及在交互性上有更好的提高.
[1]張舒,褚艷利.GPU高性能運算之CUDA[M].北京:中國水利出版社,2009.
[2]仇德元.GPGPU編程技術--從GLSL、CUDA到OpenCL[M].北京:機械工業(yè)出版社,2011.
[3]石教英,蔡文立.科學計算可視化算法與系統(tǒng)[M].北京:科學出版社,1996.
[4]唐澤圣.三維數(shù)據(jù)可視化[M].北京:清華大學出版社,1999.
[5]徐賽花,張二華.基于CUDA的三維數(shù)據(jù)并行可視化[J].CT理論與應用研究,2011,20(1):47-54.
[6]SCHERLH,Keck B,Kowarschik M,et al.Fast GPU-based CT reconstruction using the Common Unified Device Architecture(CU?DA)[C]//IEEE Press.Proceeding of Nuclear Science Symposium and Medical Imaging Conference.Washington,DC:IEEE Press,2007:4464-4466.
[7]董現(xiàn)玲,江貴平,張煜.基于CUDA的快速光線投射法[J].北京生物醫(yī)學工程,2010,29(2):125-129.
[8]畢文元,陳志強,張麗,等.基于CUDA的三維重建過程實時可視化方法[J].CT理論與應用研究,2010,19(2):1-8.