VTK 纹理映射体绘制_三维纹理映射
作者:互联网
1.三维纹理映射
目前市面上的能多先科都是支持三维纹理映射的。利用三维纹理映射,将体数据映射至一组与视图平面平行的多边形,避免了二维纹理映射方法中因为纹理图像的切换造成的瑕疵。VTK中三维纹理映射体绘制方法由vtkVolumeTexture3D类实现,使用方法与二维纹理映射体绘制方法一致。(实时渲染效果真的是非常好) 代码如下:1 #include <vtkAutoInit.h> 2 VTK_MODULE_INIT(vtkRenderingOpenGL); 3 VTK_MODULE_INIT(vtkRenderingVolumeOpenGL); 4 VTK_MODULE_INIT(vtkRenderingFreeType); 5 VTK_MODULE_INIT(vtkInteractionStyle); 6 7 #include <vtkSmartPointer.h> 8 #include <vtkStructuredPoints.h> 9 #include <vtkStructuredPointsReader.h> 10 //#include <vtkVolumeTextureMapper2D.h> 11 #include <vtkVolumeTextureMapper3D.h> 12 #include <vtkColorTransferFunction.h> 13 #include <vtkPiecewiseFunction.h> 14 #include <vtkRenderer.h> 15 #include <vtkRenderWindow.h> 16 #include <vtkRenderWindowInteractor.h> 17 #include <vtkVolumeProperty.h> 18 #include <vtkVolumeRayCastIsosurfaceFunction.h> 19 20 int main(int argc, char *argv[]) 21 { 22 vtkSmartPointer<vtkStructuredPointsReader> reader = 23 vtkSmartPointer<vtkStructuredPointsReader>::New(); 24 reader->SetFileName("mummy.128.vtk"); 25 reader->Update(); 26 27 28 /*vtkSmartPointer<vtkVolumeTextureMapper2D> volumeMapper = 29 vtkSmartPointer<vtkVolumeTextureMapper2D>::New(); 30 volumeMapper->SetInputData(reader->GetOutput());;*/ 31 32 vtkSmartPointer<vtkVolumeTextureMapper3D> volumeMapper = 33 vtkSmartPointer<vtkVolumeTextureMapper3D>::New(); 34 volumeMapper->SetInputData(reader->GetOutput());; 35 /*************************************************************************/ 36 vtkSmartPointer<vtkVolumeProperty> volumeProperty = 37 vtkSmartPointer<vtkVolumeProperty>::New(); 38 volumeProperty->SetInterpolationTypeToLinear(); 39 volumeProperty->ShadeOn(); //打开或者关闭阴影测试 40 volumeProperty->SetAmbient(0.4); 41 volumeProperty->SetDiffuse(0.6); //漫反射 42 volumeProperty->SetSpecular(0.2); //镜面反射 43 //设置不透明度 44 vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity = 45 vtkSmartPointer<vtkPiecewiseFunction>::New(); 46 compositeOpacity->AddPoint(70, 0.00); 47 compositeOpacity->AddPoint(90, 0.40); 48 compositeOpacity->AddPoint(180, 0.60); 49 volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数 50 51 //设置颜色属性 52 vtkSmartPointer<vtkColorTransferFunction> color = 53 vtkSmartPointer<vtkColorTransferFunction>::New(); 54 color->AddRGBPoint(0.000, 0.00, 0.00, 0.00); 55 color->AddRGBPoint(64.00, 1.00, 0.52, 0.30); 56 color->AddRGBPoint(190.0, 1.00, 1.00, 1.00); 57 color->AddRGBPoint(220.0, 0.20, 0.20, 0.20); 58 volumeProperty->SetColor(color); 59 /********************************************************************************/ 60 vtkSmartPointer<vtkVolume> volume = 61 vtkSmartPointer<vtkVolume>::New(); 62 volume->SetMapper(volumeMapper); 63 volume->SetProperty(volumeProperty); 64 65 vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New(); 66 ren->SetBackground(0, 1, 0); 67 ren->AddVolume(volume); 68 69 vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New(); 70 rw->AddRenderer(ren); 71 rw->SetSize(480, 480); 72 rw->Render(); 73 rw->SetWindowName("VolumeRendering by Texture2D"); 74 75 vtkSmartPointer<vtkRenderWindowInteractor> rwi = 76 vtkSmartPointer<vtkRenderWindowInteractor>::New(); 77 rwi->SetRenderWindow(rw); 78 79 ren->ResetCamera(); 80 rw->Render(); 81 rwi->Start(); 82 83 return 0; 84 }输出图像如下:
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灵活性最高,支持所有类型数据,最该可以支持四元数据。
标签:volumeProperty,映射,VTK,纹理,vtkSmartPointer,New,include 来源: https://www.cnblogs.com/ybqjymy/p/14244445.html