VTK修炼之道62:体绘制_固定点光线投影体绘制与GPU加速光线投影体绘制
1.固定点光线投影算法
vtkFixedPointVolumeRayCastMapper是一个较好的vtkVolumeRayCastMapper的替代者。该类能够实现基于Alpha合成的体绘制方法和最大密度投影体绘制方法,能够支持任意类型带的医院或者独立多元数据。例如,当输入为二元独立数据时,第一源数据用于颜色映射,而第二元作为不透明度映射。该类使用了空间跳跃技术来加速体绘制渲染过程,而在内部计算时,统一使用了float数据类型。vtkFixedPointVolumeRayCastFMapper与vtkVolumeRayCastMapper对比
两个类的使用方法基本一致,都支持设置光线采样步长、图像采样距离、自动调整图像采样距离等操作。当然两者也存在以下区别:1.vtkFixedPointVolumeRayCastFMapper只支持基于Alpha合成的体绘制方法和最大密度体绘制方法,可以通过基类vtkVolumeMapper的接口函数来设置。void SetBlendModeToComposite(); void SetBlendModeToMaximumIntensity(); void SetBlendModeToMinimumIntensity(); void SetBlendModeToAddictive();
2.该类仅支持先插值在分类操作;
3.该类支持更多种数据类型。
2.基于GPU加速的光线投射体绘制算法
vtkGPUVolumeRayCastMapper类实现了基于GPU加速的光线投影体绘制算法。该类的使用方法与上面两各类基本一致。同样可以实现光线采样步长、图像采样距离、自动调整图像采样距离等。代码实现如下:#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 <vtkGPUVolumeRayCastMapper.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<vtkGPUVolumeRayCastMapper> volumeMapper =vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();volumeMapper->SetInputData(reader->GetOutput());;volumeMapper->SetSampleDistance(volumeMapper->GetSampleDistance()/2); //设置光线采样距离//volumeMapper->SetAutoAdjustSampleDistances(0);//设置图像采样步长//volumeMapper->SetImageSampleDistance(4);/*************************************************************************/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<vtkPiecewiseFunction> volumeGradientOpacity =vtkSmartPointer<vtkPiecewiseFunction>::New();volumeGradientOpacity->AddPoint(10, 0.0);volumeGradientOpacity->AddPoint(90, 0.5);volumeGradientOpacity->AddPoint(100, 1.0);volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比//设置颜色属性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(640, 480);rw->Render();rw->SetWindowName("VolumeRendering");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);ren->ResetCamera();rw->Render();rwi->Start();return 0; }
输出结果如下:
3.参看资料
1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3. 张晓东, 罗火灵. VTK图形图像开发进阶[M]. 机械工业出版社, 2015.
VTK修炼之道62:体绘制_固定点光线投影体绘制与GPU加速光线投影体绘制相关推荐
- VTK修炼之道63:纹理映射体绘制_二维纹理映射
1.纹理映射体绘制 基于软件实现的光线投影体绘制算法计算量非常大,不利于进行实时渲染.因此,目前体绘制经常使用图形硬件利用纹理映射来加速. 其主要原理是将三维体数据作为纹理装载入硬件缓存中,利用硬件来 ...
- VTK修炼之道69:体绘制讨论_颜色传输函数
1.颜色传输函数 颜色传输函数与不透明度传输函数的使用类似,二者的不同之处在于颜色传输函数是将一个标量值映射为颜色值.这个颜色值可以是RGB值,也可以是HSV值. VTK颜色传输函数采用VTKColo ...
- VTK修炼之道60:体绘制_体绘制管线图形渲染管线
1.几何渲染与体绘制 1.1 几何渲染 前面练习的渲染技术都是几何渲染技术.所谓的几何渲染技术,就是通过绘制几何图元(顶点.线段.面片等)来渲染数据,例如:绘制图像需要在空间中建立一个四边形图元,然后 ...
- VTK修炼之道70:体绘制讨论_光照阴影、VTKLODProp3D
1.光照与阴影 通过VTKVolumeProperty可以设置体绘制阴影效果(Shading).阴影效果主要受环境光系数.散射光系数.反射光系数和高光强度四个参数影响. vtkVolumeProper ...
- VTK修炼之道67:体绘制讨论_不透明度传输函数
1.vtkVolume vtkVolume类似于几何渲染中的vtkActor,用于表示渲染场景中的对象.除了存储基本变换信息(平移.旋转.缩放等),其内部还存储了两个重要对象.这两个对象分别是vtkA ...
- VTK修炼之道64:纹理映射体绘制_三维纹理映射
1.三维纹理映射 目前市面上的能多先科都是支持三维纹理映射的.利用三维纹理映射,将体数据映射至一组与视图平面平行的多边形,避免了二维纹理映射方法中因为纹理图像的切换造成的瑕疵.VTK中三维纹理映射体绘 ...
- VTK修炼之道61:体绘制_光线投影+最大密度投影+等值面法
1.vtkVolumeMapper vtkVolumeMapper是所有体绘制Mapper类的虚基类,提供接口函数,并由其子类实现具体功能.该类的继承关系如下图所示: 应该掌握一些常用的体绘制类. 2 ...
- VTK修炼之道68:体绘制讨论_梯度不透明度传输函数
1.梯度不透明度函数 梯度不透明度函数是将梯度模值映射为一个不透明度乘子,从而增强过渡区域的显示效果. 该函数也是使用vtkPiecewiseFunction类.例如,在不同材料的临界区域,如空气到软 ...
- VTK修炼之道82:VTK管线机制_信息对象类VTKInformation
1.VTK管线机制 VTK中通过管线机制来实现组合各种算法处理数据.每一种算法是一个Filter,多个Filter连接在一起形成VTK管线.每个Filter可以分为两个组成部分:一个是算法对象,继承自 ...
最新文章
- mysql 事物 锁行 测试_MySQL Transaction--RC事务隔离级别下加锁测试
- 006_logback体系结构
- 【opencv】4.初始化Mat的方式、访问cv::Mat中的某个元素
- nsga2算法_用遗传算法进行容量管理 让虚拟机放置策略更优
- java 批量执行 sql_执行批量操作 - SQL Server | Microsoft Docs
- 静电场求电场强度E和电势U的方法
- XMLHttpRequest接收JSON请求
- struts教程笔记3
- git commit后,如何撤销commit
- 学习中科院杨力祥c++
- axure手机页面设计说明_Axure中移动端原型设计方法
- Python第三方库安装及常见问题
- 民国传奇女子——张爱玲
- DotNetCore CAP
- 机器学习总结(九):梯度消失(vanishing gradient)与梯度爆炸(exploding gradient)问题
- matlab面元法计算naca翼型的升力系数(关于攻角的曲线)
- 【docker ros】docker 开启自启运行容器中的程序
- 奔腾处理器_编号和非编号的奔腾处理器之间有什么区别?
- 通过Python自动化玩腾讯微证券领长牛
- uni-app动态切换样式