VTK:体绘制——体绘制管线图形渲染管线
1.几何渲染与体绘制
- 几何渲染:就是通过绘制几何图元(顶点、线段、面片等)来渲染数据,例如绘制图像需要在空间中建立一个四边图元,然后以纹理映射的方式将该图像贴图到该图元上进行渲染;而三维模型的绘制通常会分解为一系列的多边面片进行绘制。这种通过生成中间几何图元来进行渲染的方法称为几何渲染。几何渲染的速度比较快,但是不能显示数据的内部细节。例如:在渲染人的三维CT体数据时,通过几何渲染只能在切片图像之间进行切换,而不能进行切换,而不能对体数据内部细节进行立体观察。
- 体绘制:又称为三维重建(区别于投影图像的三维重建),是一种直接利用体数据来生成二维图像的绘制技术。与面绘制不同,体绘制不需要提取提数据内部的等值面,他是对三维数据进行采样和合成的过程。体数据能通过设置不透明度值来显示体数据内部不同成分和细节,例如显示人体CT图像的不同器官和组织。
2.图形渲染管线
在进行体绘制管线学习之前,很有必要回顾一下前面的VTK可视化管线的基本组成。习惯把渲染窗口vtkRenderWindow看做一个剧院,剧院中一般需要灯光(vtkLight)、相机(vtkCamera)和舞台(vtkRenderer)来呈现精彩的演出。舞台上负责表演的自然就是演员(vtk Actor),而且演员的个数不唯一,可以根据需要为舞台加入更多的演员(vtkActor)。
每个演员又具有特色,而用来表示其特色的则是vtkProperty(负责控制值颜色、材质和不透明度等)。
每个演员的数据和渲染信息存储在一个vtkMapper对象中,负责将原始的数据转换为渲染所需要的图元数据。
3.体绘制管线
体绘制管线的渲染管线与几何渲染管线基本一致,下面的实例:
#include
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); //错误:no override found for 'vtkRayCastImageDisplayHelper'.
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkInteractionStyle);#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include int main(int argc, char* argv[])
{vtkSmartPointer<vtkStructuredPointsReader> reader =vtkSmartPointer<vtkStructuredPointsReader>::New();reader->SetFileName("data/mummy.128.vtk");reader->Update();vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> volumeMapper =vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();volumeMapper->SetInputData(reader->GetOutput());//设置光线采样距离//volumeMapper->SetSampleDistance(volumeMapper->GetSampleDistance()*4);//设置图像采样步长//volumeMapper->SetAutoAdjustSampleDistances(0);//volumeMapper->SetImageSampleDistance(4);/*************************************************************************/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); //设置不透明度传输函数//compositeOpacity->AddPoint(120, 0.00);//测试隐藏部分数据,对比不同的设置//compositeOpacity->AddPoint(180, 0.60);//volumeProperty->SetScalarOpacity(compositeOpacity);//设置梯度不透明属性vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity =vtkSmartPointer<vtkPiecewiseFunction>::New();volumeGradientOpacity->AddPoint(10, 0.0);volumeGradientOpacity->AddPoint(90, 0.5);volumeGradientOpacity->AddPoint(100, 1.0);volumeProperty->SetGradientOpacity(volumeGradientOpacity);//设置梯度不透明度效果对比//设置颜色属性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(640, 480);rw->Render();rw->SetWindowName("VolumeRendering PipeLine");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);/********************************************************************************///vtkSmartPointer axes = vtkSmartPointer::New(); //axes->SetScale(10);//vtkSmartPointer widget = // vtkSmartPointer::New(); //widget->SetOutlineColor(1, 1, 1);//widget->SetViewport(0, 0, 0.2, 0.2);//widget->SetOrientationMarker(axes);//widget->SetInteractor(rwi);//widget->SetEnabled(1);//widget->InteractiveOn();ren->ResetCamera();rw->Render();rwi->Start();return 0;
}

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
