VTK修炼之道60:体绘制_体绘制管线图形渲染管线
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道60:体绘制_体绘制管线图形渲染管线
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.幾何渲染與體繪制
1.1 幾何渲染
前面練習(xí)的渲染技術(shù)都是幾何渲染技術(shù)。所謂的幾何渲染技術(shù),就是通過繪制幾何圖元(頂點、線段、面片等)來渲染數(shù)據(jù),例如:繪制圖像需要在空間中建立一個四邊形圖元,然后以紋理映射的方式將該圖像貼圖到該圖元上進行渲染;而三維模型的繪制通常會分解為一系列的多邊形面片進行繪制。這種通過生成中間幾何圖元來進行渲染的方法稱為幾何渲染。 幾何渲染的速度比較快,但是不能顯示體數(shù)據(jù)的內(nèi)部細節(jié)。例如:在渲染人的三維CT體數(shù)據(jù)時,通過幾何渲染只能在切片圖像之間進行切換,而不能對體數(shù)據(jù)內(nèi)部細節(jié)進行立體觀察。1.2 體繪制
體繪制技術(shù),更多的時候,我們把它稱為三維重建(區(qū)別于投影圖像的三維重建),是一種直接利用體數(shù)據(jù)來生成二維圖像的繪制技術(shù)。與面繪制不同,體繪制不需要提取體數(shù)據(jù)內(nèi)部的等值面,它是對三維體數(shù)據(jù)進行采樣和合成的過程。體數(shù)據(jù)能過通過設(shè)置不透明度值來顯示體數(shù)據(jù)內(nèi)部的不同成分和細節(jié),例如顯示人體CT圖像的不同器官和組織。2.圖形渲染管線
在進行體繪制管線學(xué)習(xí)之前,很有必要回顧一下前面的VTK可視化管線的基本組成。 我習(xí)慣把渲染窗口vtkRenderWindow看做一個劇院,劇院中一般需要燈光(vtkLight)、相機(vtkCamera)和舞臺(vtkRenderer)來呈現(xiàn)精彩的演出。 舞臺上負責(zé)表演的自然就是演員(vtkActor),而且演員往往不止一個,可以根據(jù)需要為舞臺加入更多的演員(vtkActor)。 每個演員又各具特色,而用來表示其特色的則是vtkProperty(負責(zé)控制值顏色、材質(zhì)和不透明度等); 每個vtkActor的數(shù)據(jù)和渲染信息存儲在一個vtkMapper對象中,負責(zé)將原始數(shù)據(jù)轉(zhuǎn)換為渲染所需要的圖元數(shù)據(jù)。3.體繪制管線
從可視化管線的組成上來講,體繪制的渲染管線與幾何渲染管線基本一致,先通過一個實例進行初步認識: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL); //錯誤:no override found for 'vtkRayCastImageDisplayHelper'. VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h> #include <vtkStructuredPoints.h> #include <vtkStructuredPointsReader.h> #include <vtkFixedPointVolumeRayCastMapper.h> #include <vtkColorTransferFunction.h> #include <vtkPiecewiseFunction.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkVolumeProperty.h> #include <vtkAxesActor.h> #include <vtkOrientationMarkerWidget.h>int main(int argc, char *argv[]) {vtkSmartPointer<vtkStructuredPointsReader> reader =vtkSmartPointer<vtkStructuredPointsReader>::New();reader->SetFileName("mummy.128.vtk");reader->Update();vtkSmartPointer<vtkFixedPointVolumeRayCastMapper> volumeMapper =vtkSmartPointer<vtkFixedPointVolumeRayCastMapper>::New();volumeMapper->SetInputData(reader->GetOutput());//設(shè)置光線采樣距離//volumeMapper->SetSampleDistance(volumeMapper->GetSampleDistance()*4);//設(shè)置圖像采樣步長//volumeMapper->SetAutoAdjustSampleDistances(0);//volumeMapper->SetImageSampleDistance(4);/*************************************************************************/vtkSmartPointer<vtkVolumeProperty> volumeProperty =vtkSmartPointer<vtkVolumeProperty>::New();volumeProperty->SetInterpolationTypeToLinear();volumeProperty->ShadeOn(); //打開或者關(guān)閉陰影測試volumeProperty->SetAmbient(0.4);volumeProperty->SetDiffuse(0.6); //漫反射volumeProperty->SetSpecular(0.2); //鏡面反射//設(shè)置不透明度vtkSmartPointer<vtkPiecewiseFunction> compositeOpacity =vtkSmartPointer<vtkPiecewiseFunction>::New();compositeOpacity->AddPoint(70, 0.00);compositeOpacity->AddPoint(90, 0.40);compositeOpacity->AddPoint(180, 0.60);volumeProperty->SetScalarOpacity(compositeOpacity); //設(shè)置不透明度傳輸函數(shù)//compositeOpacity->AddPoint(120, 0.00);//測試隱藏部分數(shù)據(jù),對比不同的設(shè)置//compositeOpacity->AddPoint(180, 0.60);//volumeProperty->SetScalarOpacity(compositeOpacity);//設(shè)置梯度不透明屬性vtkSmartPointer<vtkPiecewiseFunction> volumeGradientOpacity =vtkSmartPointer<vtkPiecewiseFunction>::New();volumeGradientOpacity->AddPoint(10, 0.0);volumeGradientOpacity->AddPoint(90, 0.5);volumeGradientOpacity->AddPoint(100, 1.0);volumeProperty->SetGradientOpacity(volumeGradientOpacity);//設(shè)置梯度不透明度效果對比//設(shè)置顏色屬性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<vtkAxesActor> axes = vtkSmartPointer<vtkAxesActor>::New();//axes->SetScale(10);//vtkSmartPointer<vtkOrientationMarkerWidget> widget =// vtkSmartPointer<vtkOrientationMarkerWidget>::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; }#vtkVolumeRayCastMapper: vtkVolumeRayCastMapper定義了一個光線投影體繪制Mapper,其主要接受如下兩個輸入。 SetInputData(vtkImageData*):該函數(shù)用于設(shè)置輸入圖像數(shù)據(jù)。 SetVolumeRayCastFunction(vtkVolumeRayCastFunction*):該函數(shù)用于設(shè)置光線透射函數(shù)類型。 vtkVolumeRayCastCompositeFunction是vtkVolumeRayCastFunction的子類,定義了光線經(jīng)過體數(shù)據(jù)后的顏色計算方式。 需要注意的是,這個類備受很多科研人員職責(zé),在VTK7.0.0之后會被移除。 這里我采用vtkFixedPointVolumeRayCastMapper以避免如下錯誤:
#vtkVolumeProperty: 該類定義了體繪制屬性,設(shè)置標(biāo)量不透明度傳輸函數(shù)、梯度不透明度函數(shù)、顏色傳輸函數(shù)、陰影。 vtkVolumeProperty用于設(shè)置體繪制的屬性,決定體繪制的渲染效果,其中:
- SetScalarOpacity(vtkPiecewiseFunction* function):該類用于設(shè)置灰度不透明度函數(shù)。
- SetColor(vtkColorTransferFunction *function):該類用于設(shè)置顏色傳輸函數(shù)。
- void SetMapper(vtkAbstractVolumeMapper* mapper):該函數(shù)用于設(shè)置Mapper對象。
- void SetProperty(vtkVolumeProperty* property):該函數(shù)用于設(shè)置屬性對象。
4.圖形渲染管線與體繪制渲染管線對比
通過上面代碼可以看出,體繪制渲染管線與幾何渲染管線的組成是比較一致的,都需要vtkRenderWindow、vtkRenderer、vtkActor/vtkVolume、vtkMapper等對象。 它們不同之處在于:- 幾何渲染中,通常使用vtkActor來渲染幾何圖像數(shù)據(jù),使用vtkImageActor來渲染圖像數(shù)據(jù);而在體繪制中,則使用vtkVolume渲染數(shù)據(jù)。
- 在幾何渲染中,通常采用vtkPolyDataMapper實現(xiàn)輸入數(shù)據(jù)向圖元數(shù)據(jù)的轉(zhuǎn)換;在體繪制中,則采用vtkVolumeRayCastMapper,要切記的是,這個類是與體繪制的算法相關(guān)的,不同的體繪制算法會有不同的Mapper類。
虛線部分表示兩者不同之處,從上圖我們能夠看出來,兩種渲染方式不同點主要在Mapper和Actor對象上。
5.no override found for 'vtkRayCastImageDisplayHelper'修訂
體繪制過程中,出現(xiàn)如下錯誤:這也是一個初始化的問題,解決辦法如下: VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);
6.參看資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發(fā)進階[M]. 機械工業(yè)出版社, 2015.
總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道60:体绘制_体绘制管线图形渲染管线的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 竞争者都是 飞鸽传书 高手
- 下一篇: 飞鸽传书该如何去优化?