胡劍,王明泉 ,侯慧玲 ,郭永亮 ,李士林
(中北大學(xué)儀器科學(xué)與動(dòng)態(tài)測試教育部重點(diǎn)實(shí)驗(yàn)室,太原 030051)
工業(yè)CT斷層圖像的三維可視化技術(shù)研究的目的是通過圖形圖像技術(shù)將檢測數(shù)據(jù)直觀顯示出來,完成對工件中裂紋、氣孔和夾雜等缺陷的檢查和空間定位,以及對工件厚度和密度的參數(shù)測量和各部件裝配間隙的測量。學(xué)術(shù)界把科學(xué)計(jì)算數(shù)據(jù),且包括工程數(shù)據(jù)和測量數(shù)據(jù)的這類空間數(shù)據(jù)的可視化稱為體視化[1](Volume Visualization)技術(shù)。
對于三維結(jié)構(gòu)化數(shù)據(jù)場,其可視化成像方法分為面繪制(Surface Rendering)和體繪制(Direct Volume Rendering)兩大類。其中面繪制運(yùn)用分類操作將數(shù)據(jù)場中感興趣的部分提取出來并以等值面的方式顯示。面繪制對數(shù)據(jù)分割要求高,且體數(shù)據(jù)的內(nèi)部物理屬性無法保留。對精細(xì)結(jié)構(gòu)的三維顯示效果差。為克服上述缺陷,引入了體繪制方法[2]。體繪制不產(chǎn)生中間幾何圖元,直接將三維體數(shù)據(jù)映射成二維圖像展示體細(xì)節(jié),又被稱為直接體繪制。常用的體繪制算法有光線投射法[3],足跡表法、錯(cuò)切變形法以及基于紋理的體繪制算法[4-6]?;诩y理的體繪制方法是利用圖形硬件的紋理映射和像素融合功能,以三維幾何體為基本單元完成繪制過程,具有較高的繪制效率,適合ICT產(chǎn)生的結(jié)構(gòu)型數(shù)據(jù)。但傳統(tǒng)算法中,需要對每一個(gè)體素進(jìn)行操作,其計(jì)算復(fù)雜度大,繪 速度較慢,計(jì)算量都耗費(fèi)在體數(shù)據(jù)集上插值位置的計(jì)算,很難達(dá)到實(shí)時(shí)交互的要求,限制了該算法的應(yīng)用。
隨著圖形硬件技術(shù)的發(fā)展.可編程圖形管線概念的提出,可以利用硬件自帶的三線性插值功能將復(fù)雜的計(jì)算轉(zhuǎn)移到GPU(graphics processing unit)上進(jìn)行。GPU可編程能力的引入使得用戶可以自己編寫程序并載入圖形卡的內(nèi)存中,直接在幾何與光柵化階段被執(zhí)行??删幊虉D形管線較傳統(tǒng)固定管線的區(qū)別在于使用了可編程頂點(diǎn)處理器和可編程片段處理器,分別對頂點(diǎn)數(shù)據(jù)流和片段數(shù)據(jù)流進(jìn)行處理。相對應(yīng)產(chǎn)生頂點(diǎn)程序和片段程序。編寫這些程序所使用的高級語言,稱為HLSL(high level shading language,高級著色語言)。
基于GPU的加速技術(shù)首先由Cullip和Neumann在文獻(xiàn)[7]中提出,在 SGI RealityEngine Onyx 上成功地對體繪制實(shí)現(xiàn)了加速,并進(jìn)一步發(fā)展了利用紋理映射加速完成插值運(yùn)算的思想,為后來濾波反投影法的加速重建打下了基礎(chǔ)。Cabral等人也在 SGI RealityEngine Onyx上成功實(shí)現(xiàn)了體繪制及斷層重建的加速。他們在文獻(xiàn)[8]中論證了交互式體數(shù)據(jù)重建和體繪制算法通過硬件提供的3D紋理實(shí)現(xiàn)加速的可行性。J.Kruger等人基于Pixel Shader2.0模型提出了基于GPU的多通道光線投射算法。此后Stesmaier等人又利用硬件支持條件循環(huán)語句的特性首先實(shí)現(xiàn)了GPU編程的單通道光線投射算法。
本文通過改進(jìn)的基于GPU的三維紋理映射體繪制算法,編寫GPU頂點(diǎn)程序計(jì)算紋理坐標(biāo),編寫GPU片段程序執(zhí)行體數(shù)據(jù)采樣、分類、光照計(jì)算等,把主要的計(jì)算量,如三線性插值、光柵化、紋理映射和混合操作等從CPU遷移到GPU,從固定管線轉(zhuǎn)移到可編程管線,這樣可以更加方便地調(diào)整可視化參數(shù),充分利用了GPU高速浮點(diǎn)計(jì)算能力,加快圖像的繪制速度。
三維紋理算法[9]的主要思想就是將體數(shù)據(jù)保存在一個(gè)三維紋理中,通過渲染許多個(gè)面片來重建整個(gè)三維結(jié)構(gòu),每個(gè)面片上的顏色由三維紋理即體數(shù)據(jù)的顏色和透明度來決定。在最后的圖像合成階段,這些面片按照從后向前的順序合成到圖像平面上,產(chǎn)生有半透明效果的三維視圖。圖1為三維紋理的紋理疊加。
基于紋理的體繪制方法是一個(gè)以物體空間為序的繪制過程。利用一系列切片對體數(shù)據(jù)包圍盒進(jìn)行切割,產(chǎn)生一系列幾何體(如三角形、四邊形等),然后對幾何體進(jìn)行紋理映射,并將渲染后的幾何體按照從后向前或從前向后的順序進(jìn)行混合,得到最終繪制圖像。由于原始三維體數(shù)據(jù)中實(shí)際并不包含任何幾何體,只是為了繪制的需要而生成的,因此稱之為代理幾何體。幾何體是圖形硬件操作的基本單元,而且最終繪制的圖像也是硬件對幾何體進(jìn)行光柵化及相應(yīng)處理的結(jié)果。光柵化階段通過對幾何體各頂點(diǎn)的紋理坐標(biāo)進(jìn)行插值,為每個(gè)片段計(jì)算紋理坐標(biāo),用于提取相應(yīng)紋素值,實(shí)現(xiàn)對體數(shù)據(jù)執(zhí)行重采樣的目的。因此,在基于紋理的體繪制方法中,生成代理幾何體并計(jì)算其頂點(diǎn)的紋理坐標(biāo)即是確定對體數(shù)據(jù)的重采樣位置,紋理映射也即是對體數(shù)據(jù)執(zhí)行重采樣的過程。三維紋理映射算法是體繪制技術(shù)的主流和成熟的算法。近幾年隨著計(jì)算機(jī)硬件的發(fā)展,人們逐漸將GPU用在該算法的加速上。文獻(xiàn)[10]為三維紋理映射算法添加了明暗效果; 文獻(xiàn)[11]利用OpenGL及其擴(kuò)展實(shí)現(xiàn)了分類以及著色效果。 而文獻(xiàn)[12]利用圖形芯片提供的多紋理,以及寄存器混合器功能,來為物體進(jìn)行著色。GPU出現(xiàn)后,不斷為三維紋理算法提供了更多的改進(jìn)方法。 文獻(xiàn)[13]全面討論了各種基于GPU的三維紋理加速算法。
基于GPU的三維紋理映射算法把原先由CPU承擔(dān)的計(jì)算任務(wù)轉(zhuǎn)入GPU中進(jìn)行,從固定管線轉(zhuǎn)移到可編程管線,可以方便地調(diào)整顏色、亮度等。而且傳統(tǒng)在固定管線中的算法,實(shí)現(xiàn)光照比較困難,利用可編程管線則可輕易實(shí)現(xiàn)。這樣可以充分利用GPU高速的浮點(diǎn)計(jì)算能力。使用GPU的三維紋理映射算法主要由體數(shù)據(jù)的分類、設(shè)置,三維紋理設(shè)置,頂點(diǎn)程序和片段程序的編寫等步驟組成。圖2是算法實(shí)現(xiàn)的流程圖。
圖2 三維紋理映射算法繪制流程
在進(jìn)行繪制之前需將體數(shù)據(jù)載入到顯存中,因?yàn)橹挥写_定對體數(shù)據(jù)的分類方法后,才能確定將體數(shù)據(jù)以何種形式映射到顯存中。本文采取對體數(shù)據(jù)進(jìn)行插值前分類。體數(shù)據(jù)在分類時(shí),需要與事先計(jì)算的梯度矢量共同構(gòu)成一個(gè)RGBA四分量紋理。梯度的計(jì)算使用中心差分公式:
規(guī)范化梯度矢量的每個(gè)分量取值范圍是[-1,l],而紋素的RGB顏色值通常被限制在范圍[0,1],因此在將梯度矢量存儲到紋理的RGB分量時(shí)需對其進(jìn)行范圍壓縮,使之符合顏色值范圍的要求。梯度值作為法向量,用于光照計(jì)算。
在基于GPU 的著色程序中,三維紋理通過三維紋理坐標(biāo)進(jìn)行訪問。在紋理設(shè)置時(shí),參數(shù)為:glTexImage3DEXT(GL_TEXTURE_3D_EXT, 0, GL_ RGBA8,256,256,256,0,GL_RGBA,GL_ UNSIGNED_ BYTE,pData);這樣就完成了數(shù)據(jù)值保存進(jìn)紋理的操作。圖3所示為三線性插值和混合操作。這些操作都在GPU中實(shí)現(xiàn)。
圖3 使用OpenGL接口進(jìn)行三維紋理設(shè)置
當(dāng)頂點(diǎn)程序啟用時(shí),原先由固定管線實(shí)現(xiàn)的功能將不再有效。如紋理坐標(biāo)變換、紋理坐標(biāo)生成、頂點(diǎn)光照計(jì)算等。這些功能轉(zhuǎn)由用戶自定義的可編程管線實(shí)現(xiàn)。
a)坐標(biāo)變換。在頂點(diǎn)程序中使用的坐標(biāo)變換Cg 代碼為:
oPosition = mul(modelviewproj,position);
其中oPosition為變換后的頂點(diǎn)位置,mul語句則將變換前的頂點(diǎn)位置position與模型、視點(diǎn)以及投影矩陣之積modelviewproj相乘。oPosition將輸出到后續(xù)的片段程序中。
b)紋理坐標(biāo)生成。Cg 代碼為:
oTexcoord = mul(texMatrix,position).xyz;
oTexcoord將作為紋理坐標(biāo)輸出,texMatrix為紋理坐標(biāo)。texMatri以及上述的modelviewproj都是OpenGL中相應(yīng)的變換矩陣。oTexcoord將作為紋理坐標(biāo)集輸出到片段程序中。紋理坐標(biāo)集在光柵化時(shí)將自動(dòng)進(jìn)行三線性插值。
c)由于在片段程序中需要使用原始坐標(biāo)進(jìn)行光照計(jì)算,因此將原始坐標(biāo)也作為輸出。
頂點(diǎn)程序輸出的頂點(diǎn)流經(jīng)圖元裝配和光柵化處理后產(chǎn)生片段流,再由片段程序?qū)Ω髌芜M(jìn)行紋理映射和光照處理,計(jì)算各片段的輸出顏色值。同樣地,當(dāng)啟用片段程序時(shí),固定管線上的一部分功能也將失效,功能的實(shí)現(xiàn)需要使用者編程實(shí)現(xiàn)。
a)獲取紋理。
float4 normal4 = tex3D(volume,texcoord);tex3D為 Cg內(nèi)建的獲取紋理的函數(shù),volume為紋理。在Cg程序中要使用紋理,則在調(diào)用Cg程序的C++程序中需要使用:cgGLSetTextureParameter(cgGetNamedParameter(FragmentPro gram, "volume"),texName[00frames]);以使volume與實(shí)際制定的紋理匹配。
b)獲取法向量。法向量N保存在紋理的r,g,b分量中,取出后必須經(jīng)過放縮回[-1,1]范圍內(nèi)才能使用。最后調(diào)用:N =normalize(N);來使法向量歸一化,normalize函數(shù)為Cg內(nèi)建的專為圖形計(jì)算優(yōu)化的函數(shù)。
c)計(jì)算Phong光照模型。Cg內(nèi)建了對Phong光照模型的支持,只需要調(diào)用以下的函數(shù)就能實(shí)現(xiàn)光照:
float diffuse =dot(N,L);
float specularlight = dot(N,H);
float4 light = lit(diffuse,specularlight,shininess);
在light.y中,鏡面反射光分量保存在light.z中,最后根據(jù)公式:
有:oColor.xyz = Ka + Kd*light.y + Ks*light.z;
其中,L為入射光;N為數(shù)據(jù)點(diǎn)的法向量,即梯度;H為入射光與視法向的半角向量;Ka,Kd和Ks;分別為環(huán)境光系數(shù)、漫反射光系數(shù)和鏡面反射光系數(shù)。oColor是輸出的片段顏色,另外將體數(shù)據(jù)值作為透明度保存在oColor中。
d)混合計(jì)算。最后繪制的任務(wù)交給面片片段混合的混合函數(shù)。在本算法中,使用的混合公式如下:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_ SRC_ALPHA); 所有面片經(jīng)過混合后,就得到了最終的繪制圖像。
本文實(shí)驗(yàn)所使用的硬件環(huán)境為:CPU為Pentium Dual E2200,2.20GHz,2.19GHz,內(nèi)存為1.0GB,GPU為Nvidia Quadro FX 1800;軟件環(huán)境為:Windows XP Sp3下的Visual Studio C++6.0、Cg SDK3.0、OpenGL3.2。
圖4、5所示分別為傳統(tǒng)三維紋理映射算法和基于GPU實(shí)現(xiàn)的三維紋理映射算法的繪制效果。
圖4 傳統(tǒng)三維紋理映射算法繪制的沒有光照效果的引擎
圖5 使用GPU編程三維紋理映射算法的效果
其中圖4為純軟件實(shí)現(xiàn)的沒有加入光照的傳統(tǒng)三維紋理映射算法。當(dāng)只需要灰度圖像、不需要光照計(jì)算時(shí)繪制速度和效果尚可。而試圖在傳統(tǒng)算法中加入Phong光照模型使其具有光照效果時(shí),發(fā)現(xiàn)圖像難以繪制實(shí)現(xiàn),至少在本實(shí)驗(yàn)中的硬件條件下如此。這也證明OpenGL固定管線中的光照模型是針對多邊形繪制而設(shè)計(jì),不能直接拿來利用在直接體繪制技術(shù)上。而在圖5所示的加入光照的GPU實(shí)現(xiàn)算法中,因?yàn)樵撍惴ǔ浞值乩昧藞D形硬件的加速功能,繪制速度比較快。
傳統(tǒng)三維紋理映射算法使用面繪制為基礎(chǔ)的固定管線,因此難以實(shí)現(xiàn)體數(shù)據(jù)的光照計(jì)算,而本算法通過把原先在CPU上進(jìn)行的計(jì)算放入GPU中計(jì)算,便可使用自定義光照算法,彌補(bǔ)原先固定管線中,沒有像素級光照的缺點(diǎn),增強(qiáng)了該算法的局部照明效果,實(shí)現(xiàn)Phong光照模型,提高了繪制的真實(shí)感效果。與傳統(tǒng)的三維紋理映射算法相比,本文算法可快速繪制出質(zhì)量較高的圖像,使工業(yè)CT斷層圖像三維可視化的實(shí)時(shí)繪制成為了可能。
[1] A.Kaufman, Volume visualization. ACM [J]. Computing Surveys, 1996,28(1):165-167.
[2] M.Levoy. Display of surfaces from volume data [J]. IEEE Computer Graphics and Applications, 1988 ,8(3):29-37.
[3] Kajiya .J, von Herzen.B. Ray tracing volume densities [J].Computer Graphics ,1984,18(3):165-174.
[4] Westermann R, Ertl T. Efficiently using graphics hardware in volume rendering applications[C]// Computer Graphics Proceedings.Annual Conference Series, ACM SIGGRAPH, New York, 1998:169-178.
[5] 吳仲樂,王遵亮,羅立民. 基于可編程圖形硬件的直接體繪制方法[J].生物醫(yī)學(xué)工程研究,2003 ,22(3):29-32.
[6] LaMar.E, Hamann.B, Kenneth.I.J, Multiresolution Techniques for Interactive Texture-Based Volume Visualization[C]//In Proeeedings of the10th IEEE visualization. IEEE Computer Society Press,Los Alamitos,1999,355-361.
[7] T.J.Cullip and U.Neumann. Accelerating Volume reconstruction with 3D texture mapping hardware [R]. Technical Report TR93-027, Department of Computer Science, University of North Carolina, Chapel Hill,1993.
[8] Brian Cabral, Nancy Cam, and Jim Foran. Accelerated volume rendering and tomographic reconstruction using texture mapping hardware[C]//In Proceedings of IEEE Symposium on Volume Visualization, New York,1994,91-98.
[9] Wilson O, Van Gelder A, Wilhelms J. Direct volume rendering via 3D textures[R]. Santa Cruz:University of California,UCSC-CRL-94-19, 1994.
[10] Gelder A V, Kim K. Direct Volume Rendering with Shading Via Three-Dimentional Textures. Proceedings[C]//Symposium on Volume Visualization1996, San Francisco, CA, October 1996, 23-30.
[11] Meiner M. Hoffmann U.and Straer W. Enabling classification and shading for 3D texture mapping based volume rendering using OpenGL and extensions[C]// VIS '99 Proceedings of the conference on Visualization '99, IEEE Computer Society Press,Los Alamitos 1999, 207-214.
[12] Rezk-Salama C, Engel K. Bauer M. et al. Interactive volume rendering on standard PC graphics hardware using multi-textures and multi-stage rasterization[C]// Eurographics/SIGGRAPH Workshop on Graphics Hardwar'00, New York , 2000.109-118.
[13] Krueger J, Westermann R. Acceleration Techniques for GPU-based Volume Rendering[C]//In Proceedings of IEEE Conference on Visualization 2003/IEEE Computer Society, Seattle, 2003, 38 45.