zoukankan      html  css  js  c++  java
  • VTK 体绘制_固定点光线投影体绘制与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加速的光线投影体绘制算法。该类的使用方法与上面两各类基本一致。同样可以实现光线采样步长、图像采样距离、自动调整图像采样距离等。
    代码实现如下:
     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 <vtkGPUVolumeRayCastMapper.h>
    11 #include <vtkColorTransferFunction.h>
    12 #include <vtkPiecewiseFunction.h>
    13 #include <vtkRenderer.h>
    14 #include <vtkRenderWindow.h>
    15 #include <vtkRenderWindowInteractor.h>
    16 #include <vtkVolumeProperty.h>
    17 #include <vtkVolumeRayCastIsosurfaceFunction.h>
    18  
    19 int main(int argc, char *argv[])
    20 {
    21     vtkSmartPointer<vtkStructuredPointsReader> reader =
    22         vtkSmartPointer<vtkStructuredPointsReader>::New();
    23     reader->SetFileName("mummy.128.vtk");
    24     reader->Update();
    25  
    26  
    27     vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper =
    28         vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
    29     volumeMapper->SetInputData(reader->GetOutput());;
    30     volumeMapper->SetSampleDistance(volumeMapper->GetSampleDistance()/2);    //设置光线采样距离
    31     //volumeMapper->SetAutoAdjustSampleDistances(0);//设置图像采样步长
    32     //volumeMapper->SetImageSampleDistance(4);
    33     /*************************************************************************/
    34     vtkSmartPointer<vtkVolumeProperty> volumeProperty =
    35         vtkSmartPointer<vtkVolumeProperty>::New();
    36     volumeProperty->SetInterpolationTypeToLinear();
    37     volumeProperty->ShadeOn();  //打开或者关闭阴影测试
    38     volumeProperty->SetAmbient(0.4);
    39     volumeProperty->SetDiffuse(0.6);  //漫反射
    40     volumeProperty->SetSpecular(0.2); //镜面反射
    41     //设置不透明度
    42     vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =
    43         vtkSmartPointer<vtkPiecewiseFunction>::New();
    44     compositeOpacity->AddPoint(70, 0.00);
    45     compositeOpacity->AddPoint(90, 0.40);
    46     compositeOpacity->AddPoint(180, 0.60);
    47     volumeProperty->SetScalarOpacity(compositeOpacity); //设置不透明度传输函数
    48     //设置梯度不透明属性
    49     vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity =
    50         vtkSmartPointer<vtkPiecewiseFunction>::New();
    51     volumeGradientOpacity->AddPoint(10, 0.0);
    52     volumeGradientOpacity->AddPoint(90, 0.5);
    53     volumeGradientOpacity->AddPoint(100, 1.0);
    54     volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比
    55     //设置颜色属性
    56     vtkSmartPointer<vtkColorTransferFunction> color =
    57         vtkSmartPointer<vtkColorTransferFunction>::New();
    58     color->AddRGBPoint(0.000, 0.00, 0.00, 0.00);
    59     color->AddRGBPoint(64.00, 1.00, 0.52, 0.30);
    60     color->AddRGBPoint(190.0, 1.00, 1.00, 1.00);
    61     color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);
    62     volumeProperty->SetColor(color);
    63     /********************************************************************************/
    64     vtkSmartPointer<vtkVolume> volume =
    65         vtkSmartPointer<vtkVolume>::New();
    66     volume->SetMapper(volumeMapper);
    67     volume->SetProperty(volumeProperty);
    68  
    69     vtkSmartPointer<vtkRenderer> ren = vtkSmartPointer<vtkRenderer>::New();
    70     ren->SetBackground(0, 1, 0);
    71     ren->AddVolume(volume);
    72  
    73     vtkSmartPointer<vtkRenderWindow> rw = vtkSmartPointer<vtkRenderWindow>::New();
    74     rw->AddRenderer(ren);
    75     rw->SetSize(640, 480);
    76     rw->Render();
    77     rw->SetWindowName("VolumeRendering");
    78  
    79     vtkSmartPointer<vtkRenderWindowInteractor> rwi =
    80         vtkSmartPointer<vtkRenderWindowInteractor>::New();
    81     rwi->SetRenderWindow(rw);
    82  
    83     ren->ResetCamera();
    84     rw->Render();
    85     rwi->Start();
    86  
    87     return 0;
    88 }
    输出结果如下:
  • 相关阅读:
    浅谈TCP三次握手和四次挥手
    浅谈网络七层协议
    websocket实例
    浅谈websocket
    python的垃圾回收机制
    解释型语言和编译型语言的区别
    装饰器修复技术@wraps
    Django基础知识点
    项目再Windows上没有问题,但是在Linux上运行报错OSError: [Errno 8] Exec format error:
    在Centos 7 系统上部署flask 项目 pipenv+nginx+gunicorn
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/14244437.html
Copyright © 2011-2022 走看看