日韩性视频-久久久蜜桃-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:体绘制_体绘制管线图形渲染管线的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 三级不卡| 人人做人人爽人人爱 | 无码国产精品一区二区免费16 | 国产成人无码精品久久二区三 | 国产15页| 51国产在线| 欧美激情久久久久 | 国产精品天美传媒 | 热99视频| 少妇第一次交换又紧又爽 | 亚欧洲精品在线视频免费观看 | 日韩高清片| 欧美大胆a | 久久久久久久黄色片 | 1024国产视频 | 日韩不卡的av | 精品无码国产一区二区三区av | 亚洲色域网 | 在线免费看mv的网站入口 | 亚洲av综合永久无码精品天堂 | av一区二区三区四区 | 玖草视频在线观看 | 国产探花一区二区 | 波多野结衣免费在线视频 | 怡红院成人影院 | 福利视频免费观看 | 性生活网址 | 日本人妻伦在线中文字幕 | 99精品视频网站 | 国产午夜免费 | 午夜在线成人 | 毛片日本 | 日韩第一页 | 女十八毛片 | 国产aaa毛片| 亚洲最大福利视频网 | 九色视频自拍 | 草青青视频 | 美女被艹视频网站 | 在线免费观看日本 | 免费看a毛片 | 亚洲国产精彩中文乱码av | 韩国91视频 | 国产精品久久久久久久久免费 | 91理论片 | 四虎精品 | 国产一二在线 | 深爱五月综合网 | 人人玩人人弄 | 老熟妇毛茸茸 | 亚洲综合一区在线 | 欧美成人秋霞久久aa片 | 色阁av| 欧美尹人 | 精品视频免费播放 | 色噜噜一区二区三区 | 国产精品国产三级国产 | 亚洲美女屁股眼交8 | 中文字幕在线播放视频 | 国产欧美日韩专区 | 欧美日韩亚洲一区二区 | 亚洲自拍偷拍第一页 | 香蕉视频网站 | 女人一区二区三区 | 激情小说激情视频 | 久久精品欧美视频 | 日本成人黄色片 | 亚洲激情影院 | 女人天堂网| 国精产品乱码一区一区三区四区 | 性高湖久久久久久久久免费 | 国产三级观看 | 国产精品v亚洲精品v日韩精品 | 午夜影院在线看 | 免费成人在线观看视频 | 撒尿free性hd | 伊人天天干 | 99在线视频免费观看 | 2021久久| 五号特工组之偷天换月 | 一起操17c| 亚洲熟妇色自偷自拍另类 | 亚洲中文字幕无码av永久 | 特级毛片在线观看 | 色综合中文综合网 | 中文字幕精品三区 | hd性videos意大利精品 | 嫩草视频在线观看免费 | 黄色一及片 | 双腿张开被9个男人调教 | 狂野欧美性猛交xxxx巴西 | 日韩无码精品一区二区三区 | 99热热久久| 久久亚洲一区 | 精品在线你懂的 | 欧美sm视频| 亚洲网站一区 | av在线官网 | 欧美精品另类 |