基于三维纹理的体绘制算法
来源:互联网 发布:脂老虎 知乎 编辑:程序博客网 时间:2024/04/28 18:12
原文出处: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 上面可以使用。扩展的思想可以参考网上众多的资料。
- 基于三维纹理的体绘制算法
- 基于三维纹理的体绘制算法【转】
- 基于纹理的体绘制技术[译]
- 基于matlab的三维柱状图绘制
- 基于纹理绘制的战争迷雾
- [OpenGL] 基于纹理绘制的透明精灵(透明纹理)
- 使用可编程图形硬件加速的纹理体绘制算法
- VTK修炼之道64:纹理映射体绘制_三维纹理映射
- 基于纹理的图像检索算法研究
- 三维金字塔的绘制
- 将一个不含有纹理坐标信息的三维模型通过某种算法实现程序化生成纹理坐标
- MATLAB 三维图形的绘制
- matlab 三维图像的绘制
- 三维人脸模型的纹理贴图
- 三维人脸模型的纹理贴图
- 三维纹理的绑定和应用
- OpenGL中三维纹理对象的使用
- 2、室内定位-基于RSSI测距的三维算法
- mysql数据库需要注意group by
- WINDOWS SERVER 2003、IIS6、ASP.NET2.0,用微软的UrlRewriter组件重写URL
- 常见Java开源JMS消息中间件及特性简介
- Linux内核能够识别的设备,对应源码中
- 如何获取webbrowser的cookie
- 基于三维纹理的体绘制算法
- 为应用程序写日志
- 计算机学科国际会议排名
- QSqlQuery
- 这样的xml解析性能指标是否还有进一步提升的能力?
- SRM 212 div2
- dxfhg
- 基于ASP.NET 2.0 的WEB打印方法
- vs2008 asp.net中控件拖拽