1.纹理映射体绘制

基于软件实现的光线投影体绘制算法计算量非常大,不利于进行实时渲染。因此,目前体绘制经常使用图形硬件利用纹理映射来加速
其主要原理是将三维体数据作为纹理装载入硬件缓存中,利用硬件来实现插值以及图像合成操作,以提高绘制效率。
基于图形硬件三维纹理功能的体绘制技术,主要是利用硬件的三线性过滤插值能力,通过渲染多个与视线垂直的面片来重建整个三维结构。每个面片利用三维纹理来决定颜色和透明度。这种方法得到的效果从本质上讲与光线投影的效果相同。最新的方法可以直接利用三维纹理在图形硬件上实现光线投影的算法。

2.二维纹理映射

早期受到硬件技术的限制,显卡只能支持二维纹理映射。其基本思路是将每个坐标轴方向的切片作为二维纹理保存到图形硬件缓冲中,在光线投影时,选择与当前视线方向垂直的一组纹理图像,在硬件中进行插值和合成运算以实现体绘制。
VTK中的vtkVolumeTextureMapper2D类可用于实现基于二维纹理映射的体绘制方法。
具体代码如下所示:
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h>
#include <vtkStructuredPoints.h>
#include <vtkStructuredPointsReader.h>
#include <vtkVolumeTextureMapper2D.h>
#include <vtkColorTransferFunction.h>
#include <vtkPiecewiseFunction.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkVolumeProperty.h>
#include <vtkVolumeRayCastIsosurfaceFunction.h>int main(int argc, char *argv[])
{vtkSmartPointer<vtkStructuredPointsReader> reader =vtkSmartPointer<vtkStructuredPointsReader>::New();reader->SetFileName("mummy.128.vtk");reader->Update();vtkSmartPointer<vtkVolumeTextureMapper2D> volumeMapper =vtkSmartPointer<vtkVolumeTextureMapper2D>::New();volumeMapper->SetInputData(reader->GetOutput());;/*************************************************************************/vtkSmartPointer<vtkVolumeProperty> volumeProperty =vtkSmartPointer<vtkVolumeProperty>::New();volumeProperty->SetInterpolationTypeToLinear();volumeProperty->ShadeOn();  //打开或者关闭阴影测试volumeProperty->SetAmbient(0.4);volumeProperty->SetDiffuse(0.6);  //漫反射volumeProperty->SetSpecular(0.2); //镜面反射//设置不透明度vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =vtkSmartPointer<vtkPiecewiseFunction>::New();compositeOpacity->AddPoint(70, 0.00);compositeOpacity->AddPoint(90, 0.40);compositeOpacity->AddPoint(180, 0.60);volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数//设置颜色属性vtkSmartPointer<vtkColorTransferFunction> color =vtkSmartPointer<vtkColorTransferFunction>::New();color->AddRGBPoint(0.000, 0.00, 0.00, 0.00);color->AddRGBPoint(64.00, 1.00, 0.52, 0.30);color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);volumeProperty->SetColor(color);/********************************************************************************/vtkSmartPointer<vtkVolume> volume =vtkSmartPointer<vtkVolume>::New();volume->SetMapper(volumeMapper);volume->SetProperty(volumeProperty);vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();ren->SetBackground(0, 1, 0);ren->AddVolume(volume);vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(ren);rw->SetSize(480, 480);rw->Render();rw->SetWindowName("VolumeRendering by Texture2D");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);ren->ResetCamera();rw->Render();rwi->Start();return 0;
}

输出结果图像为:

通过对比2D纹理体绘制程序与光线投影法体绘制程序,会发现两者基本是一样的,仅仅是vtkVolumeMapper不同。这充分证明了VTK体渲染管线的易用性与通用性。当从一种体绘制方法变换到另一种时,只需要更换相应的vtkVolumeMapper即可。

3.vtkVolumeTexture2D类说明

vtkVolumeTexture2D勒种有两个重要的函数:
  • SetTargetTextureSize(int _ arg1, int _arg2);该函数用于设置纹理图像的大小 默认为512*512。其大小必须为2的幂。
  • SetMaximumNumberOfPlanes(int _arg);该函数用于设置纹理映射的平面数目。当视线垂直方向上的像素数目大于该值时,平面会自动跳跃进行合理的映射。
基于vtkVolumeTexture2D类的二维纹理映射体绘制渲染仅支持合成方式生成渲染图像。

4.与光线投影体绘制算法的对比

基于二维纹理映射的体绘制渲染速度要优于光线投影体绘制。
但是vtkVolumeTexture2D仅支持Alpha合成技术,并且切片上使用双线性插值实现纹理映射,为切片之间不进行任何处理,因此,该方法的体绘制渲染效果是低于光线投影算法的。
此外该方法需要在三个方向上保存相应的纹理图像堆栈,占用内存也比较大。
还有一点需要注意的就是,该方法在渲染过程中会根据视线方向选择当前最垂直(会是最优吗?)的一组纹理,因此在进行两组纹理切换时,会长生瑕疵,从而造成渲染质量的下降。

5.参看资料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.  张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.

VTK修炼之道63:纹理映射体绘制_二维纹理映射相关推荐

  1. VTK修炼之道60:体绘制_体绘制管线图形渲染管线

    1.几何渲染与体绘制 1.1 几何渲染 前面练习的渲染技术都是几何渲染技术.所谓的几何渲染技术,就是通过绘制几何图元(顶点.线段.面片等)来渲染数据,例如:绘制图像需要在空间中建立一个四边形图元,然后 ...

  2. VTK修炼之道62:体绘制_固定点光线投影体绘制与GPU加速光线投影体绘制

    1.固定点光线投影算法 vtkFixedPointVolumeRayCastMapper是一个较好的vtkVolumeRayCastMapper的替代者.该类能够实现基于Alpha合成的体绘制方法和最 ...

  3. VTK修炼之道61:体绘制_光线投影+最大密度投影+等值面法

    1.vtkVolumeMapper vtkVolumeMapper是所有体绘制Mapper类的虚基类,提供接口函数,并由其子类实现具体功能.该类的继承关系如下图所示: 应该掌握一些常用的体绘制类. 2 ...

  4. VTK修炼之道15:图像处理_显示(vtkImageViewer2 vtkImageActor)

    1.vtkImageViewer2用于图像显示实例分析 在VTK早期版本中,提供了vtkImageViewer类来显示图像.随着版本的发展,目前vtkImageViewer2代替了vtkImageVi ...

  5. VTK修炼之道38:图像平滑_中值滤波器

    1.中值滤波 vtkImageHybridMedian2D实现了对二维图像的中值滤波.其实现原理是,采用一个5x5的模板,逐次将模板中心对应于图像的每个像素上,将模板图像覆盖的像素的中值作为当前像素的 ...

  6. VTK修炼之道14:图像处理_创建

    1.引言:图像数据结构 数字图像文件内容由两个部分组成:图像头信息和数据.图像头信息定义了图像的基本信息,主要包括起点位置(Origin),像素间隔(space)和维数(dimension).通过这三 ...

  7. VTK修炼之道32:边缘检测_梯度算子

    1.梯度算子提取图像边缘 图像中不连续的灰度值会产生边缘,图像的边缘检测是基于边界的图像分割方法,如分水岭算法,通常是分割原图的梯度图像,梯度实际上也是反应的图像边缘信息.图像边缘一般常用图像一阶导数 ...

  8. VTK修炼之道70:体绘制讨论_光照阴影、VTKLODProp3D

    1.光照与阴影 通过VTKVolumeProperty可以设置体绘制阴影效果(Shading).阴影效果主要受环境光系数.散射光系数.反射光系数和高光强度四个参数影响. vtkVolumeProper ...

  9. VTK修炼之道69:体绘制讨论_颜色传输函数

    1.颜色传输函数 颜色传输函数与不透明度传输函数的使用类似,二者的不同之处在于颜色传输函数是将一个标量值映射为颜色值.这个颜色值可以是RGB值,也可以是HSV值. VTK颜色传输函数采用VTKColo ...

最新文章

  1. 一步一个脚印学习WCF系列之WCF概要—WCF出现的目的(一)
  2. Apache Solr 实现去掉重复的搜索结果
  3. 程序员的创业陷阱:接私活
  4. Redis之数据结构底层实现
  5. 微软官方pe工具_很好却不够香!微软官方免费数据恢复工具体验
  6. MyEclipse生成Javadoc帮助文档
  7. 腾讯QQ团队开源分布式后台毫秒服务引擎全解析:引擎架构、RPC、灰度……
  8. 区块链学习笔记:DAY01 区块链的技术原理
  9. 8.大数据架构详解:从数据获取到深度学习 --- 机器学习和数据挖掘
  10. 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(九)第一个程序背后的C语言知识
  11. LeetCode 探索初级算法-数组:10 有效的数独-20200321
  12. 能拿驾照就能通过 Elastic 认证考试!
  13. 启动Mysql时报错:mysqld_safe mysqld from pid file /usr/local/mysql/data/Linux.pid ended
  14. 成本和性能(Cost/performance)
  15. 生存之道,每个人都值得尊敬
  16. 目标检测——卷积神经网路基础知识
  17. Java 效率编码 必备插件 Lombok 让代码更优雅
  18. RHCS+Conga+GFS+cLVM共享存储的高可用性web集群
  19. AZBIL FL7S-1W6W-CN03
  20. 几步搞定!用Python实现答题卡识别!

热门文章

  1. HDU 5624 KK's Reconstruction
  2. oralce 笔记
  3. 湫湫系列故事——消灭兔子(优先队列)
  4. hihocoder 1127 : 二分图三·二分图最小点覆盖和最大独立集
  5. NYOJ 372 巧克力
  6. Golang的模板与渲染
  7. spring AspectJ的Execution详解
  8. c#中获取服务器IP,客户端IP以及Request.ServerVariables详细说明
  9. 获取eclipse 运行时,bundle的相对路径
  10. Leetcode-937-Reorder Log Files-(Easy)