基于GPU图像直接体绘制算法分析与评价

2009-9-15 作者: 费耀平 胡慧君 陈松乔 李敏 来源: 万方数据

关键字: 图形处理器 体绘制 纹理映射 光线投射 

年来计算机图形硬件性能不断提高,利用硬件来实现体绘制过程中的某些环节以获取交互的绘制速率成为可能,是目前体绘制的研究热点。描述了基于GPU的光线投射法、2D纹理映射法和3D纹理映射法等典型算法,给出了各类算法的分析与性能评价,最后实现相关算法并得出实验结果。

  引言

  体绘制是三维数据场可视化中的一种重要方法,研究最多的直接体绘制技术既可以显示大范围复杂的整个场结构,又可以清晰地显示内部结构。最有代表性的是光线投射算法拉J,它是通过把单个体数据模拟成一个粒子,赋予其光的吸收和散射属性,再通过计算光穿过整个体数据时辐射能量的累积值来进行绘制。

  近年来随着硬件技术的发展,新一代的图形处理器提供了可编程能力。基于图形硬件的体绘制算法成为主流。人们利用现有的硬件环境,根据各种应用的具体需求,在生成的图像质量与绘制速度之间寻求可能的最佳方案,使绘制速度尽量满足用户的要求,同时保证一定的图像质量,形成了许多不同的体绘制算法及相应的加速算法。世界上惟一的图形学硬件会议(sIGGRAPⅣEuRPGRAPHIcs)连续几年关注的重点都是GPU的应用。也有人提出,GPU将变成通用处理器(general processing unit)。

  1、GPU技术介绍

  GPU最激动人心的进步就是引入了可编程能力。当今的图形处理器真正的可编程能力是用户所写的微程序被载入显卡内存中,并能直接在几何与光栅化阶段被执行。应用广泛的为面向vertex program和fragment program的高级语言,称为HLSL(hist,level shading language,高级着色语言)。它们提供了额外的抽象层,能够以一种统一的方式快速地获取不同显卡所提供的功能,大大简化了编程。目前较流行的高级着色语言有NVIDIA公司的Cg语言、微软DirectX中的HLSL和OpenGL中的GLSL。

  2、体绘制技术及分析

  体绘制技术已经问世逾十载了,现在仍然是图形和可视化研究的一个活跃领域。直接体绘制在体数据处理及特征信息表现方面具有明显的优势,因而一直得到研究者的重视和广泛研究,提出了很多相关的算法,如光线投射法、溅射法、错切一变形法、频域法等。这些传统纯软件算法一般需要大量的计算,因此绘制速度较慢,难以满足实时性的要求。

  经过多年的努力,人们在硬件上不断寻求算法的改进,取得了一定的进步。首先图形硬件支持了硬件加速的三维纹理,从而出现了三维纹理映射的体绘制技术,已成为目前普遍使用的体绘制技术。之后,图形硬件加速了OpenGL管线,为OpenGL提供了许多扩展功能,可以实现着色、光照等特殊效果,使基于GPU的直接体绘制技术具有可与纯软件算法相媲美的绘制效果。

  2.1 基于纹理硬件体绘制

  根据绘制所采用的代理几何体的不同,基于纹理的体绘制分为基于硬件的3D纹理映射和基于硬件的2D纹理映射。

  图1(a)为基于硬件的3D纹理映射的体绘制,最早是由Cullip等人在1993年提出来的。在这种方式下,体数据存储为单个的3D纹理。绘制时,在纹理空间内定义一系列彼此平行且与视线方向垂直的采样多边形。由于多边形的间隔及其采样密度与原始数据不同,必须通过硬件的三线性插值重采样才能获得一系列平行多边形平面上各采样点的数值。现在的显卡一般都支持纹理的三线性插值,故这种绘制方式能对体数据进行三线性插值。体绘制时,使用alpha blending可以实现体绘制的半透明效果。

  图1(b)为基于2D纹理映射的体绘制。该模式下,体数据的采样主轴为其自身网格数据的三个轴方向之一。按采样主轴方向进行采样,得到一系列大小相同、相互平行的矩形,然后将这些面片按视线方向由后往前绘制。随着视线方向的改变,采样的主轴方向也应相应调整,使得视线和采样主轴方向尽可能小。这种绘制方法一般需要按三个主轴方向各存储一套数据,因而使用内存较多。2D纹理硬件体绘制一般只能采用双线性插值,这些对绘制效果都有一定影响。

  所有的代理几何体使用的都是平面切片,这使得透视投影方式下,相邻像素间的采样距离不同而引起失真。不透明度的矫正能减少一些失真,但进行大范围的观察时,这种失真还是可见的。为得到高质量的图像,人们提出用一系列的同心球组成球壳集代替平面切片集¨“。这样在透视投影下,所有像素采样距离均为常数。球壳作为代理几何体只在透视投影时用到且设置的时候比平面切片复杂,因此,大部分情况下还是采用平面代理几何体。

  2.2 基于GPU的光线投射法(GPU-based ray casting)

  传统的光线投射法是一种纯软件的算法,运算速度较慢。尽管人们提出了多种加速方法,如射线提前终止法、空间跳跃法、模板法、使用各种数据结构(BSP算法、Octree算法、Kd—tree算法)进行优化,还是难以满足实时性的要求。随着GPU的出现,Kruger等人基于Pixel Shader 2.0模型提出了基于GPU的多通道光线投射算法。此后Stesmaier等人又利用硬件支持条件循环语句的特性首先实现了GPU编程的单通道光线投射算法。

  GPU上的光线投射算法实现的关键是能够利用GPU完成对体数据的遍历、采样和计算,将得到的采样值进行混合,以产生最终的重建结果。光线相关的数据以纹素与像素的一对一映射方式组织到2D纹理或者通过片段程序实时计算得到。这些数据需要随着光线的步进而不断更新,可以采取pingpong技术实现。光线的建立与终止有两种方法:a)程序性的光线/包围盒的交。通过相机与体进入点位置给定光线方向,这种方法简单易实现,但大部分操作要在片段程序中执行,容易造成瓶颈。b)光栅化体包围盒。光栅化包围盒的前面与后面,光线的起始点为前侧面,方向为后面与前面的差值,这种方法与投影方式无关。为了达到更好更快的交互性,文献进一步提出并实现了利用GPU加速光线投射的算法。

  1)自适应采样

  典型的体数据集具有相同属性的数据较集中分布的特点。对于大部分是属于同一组织或完全是空体素的区域,不需要高的采样率甚至不需要采样;而对于两个组织边界处的细节区域,则需要高密度的采样。

  自适应采样依靠一个可控制空间变量采样率的数据结构。它描述了最大的等方性的采样距离,通过用户定义的误差范围与标量数据集的局部变量计算得到。自适应采样在GPU中的实现方式为:光线跳跃阶段,在当前位置增加对存储这种数据结构的体进行3D纹理查找,将产生的空间变量的步长代替原始的固定的采样距离计算下一个采样点。

  由于自适应采样法对结果图像的质量有影响,为保证图像质量可采用预积分(pre-integration)法。这种方法是为了解决先分类和后分类方法所绘制的图像中产生环状失真(ring artifact)的问题。Engel等人在2001年提出并实现了预积分体绘制算法。它是对相邻两个采样平面构成的块(slab)进行绘制。然而,预积分操作需要大量的运算,并且当传递函数发生改变时,要重新计算预积分表,这严重影响了实时显示速度。Roettger等人于2002年利用Radeon8500显示芯片和piIlgpong过滤方法实现数值积分运算,这不仅大大减少了分类更新所需耗费的时间,而且因使用高精度的片元渲染器,获得了较高的精确度。同年,Guthe等人也提出了基于硬件加速的预积分方法,利用图形硬件对单个3D纹理切片上所有透明度值和颜色值进行并行计算,以交互的速率实现光线段数值积分计算。但是,帧缓存有限的位分辨率通常会造成量化失真现象(quantization mifacts)。为此,2003年,Rottger等人¨纠应用最新的GeForceFX显卡所提供的浮点运算能力。消除量化失真现象,进一步提高了基于硬件加速的预积分算法精度。

  2)空区域的跳跃法

  空区域指由传输函数映射得到的不透明度为0的样本点。对于图像空间的跳跃可采用检查每个样本点的不透明度来判别,这样做代价太大。更好的办法是将数据组织成层次结构来标志空区域,如八叉树层次结构中的节点用来存储标量域中最大与最小值。而对于物体空间的跳跃,可光栅化体的最小包围盒,减少不必要的光线;然后存储体块的最大/最小值,根据等值面的值与转换函数剔除无关的块。此方法对于包含大量不透明区域的体数据集非常有用。Kruger等人ll列将八叉树减少为单层的分辨率——标量数据集大小的(1/8)3,这个改进的八叉树由3D纹理描述。其实现方式为,将从八又树中得到的最小/最大值作为空区域表依赖纹理查找的参数,通过设置深度缓冲的Z为最大值来跳过空区域。只要找到了一个非空节点,Z值就设为0,然后进行光线段的积分。步长将根据八叉树结构的大小而增加。由于步长的增大,跳跃的迭代次数减少,达到了加速的目的。

  2.3基于GPU的频域体绘制

  Viola等人心u于2004年实现了硬件的频域体绘制。绘制过程中,转换到频率域的三维变换在预处理阶段完成,渲染操作则完全在GPU中进行。首先提取出投影切片;然后采用四种不同的插值方法来重采样由三维纹理所描述的体数据;最后提取出切片并把该切片运用反傅里叶变换重新变换到空域中而得到重建图像。通过Shader编程在GPU中实现渲染阶段,达到高的帧率,从而满足实时性要求。




责任编辑:熊东旭