zoukankan      html  css  js  c++  java
  • 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灵活性最高,支持所有类型数据,最该可以支持四元数据。
  • 相关阅读:
    window.onload和DOMContentLoaded的区别
    存储
    JSONP的实现原理
    对于一个无线下拉加载图片的页面,如何给每个图片绑定事件
    事件冒泡
    通用的事件绑定函数
    拆解url的各部分
    如何检测浏览器的类型
    DOM节点操作
    es6基本用法
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14244445.html
Copyright © 2011-2022 走看看