日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VTK修炼之道60:体绘制_体绘制管线图形渲染管线

發布時間:2025/3/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VTK修炼之道60:体绘制_体绘制管线图形渲染管线 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.幾何渲染與體繪制

1.1 幾何渲染

前面練習的渲染技術都是幾何渲染技術。所謂的幾何渲染技術,就是通過繪制幾何圖元(頂點、線段、面片等)來渲染數據,例如:繪制圖像需要在空間中建立一個四邊形圖元,然后以紋理映射的方式將該圖像貼圖到該圖元上進行渲染;而三維模型的繪制通常會分解為一系列的多邊形面片進行繪制。這種通過生成中間幾何圖元來進行渲染的方法稱為幾何渲染。 幾何渲染的速度比較快,但是不能顯示體數據的內部細節。例如:在渲染人的三維CT體數據時,通過幾何渲染只能在切片圖像之間進行切換,而不能對體數據內部細節進行立體觀察。

1.2 體繪制

體繪制技術,更多的時候,我們把它稱為三維重建(區別于投影圖像的三維重建),是一種直接利用體數據來生成二維圖像的繪制技術。與面繪制不同,體繪制不需要提取體數據內部的等值面,它是對三維體數據進行采樣和合成的過程。體數據能過通過設置不透明度值來顯示體數據內部的不同成分和細節,例如顯示人體CT圖像的不同器官和組織。

2.圖形渲染管線

在進行體繪制管線學習之前,很有必要回顧一下前面的VTK可視化管線的基本組成。 我習慣把渲染窗口vtkRenderWindow看做一個劇院,劇院中一般需要燈光(vtkLight)、相機(vtkCamera)和舞臺(vtkRenderer)來呈現精彩的演出。 舞臺上負責表演的自然就是演員(vtkActor),而且演員往往不止一個,可以根據需要為舞臺加入更多的演員(vtkActor)。 每個演員又各具特色,而用來表示其特色的則是vtkProperty(負責控制值顏色、材質和不透明度等) 每個vtkActor的數據和渲染信息存儲在一個vtkMapper對象中,負責將原始數據轉換為渲染所需要的圖元數據

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());//設置光線采樣距離//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<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*):該函數用于設置輸入圖像數據。 SetVolumeRayCastFunction(vtkVolumeRayCastFunction*):該函數用于設置光線透射函數類型。 vtkVolumeRayCastCompositeFunction是vtkVolumeRayCastFunction的子類,定義了光線經過體數據后的顏色計算方式。 需要注意的是,這個類備受很多科研人員職責,在VTK7.0.0之后會被移除。 這里我采用vtkFixedPointVolumeRayCastMapper以避免如下錯誤:
#vtkVolumeProperty: 該類定義了體繪制屬性,設置標量不透明度傳輸函數梯度不透明度函數顏色傳輸函數陰影 vtkVolumeProperty用于設置體繪制的屬性,決定體繪制的渲染效果,其中:
  • SetScalarOpacity(vtkPiecewiseFunction* function):該類用于設置灰度不透明度函數。
  • SetColor(vtkColorTransferFunction *function):該類用于設置顏色傳輸函數。
#vtkVolume: vtkVolume與幾何渲染中的vtkActor作用一致,需要設置如下兩個輸入:
  • void SetMapper(vtkAbstractVolumeMapper* mapper):該函數用于設置Mapper對象。
  • void SetProperty(vtkVolumeProperty* property):該函數用于設置屬性對象。
#定義vtkRenderer、vtkRenderWindow、vtkRenderWindowInteractor對象,建立可視化管線。 體繪制渲染結果如下:

4.圖形渲染管線與體繪制渲染管線對比

通過上面代碼可以看出,體繪制渲染管線與幾何渲染管線的組成是比較一致的,都需要vtkRenderWindow、vtkRenderer、vtkActor/vtkVolume、vtkMapper等對象。 它們不同之處在于:
  • 幾何渲染中,通常使用vtkActor來渲染幾何圖像數據,使用vtkImageActor來渲染圖像數據;而在體繪制中,則使用vtkVolume渲染數據。
  • 在幾何渲染中,通常采用vtkPolyDataMapper實現輸入數據向圖元數據的轉換;在體繪制中,則采用vtkVolumeRayCastMapper,要切記的是,這個類是與體繪制的算法相關的,不同的體繪制算法會有不同的Mapper類。
更一般的,幾何圖像渲染管線與體繪制的渲染管線對比圖如下:
虛線部分表示兩者不同之處,從上圖我們能夠看出來,兩種渲染方式不同點主要在Mapper和Actor對象上。

5.no override found for 'vtkRayCastImageDisplayHelper'修訂

體繪制過程中,出現如下錯誤:
這也是一個初始化的問題,解決辦法如下: VTK_MODULE_INIT(vtkRenderingVolumeOpenGL);

6.參看資料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開發進階[M]. 機械工業出版社, 2015.

總結

以上是生活随笔為你收集整理的VTK修炼之道60:体绘制_体绘制管线图形渲染管线的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日韩极品视频 | 国产初高中真实精品视频 | 美女a视频 | 日本久久影视 | 色五婷婷| 欧洲成人综合 | 日韩看片 | 91精品国产91久久久久久久久久久久 | 国产精品二区一区二区aⅴ 一卡二卡三卡在线观看 | 少妇在军营h文高辣 | 免费在线观看你懂的 | 欧美一区永久视频免费观看 | 青春草在线视频观看 | 在线免费国产 | 中文字幕av日韩 | 影音先锋中文字幕一区 | 亚洲精品影视 | 国产18在线 | 欧美亚洲一区二区三区 | 午夜大片 | 国产精品久久久久精 | 精品理论片 | a级片一区二区 | аⅴ天堂中文在线网 | 加勒比hezyo黑人专区 | 国产电影一区在线观看 | 三级不卡视频 | 亚洲AV无码成人精品区东京热 | 久久久在线视频 | 18在线观看免费入口 | 欧美国产日本在线 | 草民午夜理伦三级 | 天天添| 欧美精品1区2区3区 精品成人一区 | 爱如潮水3免费观看日本高清 | 18成人在线观看 | 三级在线看中文字幕完整版 | 日韩中文一区二区 | 日韩资源在线观看 | 黑人借宿巨大中文字幕 | www亚洲精品| 欧美成人精品激情在线视频 | 91九色在线视频 | 日韩视频网| 97精品视频 | 原来神马电影免费高清完整版动漫 | 日韩第四页 | 不良视频在线观看 | 国内av免费 | 欧美一区二区在线看 | 国产在线一二三区 | 久久蜜桃av一区二区天堂 | 一个人看的视频www 色就是色网站 | 国精品一区二区 | 8090理论片午夜理伦片 | 日韩国产在线播放 | 少妇又紧又色 | 中文字幕一区二区三区日韩精品 | 国产又粗又猛视频 | 欧美精品在欧美一区二区少妇 | 久久久久久久久久影视 | 欧美日韩黄色一级片 | 黄色片网站在线 | 爱爱小视频免费看 | 无套白嫩进入乌克兰美女 | 大奶子网站| 日韩精品电影在线 | 日日夜夜爽 | 久久夜色精品国产欧美乱极品 | 久久亚洲精华国产精华液 | 污视频网址在线观看 | 青青操狠狠干 | 在线观看日韩视频 | 久久综合伊人77777蜜臀 | 日本免费在线视频 | 拍国产真实乱人偷精品 | 亚洲在线色 | 欧美视频在线观看 | 日韩中文字幕在线看 | 久久精品国产亚洲av蜜臀色欲 | 久久av一区二区三区漫画 | 三级性生活视频 | 久精品免费视频 | 美女av一区二区 | 欧美黄色录像带 | 啪啪在线观看 | 富二代成人短视频 | 男女啪啪av| 网站久久 | 亚洲一区二区三区黄色 | 久久草av| 日韩黄色免费观看 | 亚洲色成人一区二区三区小说 | 男人桶女人桶爽30分钟 | 国产又爽又黄游戏 | 伊人草| 一级欧美一级日韩 | 免费日韩精品 | 欧美精品三区 |