前言

  • 体绘制,有时又称作三维重建,它能够通过设置不透明度值来显示提数据内部不同成分的细节。

  • 本篇讲述了一个标准的VTK体绘制渲染流程。其中最重要的两个内容分别是:vtkVolumeMappervtkVolume

    • vtkVolumeMapper机器子类实现了各种体绘制算法:

      • 光线投影法,如:vtkVolumeRayCastMapper、vtkFixedPointVolumeRayCastMapper、vtkGPUVolumeRayCastMapper;
      • 基于纹理绘制算法,如:vtkVolumeRayTestureMapper2D、vtkVolumeRayTestureMapper3D;
    • vtkVolume负责组合体绘制管线,处理包含一个Mapper对象外,还需要vtkVolumeProperty对象来体绘制的颜色映射,如不透明度函数、颜色传输函数、梯度不透明函数以及设置阴影效果等。

vtkVolumeMapper

  • vtkVolumeMapper是所有体绘制Mapper类的虚基类,提供接口函数,并由其子类实现具体功能。

    vtkVolumeRayCastMapper

  • 光线投影法是一种基于图像序列的直接体绘制方法,其基本原理是从投影图像平面的每个像素沿着视线方向发射一条穿过体数据的射线,然后在射线上按照一定的步长进行等距采样,对每个采样点采用插值技术计算其体素值,根据颜色传输函数和不透明度传输函数来获取相应的颜色值和不透明度,最后利用光线吸收模型将颜色值进行累加,直至光线穿过体数据,即可得到当前平面像素的渲染颜色,生成最终显示图像。

    • 优点:能够精确的模拟原始数据;
    • 缺点:计算量大,对计算机硬件要求较高。
  • vtkVolumeRayCastMapper类中有两个中最要的函数:

    • SetInput(vtkImageData*):用于设置输入图像数据;
    • SetVolumeRayCastFunction(vtkVolumeRayCastFunction*):设置光线投射函数。
  • 光线投射函数vtkVolumeRayCastFunction是一个虚基类,它由3个子类:

    1. vtkVolumeRayCastCompositeFunction:通过Alpha合成技术生成每个像素的颜色值。对每个采样点采用插值技术计算其体素值,根据颜色传输函数和不透明度传输函数来获取相应的颜色值和不透明度,最后对所有采样点用Alpha合成方法计算最终的颜色。
      • 另外,该方式还可以设置插值优先分类优先
      • 插值优先设置函数:SetCompositeMethodToInterpolateFirst();
      • 分类优先设置函数:SetCompositeMethodToClassfyFirst();
      • 从显示效果上看,插值优先具有较好的显示效果。
    • vtkVolumeRayCastMIPFunction:最大密度投影函数,主要用于对体数据中搞灰度值的结构进行可视化。当光线穿过体数据时,在光线上进行等距采样。取采样点中属性最大值为该条光线的输出。

    • vtkVolumeRayCastIsosurfaceFunction:等值面绘制函数能够渲染数据中的特定等值面,其中:SetValue(double)函数用于设置等值面的值,在进行体绘制时,所有小于该值的像素不透明度都设置为。

    • 从效果上看,光线投射法体绘制效果最好,最大密度投射法缺乏深度信息,二等值面投射法体绘制可以对体数据的某个等值面进行显示和观察,于面绘制效果类似。

    • 光线投射中,投射光线上的采样步长是一个很重的参数,设置函数:SetSampleDistance(float),步长越小,采样点越多,效果越好。但计算量变大。当数据变化剧烈时,应该减少采样步长以获得更好的效果。

    • 另外,还可以设置图像采样间距,即投射光线的间隔,设置函数:SetImageSampleDistance(float),使用该函数时,必须先关闭自动调节采样距离功能,SetAutoAdjustSampleDistances(int),设置为0关闭功能。

vtkFixedPointVolumeRayCastMapper

  • 该类能够实现基于Aplha合成的体绘制方法和最大密度投影体绘制方法,能够支持任意类型的一元或者独立多元数据。该类使用了空间跳跃技术来加速体绘制渲染过程,而且在内部计算时统一使用了float数据类。
  • vtkFixedPointVolumeRayCastMappervtkVolumeRayCastMapper用法基本相同。

vtkGPUVolumeRayCastMapper

  • 实现了基于GPU加速的光线投射体绘制算法,与vtkVolumeRayCastMapper用法基本相同。

纹理映射体绘制

  • 主要原理是将3维体数据作为纹理载入图像硬件缓存中,利用硬件来实现插值以及图像合成操作,以提高绘制效率。

  • 主要利用硬件的三线性过滤插值能力,通过渲染多个与视线垂直的面片来重建整个三维结构。

  • 二维纹理映射:

    • 在光线投射时,选择与当前视线方向垂直的一组纹理图像,在硬件中进行插值和合成运算以实现体绘制。类vtkVolumeTextureMapper2D可用于实现基于二维纹理映射的体绘制方法。
  • 三维纹理映射:

    • vtkVolumeTextureMapper3D类实现3维纹理映射,当数据传递给vtkVolumeTextureMapper3D后,在内部会进行重采样,以确保图像大小能满足当前纹理空间。

裁剪

  • vtkVolumeMapper提供了两种裁剪技术,分别是CroppingClipping

  • Cropping技术只支持vtkImageData数据的裁剪,该方法在每个坐标轴上定义了两个裁剪面,共6个平面(xmin,xmax,ymin,ymax,zmin,zmax)将3维空间分成27个区域。

  • vtkVolumeMapper中定义了Cropping方法的接口函数:

    • SetCropping():打开Cropping方法;
    • SetCroppingRegionPlanes():设置三个坐标轴6个裁剪面的位置;
    • SetCroppingRegionFlags():设置显示区域标记。
    • 还提供了几个常用的显示区域设置函数,见《VTK图形图像开发进阶》7.2.5节
  • Clipping技术可以由任意方向将图像切开,便于观察内部细节,只需要定义一个vtkPlane类型的裁剪平面对象,然后通过vtkVolumeMapper类的AddClippingPlane()函数将该平面添加至Mapper对象即可。

法向编码

  • vtkImageData的部分体绘制Mapper对象中,可以使用法向编码减少存储量

vtkVolume

  • vtkVolume类似于集合渲染中的vtkActor,用于表示渲染场景中的对象。内部存储了两个重要的对象,分别是vtkAbstractVolumeMapper对象和vtkVolumeProperty对象。相应函数如下:SetMapper(vtkAbstractVolumeMapper*)SetProperty(vtkVolumeProperty*)

不透明传输函数

  • 不透明传输函数是一个分段线性标量映射函数,利用该函数可将光线投射过程中的采样点灰度值映射为不同的不透明度值,以决定最终的颜色值。

    SetScalarOpacity(vtkPiecewiseFunction*);
  • vtkPiecewiseFunction类定义线性分段函数:

    • AddPoint(double x,double y):第一个参数x为自变量,这里是指灰度值,y则指映射值,这里指不透明度;
    • RemovePoint(double x):将自变量值为x的断点删除。
    • RemoveAllPoint(double x):删除所有断点。
  • 利用不透明函数可以有选择的对图像中的对象进行显示,对于部显示的对象只需将其对应的灰度范围的不透明度映射为0即可。

梯度不透明函数

  • 该函数将梯度模值映射为一个不透明度乘子,从而增强过度区域显示效果,同样是使用vtkPiecewiseFunction类实现。
SetGradientOpacity(vtkPiecewiseFunction*);
  • 函数设置类似于不透明传输函数的设置,不过意义不同,详情参见见《VTK图形图像开发进阶》7.3.2节

颜色传输函数

  • 颜色传输函数与不透明传输函数类似,不同之处是颜色传输函数是将一个标量值映射为一个颜色值,VTK中用vtkColorTransferFunction类实现,其函数为:

    AddRGBPoint(double x,double r,double g,double b);
    AddHSVPoint(double x,double h,double s,double v);
  • 其中x代表灰度值,r,g,b和h,s,v代表颜色分量。vtkVolumeProperty中设置颜色传输函数的函数原型如下:

    SetColor(vtkColorTransferFunction*);

    光照与阴影

  • 通过vtkVolumeProperty可以设置体绘制的阴影效果,阴影效果主要受环境光系数、散射光系数、反射光系数和高光强度4个参数影响。

    SetDiffuse()  //设置散射光系数
    SetAmbient() //设置环境光系数
    SetSpecular() //设置反射光系数
  • 一般情况下,着三个系数之和为1.

  • 高光强度系数用于控制体绘制外观平滑程度,使用SetSpecularPower()函数设置。

  • vtkVolumeProperty中默认是关闭阴影效果,因此需要显示调用ShadeOn()函数来打开阴影效果。

vtkLODProp3D

  • 对一个大数据来讲,体绘制是一个计算量非常庞大、非常耗时的操作,为了提高绘制速度,引入vtkLODProp3D来解决这个问题。
  • vtkLODProp3D在渲染过程中,会为每个Mapper估计一个渲染时间,并选择一个最优的实现渲染。用法与vtkVolume类似。

不规则网格数据体绘制

  • 不规则网格的体绘制渲染流程与规则网格绘制的流程一致,不同的是需要选择应用于不规则网格数据的Mapper对象。所有支持不规则网格体绘制的Mapper类都继承自vtkUnstructuredGridVolumeMapper
    • vtkUnstructureGridVolumeRayCastMapper实现了基于软件实现的不规则网格光线投射算法,该Mapper仅支持4面体数据,非4面体数据需要借助Filter转换一下。该方法需要较大的内存,不适合大数据渲染处理
    • vtkUnstructureGridVolumeRayZSweepMapper实现了一种在任何平台下运行的体绘制方法,是不规则网格数据体绘制方法中最慢的一种,内存需求较小,可以用来渲染大数据
    • vtkProjectTetrahedraMapper实现了经典的投影四面体法。
    • vtkHAVSVolumeMapper实现了HAVS算法,能够快速渲染大数据,但由于该类中使用了较多显卡的高级技术,因此只有在支持这些技术的显卡中才能运行该方法。
  • 对比4种类的渲染效果,其中ZSweep方法渲染速度最慢,而投影四面体方法较其他两种方法快,但ZSweep方法渲染结果最精确。

更多内容参见《VTK 图形图像开发进阶》。该书得下载地址如下:

链接:https://pan.baidu.com/s/1hG9js6eZkTqL6Fh-b_C-Dg
提取码:cod8

推荐阅读: