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灵活性最高,支持所有类型数据,最该可以支持四元数据。