胡劍,王明泉 ,侯慧玲 ,郭永亮 ,李士林
(中北大學儀器科學與動態測試教育部重點實驗室,太原 030051)
工業CT斷層圖像的三維可視化技術研究的目的是通過圖形圖像技術將檢測數據直觀顯示出來,完成對工件中裂紋、氣孔和夾雜等缺陷的檢查和空間定位,以及對工件厚度和密度的參數測量和各部件裝配間隙的測量。學術界把科學計算數據,且包括工程數據和測量數據的這類空間數據的可視化稱為體視化[1](Volume Visualization)技術。
對于三維結構化數據場,其可視化成像方法分為面繪制(Surface Rendering)和體繪制(Direct Volume Rendering)兩大類。其中面繪制運用分類操作將數據場中感興趣的部分提取出來并以等值面的方式顯示。面繪制對數據分割要求高,且體數據的內部物理屬性無法保留。對精細結構的三維顯示效果差。為克服上述缺陷,引入了體繪制方法[2]。體繪制不產生中間幾何圖元,直接將三維體數據映射成二維圖像展示體細節,又被稱為直接體繪制。常用的體繪制算法有光線投射法[3],足跡表法、錯切變形法以及基于紋理的體繪制算法[4-6]。基于紋理的體繪制方法是利用圖形硬件的紋理映射和像素融合功能,以三維幾何體為基本單元完成繪制過程,具有較高的繪制效率,適合ICT產生的結構型數據。但傳統算法中,需要對每一個體素進行操作,其計算復雜度大,繪 速度較慢,計算量都耗費在體數據集上插值位置的計算,很難達到實時交互的要求,限制了該算法的應用。
隨著圖形硬件技術的發展.可編程圖形管線概念的提出,可以利用硬件自帶的三線性插值功能將復雜的計算轉移到GPU(graphics processing unit)上進行。GPU可編程能力的引入使得用戶可以自己編寫程序并載入圖形卡的內存中,直接在幾何與光柵化階段被執行。可編程圖形管線較傳統固定管線的區別在于使用了可編程頂點處理器和可編程片段處理器,分別對頂點數據流和片段數據流進行處理。相對應產生頂點程序和片段程序。編寫這些程序所使用的高級語言,稱為HLSL(high level shading language,高級著色語言)。
基于GPU的加速技術首先由Cullip和Neumann在文獻[7]中提出,在 SGI RealityEngine Onyx 上成功地對體繪制實現了加速,并進一步發展了利用紋理映射加速完成插值運算的思想,為后來濾波反投影法的加速重建打下了基礎。Cabral等人也在 SGI RealityEngine Onyx上成功實現了體繪制及斷層重建的加速。他們在文獻[8]中論證了交互式體數據重建和體繪制算法通過硬件提供的3D紋理實現加速的可行性。J.Kruger等人基于Pixel Shader2.0模型提出了基于GPU的多通道光線投射算法。此后Stesmaier等人又利用硬件支持條件循環語句的特性首先實現了GPU編程的單通道光線投射算法。
本文通過改進的基于GPU的三維紋理映射體繪制算法,編寫GPU頂點程序計算紋理坐標,編寫GPU片段程序執行體數據采樣、分類、光照計算等,把主要的計算量,如三線性插值、光柵化、紋理映射和混合操作等從CPU遷移到GPU,從固定管線轉移到可編程管線,這樣可以更加方便地調整可視化參數,充分利用了GPU高速浮點計算能力,加快圖像的繪制速度。
三維紋理算法[9]的主要思想就是將體數據保存在一個三維紋理中,通過渲染許多個面片來重建整個三維結構,每個面片上的顏色由三維紋理即體數據的顏色和透明度來決定。在最后的圖像合成階段,這些面片按照從后向前的順序合成到圖像平面上,產生有半透明效果的三維視圖。圖1為三維紋理的紋理疊加。
基于紋理的體繪制方法是一個以物體空間為序的繪制過程。利用一系列切片對體數據包圍盒進行切割,產生一系列幾何體(如三角形、四邊形等),然后對幾何體進行紋理映射,并將渲染后的幾何體按照從后向前或從前向后的順序進行混合,得到最終繪制圖像。由于原始三維體數據中實際并不包含任何幾何體,只是為了繪制的需要而生成的,因此稱之為代理幾何體。幾何體是圖形硬件操作的基本單元,而且最終繪制的圖像也是硬件對幾何體進行光柵化及相應處理的結果。光柵化階段通過對幾何體各頂點的紋理坐標進行插值,為每個片段計算紋理坐標,用于提取相應紋素值,實現對體數據執行重采樣的目的。因此,在基于紋理的體繪制方法中,生成代理幾何體并計算其頂點的紋理坐標即是確定對體數據的重采樣位置,紋理映射也即是對體數據執行重采樣的過程。三維紋理映射算法是體繪制技術的主流和成熟的算法。近幾年隨著計算機硬件的發展,人們逐漸將GPU用在該算法的加速上。文獻[10]為三維紋理映射算法添加了明暗效果; 文獻[11]利用OpenGL及其擴展實現了分類以及著色效果。 而文獻[12]利用圖形芯片提供的多紋理,以及寄存器混合器功能,來為物體進行著色。GPU出現后,不斷為三維紋理算法提供了更多的改進方法。 文獻[13]全面討論了各種基于GPU的三維紋理加速算法。
基于GPU的三維紋理映射算法把原先由CPU承擔的計算任務轉入GPU中進行,從固定管線轉移到可編程管線,可以方便地調整顏色、亮度等。而且傳統在固定管線中的算法,實現光照比較困難,利用可編程管線則可輕易實現。這樣可以充分利用GPU高速的浮點計算能力。使用GPU的三維紋理映射算法主要由體數據的分類、設置,三維紋理設置,頂點程序和片段程序的編寫等步驟組成。圖2是算法實現的流程圖。

圖2 三維紋理映射算法繪制流程
在進行繪制之前需將體數據載入到顯存中,因為只有確定對體數據的分類方法后,才能確定將體數據以何種形式映射到顯存中。本文采取對體數據進行插值前分類。體數據在分類時,需要與事先計算的梯度矢量共同構成一個RGBA四分量紋理。梯度的計算使用中心差分公式:

規范化梯度矢量的每個分量取值范圍是[-1,l],而紋素的RGB顏色值通常被限制在范圍[0,1],因此在將梯度矢量存儲到紋理的RGB分量時需對其進行范圍壓縮,使之符合顏色值范圍的要求。梯度值作為法向量,用于光照計算。
在基于GPU 的著色程序中,三維紋理通過三維紋理坐標進行訪問。在紋理設置時,參數為:glTexImage3DEXT(GL_TEXTURE_3D_EXT, 0, GL_ RGBA8,256,256,256,0,GL_RGBA,GL_ UNSIGNED_ BYTE,pData);這樣就完成了數據值保存進紋理的操作。圖3所示為三線性插值和混合操作。這些操作都在GPU中實現。

圖3 使用OpenGL接口進行三維紋理設置
當頂點程序啟用時,原先由固定管線實現的功能將不再有效。如紋理坐標變換、紋理坐標生成、頂點光照計算等。這些功能轉由用戶自定義的可編程管線實現。
a)坐標變換。在頂點程序中使用的坐標變換Cg 代碼為:
oPosition = mul(modelviewproj,position);
其中oPosition為變換后的頂點位置,mul語句則將變換前的頂點位置position與模型、視點以及投影矩陣之積modelviewproj相乘。oPosition將輸出到后續的片段程序中。
b)紋理坐標生成。Cg 代碼為:
oTexcoord = mul(texMatrix,position).xyz;
oTexcoord將作為紋理坐標輸出,texMatrix為紋理坐標。texMatri以及上述的modelviewproj都是OpenGL中相應的變換矩陣。oTexcoord將作為紋理坐標集輸出到片段程序中。紋理坐標集在光柵化時將自動進行三線性插值。
c)由于在片段程序中需要使用原始坐標進行光照計算,因此將原始坐標也作為輸出。
頂點程序輸出的頂點流經圖元裝配和光柵化處理后產生片段流,再由片段程序對各片段進行紋理映射和光照處理,計算各片段的輸出顏色值。同樣地,當啟用片段程序時,固定管線上的一部分功能也將失效,功能的實現需要使用者編程實現。
a)獲取紋理。
float4 normal4 = tex3D(volume,texcoord);tex3D為 Cg內建的獲取紋理的函數,volume為紋理。在Cg程序中要使用紋理,則在調用Cg程序的C++程序中需要使用:cgGLSetTextureParameter(cgGetNamedParameter(FragmentPro gram, "volume"),texName[00frames]);以使volume與實際制定的紋理匹配。
b)獲取法向量。法向量N保存在紋理的r,g,b分量中,取出后必須經過放縮回[-1,1]范圍內才能使用。最后調用:N =normalize(N);來使法向量歸一化,normalize函數為Cg內建的專為圖形計算優化的函數。
c)計算Phong光照模型。Cg內建了對Phong光照模型的支持,只需要調用以下的函數就能實現光照:
float diffuse =dot(N,L);
float specularlight = dot(N,H);
float4 light = lit(diffuse,specularlight,shininess);

在light.y中,鏡面反射光分量保存在light.z中,最后根據公式:

有:oColor.xyz = Ka + Kd*light.y + Ks*light.z;
其中,L為入射光;N為數據點的法向量,即梯度;H為入射光與視法向的半角向量;Ka,Kd和Ks;分別為環境光系數、漫反射光系數和鏡面反射光系數。oColor是輸出的片段顏色,另外將體數據值作為透明度保存在oColor中。
d)混合計算。最后繪制的任務交給面片片段混合的混合函數。在本算法中,使用的混合公式如下:
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_ SRC_ALPHA); 所有面片經過混合后,就得到了最終的繪制圖像。
本文實驗所使用的硬件環境為:CPU為Pentium Dual E2200,2.20GHz,2.19GHz,內存為1.0GB,GPU為Nvidia Quadro FX 1800;軟件環境為:Windows XP Sp3下的Visual Studio C++6.0、Cg SDK3.0、OpenGL3.2。
圖4、5所示分別為傳統三維紋理映射算法和基于GPU實現的三維紋理映射算法的繪制效果。

圖4 傳統三維紋理映射算法繪制的沒有光照效果的引擎

圖5 使用GPU編程三維紋理映射算法的效果
其中圖4為純軟件實現的沒有加入光照的傳統三維紋理映射算法。當只需要灰度圖像、不需要光照計算時繪制速度和效果尚可。而試圖在傳統算法中加入Phong光照模型使其具有光照效果時,發現圖像難以繪制實現,至少在本實驗中的硬件條件下如此。這也證明OpenGL固定管線中的光照模型是針對多邊形繪制而設計,不能直接拿來利用在直接體繪制技術上。而在圖5所示的加入光照的GPU實現算法中,因為該算法充分地利用了圖形硬件的加速功能,繪制速度比較快。
傳統三維紋理映射算法使用面繪制為基礎的固定管線,因此難以實現體數據的光照計算,而本算法通過把原先在CPU上進行的計算放入GPU中計算,便可使用自定義光照算法,彌補原先固定管線中,沒有像素級光照的缺點,增強了該算法的局部照明效果,實現Phong光照模型,提高了繪制的真實感效果。與傳統的三維紋理映射算法相比,本文算法可快速繪制出質量較高的圖像,使工業CT斷層圖像三維可視化的實時繪制成為了可能。
[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].生物醫學工程研究,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.