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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

VTK修炼之道70:体绘制讨论_光照阴影、VTKLODProp3D

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VTK修炼之道70:体绘制讨论_光照阴影、VTKLODProp3D 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.光照與陰影

通過VTKVolumeProperty可以設置體繪制陰影效果(Shading)。陰影效果主要受環境光系數、散射光系數、反射光系數和高光強度四個參數影響。
  • vtkVolumeProperty::SetAmbient()設置環境光系數
  • vtkVolumeProperty::SetDiffuse()設置散射光系數
  • vtkVolumeProperty::SetSpecular()設置反射光系數
一般情況下,三個系數的和應該為1。 但是有時候,在體繪制過程中為了提高亮度,三值之和會大于1。 另外,還有一個參數是高光強度(Specular Power),用于控制體繪制的外觀平滑程度。可用于VTKVolumeProperty::SetSpecularPower()設置該參數。 光照與陰影設置標準代碼片: volumeProperty->ShadeOn(); volumeProperty->SetAmbient(0.4); volumeProperty->SetDiffuse(0.6); volumeProperty->SetSpecular(0.2);vtkVolumeProperty中默認是是關閉陰影效果的,因此需要顯式調用ShadeOn()函數來打開陰影效果。
代碼中,設置了環境光系數為0.4,散射光系數為0.6,反射光系數為0.2。
在這三個系數中,當環境光系數占主導時,陰影效果不明顯當散射光系數占主導時,顯示效果會比較粗燥但反射光系數占主導時,顯示效果會比較光滑 當陰影效果關閉時,等同于環境光系數為1.0,其他兩個系數為零。 當然陰影效果還與光源的數目、位置和顏色有關
左視圖是開啟陰影后的效果;右視圖是關閉陰影后的效果。通過比較我們可以發現:開啟陰影后體繪制效果會更加清晰逼真。 需要注意的是,開啟陰影效果對vtkUnstructuredGrid數據類型是無效的;此外,對vtkImageData的最大密度投影也是無效的。而且對于多元數據,雖然可以為每一個組分開啟陰影以及設置相應的系數,但是,現有VTK的vtkVolumeMapper類并不支持該類型數據體數據中的渲染效果

2. 體繪制加速:vtkLODProp3D

對于一個大數據來講,體繪制是一個計算量非常龐大、非常耗時的操作。尤其是在用戶交互過程,需要不斷對數據進行渲染,這樣就造成了交互不流暢,用戶體驗差。 可以使用VTKLODProp3D來解決這個問題,提高繪制速度。vtkLODProp3D類的用法與vtkVolume類似,兩者都繼承自vtkProp3D。不同的是,vtkLODProp3D類能夠支持多個Mapper、Property和Texture對象,并由他選擇Mapper對象實現繪制 例如,當繪制一個數據量非常大的不規則網格數據時,可以添加一個vtkPolyDataMapper渲染一個表面模型,作為最低級別分辨率的渲染;然后將數據采樣為VTKImageDataMapper數據,并添加一個vtkVolumeTextureMapper3D進行體繪制,作為一個中間級別渲染;左后可以通過ZSweep技術(vtkUnstructuredGridVolumeZSweepMapper)渲染原始數據,作為最高級別的渲染。 vtkLODProp3D在渲染過程中,會為每個Mapper估計一個渲染時間,并選擇一個最優的實現渲染。

2.1 使用vtkLODProp3D提高渲染速度和交互體驗

示例代碼如下: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkInteractionStyle);#include <vtkSmartPointer.h> #include <vtkStructuredPoints.h> #include <vtkStructuredPointsReader.h> #include <vtkVolumeProperty.h> #include <vtkPiecewiseFunction.h> #include <vtkColorTransferFunction.h> #include <vtkGPUVolumeRayCastMapper.h> #include <vtkVolume.h> #include <vtkLODProp3D.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkCamera.h>int main(int argc, char *argv[]) {vtkSmartPointer<vtkStructuredPointsReader> reader =vtkSmartPointer<vtkStructuredPointsReader>::New();reader->SetFileName("mummy.128.vtk");reader->Update();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);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<vtkGPUVolumeRayCastMapper> hiresMapper =vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();hiresMapper->SetInputData(reader->GetOutput());hiresMapper->SetAutoAdjustSampleDistances(0); //關閉自動調整功能vtkSmartPointer<vtkGPUVolumeRayCastMapper> lowresMapper =vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();lowresMapper->SetInputData(reader->GetOutput());lowresMapper->SetAutoAdjustSampleDistances(0);lowresMapper->SetSampleDistance(4 * hiresMapper->GetSampleDistance());lowresMapper->SetImageSampleDistance(4 * hiresMapper->GetImageSampleDistance()); /******************************************************************/vtkSmartPointer<vtkLODProp3D> prop =vtkSmartPointer<vtkLODProp3D>::New();prop->AddLOD(lowresMapper, volumeProperty, 0.0);prop->AddLOD(hiresMapper, volumeProperty, 0.0);vtkSmartPointer<vtkVolume> volume =vtkSmartPointer<vtkVolume>::New();volume->SetMapper(hiresMapper);volume->SetProperty(volumeProperty);double volumeView[4] = { 0, 0, 0.5, 1 };double lodpropView[4] = { 0.5, 0, 1, 1 };vtkSmartPointer<vtkRenderer> volumeRender = vtkSmartPointer<vtkRenderer>::New();volumeRender->SetBackground(1, 1, 0);volumeRender->AddVolume(volume);volumeRender->SetViewport(volumeView);vtkSmartPointer<vtkRenderer> propRender = vtkSmartPointer<vtkRenderer>::New();propRender->SetBackground(0, 1, 0);propRender->AddVolume(prop);propRender->SetViewport(lodpropView);///vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();renWin->AddRenderer(volumeRender);renWin->AddRenderer(propRender);renWin->SetSize(640, 320);renWin->Render();renWin->SetWindowName("Volume By vtkLODProp3D");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(renWin);volumeRender->GetActiveCamera()->SetPosition(0, -1, 0);volumeRender->GetActiveCamera()->SetFocalPoint(0, 0, 0);volumeRender->GetActiveCamera()->SetViewUp(0, 0, 1);volumeRender->GetActiveCamera()->Azimuth(30);volumeRender->GetActiveCamera()->Elevation(30);volumeRender->ResetCamera();propRender->SetActiveCamera(volumeRender->GetActiveCamera());renWin->Render();rwi->Start();return 0; }輸出結果:

2.2 討論

上面的例子定義了兩個光線投影Mapper對象。由于vtkVolumeRayCastMapper中默認開始自動調整采樣距離來提高效率,因此首先關閉自動調節采樣距離。 對于lowresMapper,程序中設定光線采樣步長和圖像采樣距離為hiresMapper的四倍。Mapper定義完畢后,我們就可以調用vtkLODProp3D進行渲染顯示。 vtkLODProp3D類添加Mapper的函數原型為:
int AddLOD(vtkMapper* m, vtkProperty* p, double time); 該函數有三個參數,前兩個定義了Mapper對象及Property屬性。第三個參數為一個時間大小,表示當前Mapper渲染時間的初始值。如果該時間設置為0,表示開始時立即渲染對象而不用估計當前Mapper的渲染時間。 完成初試渲染后,可以得到各種Mapper的渲染時間。在vtkLODProp3D對象渲染時,會首先選擇那些渲染時間為0的Mapper來渲染場景。 當然,一般來說,渲染時間為零的情況比較少見。在上個例子中,因為兩個Mapper渲染時間的初始值均設為0,所以程序一開始便會渲染兩次。

2.3 vtkLODProp3D的應用前景

實際中,經常會應用LOD技術來使用各種方法來實現體繪制,在滿足精度的要求下提高交互體驗。 我們知道,vtkVolume負責組合體繪制管線,除了包含一個Mapper對象外,還需要用VTKVolumeProperty對象來設置體繪制的顏色映射,如不透明度傳輸函數、梯度不透明度傳輸函數、顏色傳輸函數和設置陰影效果。vtkLODProp3D最大的優勢在于提供了一種LOD技術來集成多種Mapper對象,能夠有效提高渲染效率的交互體驗。

3.參看資料

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

總結

以上是生活随笔為你收集整理的VTK修炼之道70:体绘制讨论_光照阴影、VTKLODProp3D的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: www国产一区| 综合色小说 | 国产又粗又猛又爽又黄91精品 | 熟女人妇 成熟妇女系列视频 | 在线观看av网站 | 草久视频在线观看 | 久久婷婷久久 | 亚洲一区 中文字幕 | 国产精品久久久久影院色老大 | 国产学生美女无遮拦高潮视频 | 欧美精品国产一区 | www.haoav| 打开免费观看视频在线播放 | 少妇人妻互换不带套 | 国产精品久久久一区二区 | 中国白嫩丰满人妻videos | 成年人网站免费在线观看 | 懂色av一区二区三区蜜臀 | 国产欧美日本在线 | 国产亚洲AV无码成人网站在线 | 亚洲欧美日韩一区二区三区在线观看 | 亚洲三级图片 | 狠狠插综合 | 在线h片| 欧美激情偷拍 | 日本bdsm视频| 又爽av| 日本三级韩国三级美三级91 | 中文字幕欧美另类精品亚洲 | 日韩精品h| 91欧美一区 | 黄色高清视频在线观看 | 午夜视频h | 欧美特级黄 | 黄色免费一级视频 | 台湾佬美性中文 | 一级黄色性生活视频 | 免费在线不卡av | 国产免费一级 | 秋霞av一区二区三区 | 成人你懂的 | 国产精品普通话 | 处女朱莉 | 国产在线视频一区二区 | av电影在线不卡 | 91在线无精精品入口 | 黄色国产视频 | 国产精品一区二区三区四区在线观看 | 91男女视频| 九九九九九九精品 | 亚洲黄v| 亚洲精品久久久久久国 | 日韩亚洲欧美综合 | 国产精品久久77777 | 亚洲 欧美 激情 另类 校园 | 18久久久 | 波多野结衣欲乱上班族 | 一个色综合网 | 久久九九国产视频 | 国产传媒欧美日韩 | 成人a网站 | 久久成人福利视频 | free黑人多人性派对hd | 欧美日韩国产精品一区二区 | 精品亚洲永久免费精品 | 18+视频在线观看 | 欧美黄色一级网站 | 97麻豆| 综合久色 | 四虎4hu永久免费网站影院 | 国产精品久久在线 | 欧美精品第二页 | 欧美日韩一级黄色片 | 日韩免费视频网站 | 免费在线观看黄网站 | 日日摸夜夜添狠狠添欧美 | 黄色va| 亚洲情在线 | 成人免费午夜视频 | 中文字幕88 | 美女精品在线 | 泰国午夜理伦三级 | 在线观看中文字幕一区 | 美国一区二区 | 非洲黑寡妇性猛交视频 | 欧美 在线 | 操碰视频 | 狠狠躁夜夜躁人人爽天天高潮 | 国产精品电影网站 | 国产在线黄色 | 亚洲成a人无码 | 天天色婷婷 | 一级做a爰片毛片 | 成年人午夜网站 | 伊人网av在线 | 精品国产精品国产偷麻豆 | 99热官网| 精品无码久久久久久久久久 | 欧美色涩在线第一页 |