基于三维纹理的体绘制算法

 

原文出处:unknown

             转贴 http://hi.baidu.com/hnulilei/blog/item/718da723078196599822edcf.html

 

简要介绍了体绘制的发展现状,基于三维纹理的体绘制方法,及其自己这几天实现方面的感受和总结。

 


      搞了几天,终于搞定了基于三维纹理(3D Texture)的体绘制(Volume Rendering)方法。图形学实在是在我智商所能及之范围之上。谨以此文纪念之。

      之所以要做一些体绘制方面的工作,当然最直接的目的是为了项目。然而项目带动了兴趣,进而充实了时间。 作为国家自然科学基金的项目,让我一个人主要承担实际的工作,实在是勉为其难。 当然是能完成多少就多少的事了。

1、图形学的两大方向

      在此首先要说明一下图形学的两大方向:基于面元(surface)的图形学、基于体(volume)的图形学。

      面元图形学主要是基于面片的方式构造、显示几何体,可以是三角面片、四边形面片。。。,但归根结底都是三角形(图形硬件只支持三角面片)。简单的例子,如 正方体有6个面,那么这个正方体的模型就可以通过这6个面来表示,复杂一点的如一个建筑体,可能有很多墙、门组成,其实每堵墙简单的说就是一个长方体,门 也一样。几何体(模型)的构造有些是手工进行的,如使用3Dmax,creator等建模工具,可以方便地建立各种模型;也有从数据体中直接提取几何体表 面的算法,如march cube等算法。OpenGL实际上是基于面元图形学的工业标准的图形库。

      基于面元的算法由于直接的图形硬件的支持,所以效率较高,能达到实时的要求,并且能支持较大场景的交互式可视化(普通的PC,基本上几十万个三角面片没有 问题)。凡事都是一分为二的,这种方法在某些场合下不能满足要求,例如绘制云、地下地层等。这些模型并不是简单的面就能表现,因为他们的结构极其复杂又无 规律;而且面元的方法,无法对模型内部结构进行透视。

       体元图形学中的主要概念是体素(Voxel)。一个体素对应于模型中某个位置的一种属性(温度、物质组成等)。

 

2、体绘制算法

      课题的目标是完成一个三维地质模型交互式软件平台,其中较前沿的方向就是地质模型的三维可视化。可视化的算法和技术有很多种,各有优点和适用领域。作为地质模型可视化的平台,如何清晰地显示地下地层的复杂结构是十分重要的任务。我们采用体绘制的技术。

      对体绘制算法研究,是当前图形学领域的热点,目前已经从单机的方式发展到了网络模式,分布式体绘制、远程体视化均有众多研究人员在深入研究。目前体绘制算 法主要有:(1)基于纹理的算法;(2)光线投射(ray casting)算法;(3)splating算法;(4)shear-warp算法;(5)傅立叶频域变换算法。

      其中基于纹理的方法包括二维纹理和三维纹理的算法。

      二维纹理的方法相对简单,它和shear-warp算法的思想类似,不过由于硬件的直接支持,速度快。 对于一个体,可以分别从x,y,z三个方向依次浏览模型体的各个剖面,剖面是对模型体的并且垂直于坐标轴的截面。二维纹理的方法,将X方向所有剖面依次保 存到二维纹理内存中,然后将所有纹理以混合(blend)的方式进行绘制,这样看上去就象是一个三维体了。这种算法首先初始化三套纹理,分别是X、Y、Z 三个方向的所有剖面集合。之所以需要三个方向的剖面集合,是因为假如只有X方向的剖面,则从X方向观察模型时,效果较好,但从Y方向观察模型时会出现断裂 现象。所以在对模型进行旋转观察时,需要根据观察的视线方向,动态的决定绘制哪个方向的纹理序列,以视线和三个方向最小夹角为原则进行选择。

      二维纹理的算法适用性好,因为几乎所有的图形卡都支持二维纹理;速度较快,达到实时交互的要求。但是二维纹理的缺点是:(1) 需要3倍于模型体的纹理内存。(2)沿坐标轴方向的纹理序列显示模型体,视觉效果不是非常好,因为它只进行双线性插值。

       三维纹理的体绘制算法则利用了图形卡的三维纹理功能。三维纹理是体纹理,直接地讲,就是一个三维数组空间。首先将体数据进行预处理后装入三维纹理内存中, 然后计算观察的视线方向,取的与视线方向垂直的平面,依次截取模型体,得到一系列相交多边形(需要较复杂的数学知识)。将三维纹理映射到这些多边形上,从 后往前进行混合。

      这种方法利用了图形卡直接支持的三线性插值功能,并且相交多边形始终是垂直于视线方向的,所以视觉效果比二维纹理好。而且不需要多余的存储空间。

       其他几种体绘制算法暂时不进行介绍。

 

3、三维纹理体绘制算法实现

     利用三维纹理进行体绘制,首先需要硬件支持三维纹理功能。目前,普通的图形卡一般都有三维纹理功能。但是在Windows下面由于最新的OpenGL版本 是V1.1版本的,所以尚未支持三维纹理功能(微软的战略),还好,OpenGL规范允许进行扩展。我找到了一个intel的OpenGL扩展库,在 VC++6.0 上面可以使用。扩展的思想可以参考网上众多的资料。

你可能感兴趣的:(工作,算法,扩展,Blend,图形,casting)