参考链接:VTK修炼之道60:体绘制_体绘制管线&图形渲染管线-CSDN博客
1.面绘制(几何渲染)与体绘制
1.1面绘制
面绘制通过生成中间几何图元(顶点、线段、面片等)来进行渲染。例如:绘制图像需要在空间中建立一个四边形图元,然后以纹理映射的方式将该图像贴图到该图元上进行渲染;而三维模型的绘制通常会分解为一系列的多边形面片进行绘制。
面绘制的速度比较快,但是不能显示体数据的内部细节。例如:在渲染人的三维CT体数据时,通过几何渲染只能在切片图像之间进行切换,而不能对体数据内部细节进行立体观察。
1.2 体绘制
体绘制,也称为三维重建(区别于投影图像的三维重建),直接利用体数据来生成二维图像。与面绘制不同,体绘制不需要提取体数据内部的等值面,它是对三维体数据进行采样和合成的过程。体数据能过通过设置不透明度值来显示体数据内部的不同成分和细节,例如显示人体CT图像的不同器官和组织。
2.VTK管线
![](https://i-blog.csdnimg.cn/blog_migrate/d7dd7e61c64fc6fd8decb2cc3349603f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/dc2627eca272f5d3257e4367f9921ea0.png)
2.1可视化管线
可视化管线是指用于获取或创建数据,处理数据,以及把数据写入文件或者把数据传递给渲染引擎进行显示的结构。可视化管线包括Source、Filter和Mapper。Source是指用于创建数据(如或者读取数据(如vtkStructuredPointsReader等)的类的统称,即VTK的数据源。Source输出的数据作为Filter的输入,经Filter(如vtkMarchingCubes类似的对数据做处理的类)处理以后(可以经多个Filter处理),生成新的数据。Filter的输出可以直接写入文件,或者经Mapper变换后送入渲染引擎进行渲染、显示,结束可视化管线。
2.2渲染管线
回顾一下面绘制的渲染管线,把渲染窗口vtkRenderWindow看做一个剧院,剧院中一般需要灯光(vtkLight)、相机(vtkCamera)和舞台(vtkRenderer)来呈现精彩的演出。
舞台上负责表演的自然就是演员(vtkActor),而且演员往往不止一个,可以根据需要为舞台加入更多的演员(vtkActor)。
每个vtkActor存储了vtkProperty(负责控制值颜色、材质和不透明度等)和vtkMapper(负责将原始数据转换为渲染所需要的图元数据)两个对象。
3.体绘制渲染管线
vtkVolumeMapper→vtkVolumeProperty→vtkVolume→vtkRenderer、vtkRenderWindow、vtkRenderWindowInteractor
#vtkVolumeMapper:(如vtkVolumeRayCastMapper)
vtkVolumeRayCastMapper定义了一个光线投影体绘制Mapper,其主要接受如下两个输入。
SetInputData(vtkImageData*):该函数用于设置输入图像数据。
SetVolumeRayCastFunction(vtkVolumeRayCastFunction*):该函数用于设置光线透射函数类型。
除此之外还有SetSampleDistance():设置光线采样距离
设置图像采样步长:
SetAutoAdjustSampleDistances(0):关闭自动设置图像采样步长,mapper自动默认为开启
SetImageSampleDistance(4):设置图像采样步长为4
#vtkVolumeProperty:
该类定义了体绘制属性,设置标量不透明度传输函数、梯度不透明度函数、颜色传输函数、阴影。
vtkVolumeProperty用于设置体绘制的属性,决定体绘制的渲染效果,其中:
SetScalarOpacity(vtkPiecewiseFunction* function):该类用于设置灰度不透明度函数。 SetGradientOpacity(vtkPiecewiseFunction* function):设置梯度不透明度函数
etColor(vtkColorTransferFunction *function):该类用于设置颜色传输函数。
#vtkVolume:
vtkVolume与几何渲染中的vtkActor作用一致,需要设置如下两个输入:
SetMapper(vtkAbstractVolumeMapper* mapper):该函数用于设置Mapper对象。
SetProperty(vtkVolumeProperty* property):该函数用于设置属性对象
#定义vtkRenderer、vtkRenderWindow、vtkRenderWindowInteractor对象,建立可视化管线。
4.面绘制渲染管线与体绘制渲染管线对比
体绘制渲染管线与面绘制管线的组成是比较一致的,都需要vtkRenderWindow、vtkRenderer、vtkActor/vtkVolume、vtkMapper等对象。
它们不同之处在于:
- 面绘制中,通常使用vtkActor来渲染几何图像数据,使用vtkImageActor来渲染图像数据;而在体绘制中,则使用vtkVolume渲染数据。
- 面绘制中,通常采用vtkPolyDataMapper实现输入数据向图元数据的转换;在体绘制中,则采用vtkVolumeMapper,要切记的是,这个类是与体绘制的算法相关的,不同的体绘制算法会有不同的Mapper类。
面绘制渲染管线与体绘制的渲染管线对比图如下: