基于GPU的工业CT数据场三维纹理映射体绘制算法★
2011-03-16胡剑王明泉侯慧玲郭永亮李士林
胡剑,王明泉 ,侯慧玲 ,郭永亮 ,李士林
(中北大学仪器科学与动态测试教育部重点实验室,太原 030051)
0 引言
工业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高速浮点计算能力,加快图像的绘制速度。
1 传统三维纹理映射技术及分析
三维纹理算法[9]的主要思想就是将体数据保存在一个三维纹理中,通过渲染许多个面片来重建整个三维结构,每个面片上的颜色由三维纹理即体数据的颜色和透明度来决定。在最后的图像合成阶段,这些面片按照从后向前的顺序合成到图像平面上,产生有半透明效果的三维视图。图1为三维纹理的纹理叠加。
基于纹理的体绘制方法是一个以物体空间为序的绘制过程。利用一系列切片对体数据包围盒进行切割,产生一系列几何体(如三角形、四边形等),然后对几何体进行纹理映射,并将渲染后的几何体按照从后向前或从前向后的顺序进行混合,得到最终绘制图像。由于原始三维体数据中实际并不包含任何几何体,只是为了绘制的需要而生成的,因此称之为代理几何体。几何体是图形硬件操作的基本单元,而且最终绘制的图像也是硬件对几何体进行光栅化及相应处理的结果。光栅化阶段通过对几何体各顶点的纹理坐标进行插值,为每个片段计算纹理坐标,用于提取相应纹素值,实现对体数据执行重采样的目的。因此,在基于纹理的体绘制方法中,生成代理几何体并计算其顶点的纹理坐标即是确定对体数据的重采样位置,纹理映射也即是对体数据执行重采样的过程。三维纹理映射算法是体绘制技术的主流和成熟的算法。近几年随着计算机硬件的发展,人们逐渐将GPU用在该算法的加速上。文献[10]为三维纹理映射算法添加了明暗效果; 文献[11]利用OpenGL及其扩展实现了分类以及着色效果。 而文献[12]利用图形芯片提供的多纹理,以及寄存器混合器功能,来为物体进行着色。GPU出现后,不断为三维纹理算法提供了更多的改进方法。 文献[13]全面讨论了各种基于GPU的三维纹理加速算法。
2 基于GPU的三维纹理映射算法
基于GPU的三维纹理映射算法把原先由CPU承担的计算任务转入GPU中进行,从固定管线转移到可编程管线,可以方便地调整颜色、亮度等。而且传统在固定管线中的算法,实现光照比较困难,利用可编程管线则可轻易实现。这样可以充分利用GPU高速的浮点计算能力。使用GPU的三维纹理映射算法主要由体数据的分类、设置,三维纹理设置,顶点程序和片段程序的编写等步骤组成。图2是算法实现的流程图。
图2 三维纹理映射算法绘制流程
2.1 体数据分类
在进行绘制之前需将体数据载入到显存中,因为只有确定对体数据的分类方法后,才能确定将体数据以何种形式映射到显存中。本文采取对体数据进行插值前分类。体数据在分类时,需要与事先计算的梯度矢量共同构成一个RGBA四分量纹理。梯度的计算使用中心差分公式:
规范化梯度矢量的每个分量取值范围是[-1,l],而纹素的RGB颜色值通常被限制在范围[0,1],因此在将梯度矢量存储到纹理的RGB分量时需对其进行范围压缩,使之符合颜色值范围的要求。梯度值作为法向量,用于光照计算。
2.2 三维纹理设置
在基于GPU 的着色程序中,三维纹理通过三维纹理坐标进行访问。在纹理设置时,参数为:glTexImage3DEXT(GL_TEXTURE_3D_EXT, 0, GL_ RGBA8,256,256,256,0,GL_RGBA,GL_ UNSIGNED_ BYTE,pData);这样就完成了数据值保存进纹理的操作。图3所示为三线性插值和混合操作。这些操作都在GPU中实现。
图3 使用OpenGL接口进行三维纹理设置
2.3 顶点程序
当顶点程序启用时,原先由固定管线实现的功能将不再有效。如纹理坐标变换、纹理坐标生成、顶点光照计算等。这些功能转由用户自定义的可编程管线实现。
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)由于在片段程序中需要使用原始坐标进行光照计算,因此将原始坐标也作为输出。
2.4 片段程序
顶点程序输出的顶点流经图元装配和光栅化处理后产生片段流,再由片段程序对各片段进行纹理映射和光照处理,计算各片段的输出颜色值。同样地,当启用片段程序时,固定管线上的一部分功能也将失效,功能的实现需要使用者编程实现。
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); 所有面片经过混合后,就得到了最终的绘制图像。
3 实验及分析
本文实验所使用的硬件环境为: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实现算法中,因为该算法充分地利用了图形硬件的加速功能,绘制速度比较快。
4 结论
传统三维纹理映射算法使用面绘制为基础的固定管线,因此难以实现体数据的光照计算,而本算法通过把原先在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.