1.三维纹理映射

目前市面上的能多先科都是支持三维纹理映射的。利用三维纹理映射,将体数据映射至一组与视图平面平行的多边形,避免了二维纹理映射方法中因为纹理图像的切换造成的瑕疵。VTK中三维纹理映射体绘制方法由vtkVolumeTexture3D类实现,使用方法与二维纹理映射体绘制方法一致。(实时渲染效果真的是非常好)
代码如下:
#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 <vtkVolumeTextureMapper3D.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<vtkVolumeTextureMapper3D> volumeMapper =vtkSmartPointer<vtkVolumeTextureMapper3D>::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;
}

输出图像如下:

2.硬件上的限制

受硬件纹理空间限制,当数据传递至vtkVolumeTextureMapper3D中后,在内部会进行重采样,以确保图像大小能过满足当前的纹理空间。默认情况下,对于单组分数据的纹理最大为256:256:128;四元非独立数据最大为256:128:128。三维纹理映射仅支持两种类型的显卡:NVIDIA和ATI。为了确保程序能够正确运行,其内部定义了核对函数
int ISRenderSupported(vtkVolumeProperty* , vtkRenderer* );

用来判断是否支持当前的渲染,避免出现错误,使用方法如下:

int valid = volumeMapper->IsRenderSupported(volumeProperty,ren);

当软件程序检查到显卡类型满足时,就会返回TRUE。

3.VTK中体绘制渲染总结

VTK中不同的vtkVolumeMapper支持不同的数据类型。
vtkVolumeRayCastMapper和vtkVolumeTextureMapper2D仅支持VTK_UNSIGNED_CHAR 和VTK_UNSIGNED_SHORT类型数据。当涉及到其他类型数据时,需要做数据强制转换,可以考虑使用vtkImageCast或vtkImageShiftScale类。
vtkVolumeTextureMapper3D则支持任意类型数据,当然必须输单组分数据或者是多元独立数据。
VTKFixedPointVolumeRayCastMapper灵活性最高,支持所有类型数据,最该可以支持四元数据。

4.参看资料

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

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

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

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

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

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

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

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

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

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

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

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

  6. VTK修炼之道67:体绘制讨论_不透明度传输函数

    1.vtkVolume vtkVolume类似于几何渲染中的vtkActor,用于表示渲染场景中的对象.除了存储基本变换信息(平移.旋转.缩放等),其内部还存储了两个重要对象.这两个对象分别是vtkA ...

  7. VTK修炼之道68:体绘制讨论_梯度不透明度传输函数

    1.梯度不透明度函数 梯度不透明度函数是将梯度模值映射为一个不透明度乘子,从而增强过渡区域的显示效果. 该函数也是使用vtkPiecewiseFunction类.例如,在不同材料的临界区域,如空气到软 ...

  8. VTK修炼之道66:体绘制裁剪_Cripping技术

    1.基于Clipping的体绘制裁剪技术 Clipping技术支持VTKImageData和VTKUntructuredGrid数据类型.该功能由vtkAbstractMapper3D类提供,对于那些 ...

  9. VTK修炼之道65:体绘制裁剪_Cropping技术

    1.裁剪 对于一些体积比较大,结构比较复杂的体数据进行体绘制的渲染效果难以展示其内部细节,需要用到裁剪技术来渲染部分数据.vtkVolumeMapper类中提供了两种裁剪技术,分别为Cropping和 ...

最新文章

  1. shell之什么时候使用shell以及最简单的shell程序
  2. 装饰器模式java_Java 8的装饰器模式
  3. 用html编写一幅简单的画,使用html5画简单的折线图
  4. One or more Filters failed to start.
  5. 正向有功正向无功_电表_正向有功、反向无功
  6. TCxGrid 把列移上移下。
  7. oracle全量增量_数据上云,应该选择全量抽取还是增量抽取?
  8. 近日,软件项目管理高峰论坛成功召开,项目管理平台发布正式亮相……
  9. 详解浪潮与Odoo联手背后 双方将带来哪些化学反应?
  10. ElasticsearchTemplate的详细使用,完成多条件查询、匹配度查询等
  11. hystrix 配置了较大的核心线程数导致wating线程过多的问题
  12. 认识常见壳与程序的特征
  13. 响应式布局详解(优缺点)
  14. 2022前端知识整理:十、vue基础
  15. hdu6608 Fansblog(威尔逊定理)
  16. TP-link WR740N 升级版本备忘
  17. 完全用Linux工作,作者王垠
  18. 连作业都不会抄!盘点那些年被淘宝直播带沟里的直播平台
  19. cesium开发加载shapefile制作的白膜
  20. vue项目中数据更新页面不刷新问题

热门文章

  1. centos 6.5配置samba
  2. 实战mongodb3.06 Relica Sets+sharding集群
  3. Android PendingIntent的使用
  4. Linux代理服务器与防火墙安装与应用
  5. nyoj 174 Max Sequence(最大子串和变形)
  6. ThingsBoard 小结
  7. java Web发布的两种方式
  8. 不写画面的网页程序设计,Web API、Web Service、WCF Service
  9. Hibernate总结1
  10. effectiveJava(5)消除过期的对象引用