VTK修炼之道63:纹理映射体绘制_二维纹理映射
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道63:纹理映射体绘制_二维纹理映射
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1.紋理映射體繪制
基于軟件實(shí)現(xiàn)的光線投影體繪制算法計(jì)算量非常大,不利于進(jìn)行實(shí)時(shí)渲染。因此,目前體繪制經(jīng)常使用圖形硬件利用紋理映射來(lái)加速。 其主要原理是將三維體數(shù)據(jù)作為紋理裝載入硬件緩存中,利用硬件來(lái)實(shí)現(xiàn)插值以及圖像合成操作,以提高繪制效率。 基于圖形硬件三維紋理功能的體繪制技術(shù),主要是利用硬件的三線性過(guò)濾插值能力,通過(guò)渲染多個(gè)與視線垂直的面片來(lái)重建整個(gè)三維結(jié)構(gòu)。每個(gè)面片利用三維紋理來(lái)決定顏色和透明度。這種方法得到的效果從本質(zhì)上講與光線投影的效果相同。最新的方法可以直接利用三維紋理在圖形硬件上實(shí)現(xiàn)光線投影的算法。2.二維紋理映射
早期受到硬件技術(shù)的限制,顯卡只能支持二維紋理映射。其基本思路是將每個(gè)坐標(biāo)軸方向的切片作為二維紋理保存到圖形硬件緩沖中,在光線投影時(shí),選擇與當(dāng)前視線方向垂直的一組紋理圖像,在硬件中進(jìn)行插值和合成運(yùn)算以實(shí)現(xiàn)體繪制。 VTK中的vtkVolumeTextureMapper2D類可用于實(shí)現(xiàn)基于二維紋理映射的體繪制方法。 具體代碼如下所示: #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 <vtkVolumeTextureMapper2D.h> #include <vtkColorTransferFunction.h> #include <vtkPiecewiseFunction.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkVolumeProperty.h> #include <vtkVolumeRayCastIsosurfaceFunction.h>int main(int argc, char *argv[]) {vtkSmartPointer<vtkStructuredPointsReader> reader =vtkSmartPointer<vtkStructuredPointsReader>::New();reader->SetFileName("mummy.128.vtk");reader->Update();vtkSmartPointer<vtkVolumeTextureMapper2D> volumeMapper =vtkSmartPointer<vtkVolumeTextureMapper2D>::New();volumeMapper->SetInputData(reader->GetOutput());;/*************************************************************************/vtkSmartPointer<vtkVolumeProperty> volumeProperty =vtkSmartPointer<vtkVolumeProperty>::New();volumeProperty->SetInterpolationTypeToLinear();volumeProperty->ShadeOn(); //打開(kāi)或者關(guān)閉陰影測(cè)試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ù)//設(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(480, 480);rw->Render();rw->SetWindowName("VolumeRendering by Texture2D");vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();rwi->SetRenderWindow(rw);ren->ResetCamera();rw->Render();rwi->Start();return 0; }輸出結(jié)果圖像為: 通過(guò)對(duì)比2D紋理體繪制程序與光線投影法體繪制程序,會(huì)發(fā)現(xiàn)兩者基本是一樣的,僅僅是vtkVolumeMapper不同。這充分證明了VTK體渲染管線的易用性與通用性。當(dāng)從一種體繪制方法變換到另一種時(shí),只需要更換相應(yīng)的vtkVolumeMapper即可。3.vtkVolumeTexture2D類說(shuō)明
vtkVolumeTexture2D勒種有兩個(gè)重要的函數(shù):- SetTargetTextureSize(int _ arg1, int _arg2);該函數(shù)用于設(shè)置紋理圖像的大小 默認(rèn)為512*512。其大小必須為2的冪。
- SetMaximumNumberOfPlanes(int _arg);該函數(shù)用于設(shè)置紋理映射的平面數(shù)目。當(dāng)視線垂直方向上的像素?cái)?shù)目大于該值時(shí),平面會(huì)自動(dòng)跳躍進(jìn)行合理的映射。
4.與光線投影體繪制算法的對(duì)比
基于二維紋理映射的體繪制渲染速度要優(yōu)于光線投影體繪制。 但是vtkVolumeTexture2D僅支持Alpha合成技術(shù),并且切片上使用雙線性插值實(shí)現(xiàn)紋理映射,為切片之間不進(jìn)行任何處理,因此,該方法的體繪制渲染效果是低于光線投影算法的。 此外該方法需要在三個(gè)方向上保存相應(yīng)的紋理圖像堆棧,占用內(nèi)存也比較大。 還有一點(diǎn)需要注意的就是,該方法在渲染過(guò)程中會(huì)根據(jù)視線方向選擇當(dāng)前最垂直(會(huì)是最優(yōu)嗎?)的一組紋理,因此在進(jìn)行兩組紋理切換時(shí),會(huì)長(zhǎng)生瑕疵,從而造成渲染質(zhì)量的下降。5.參看資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3. ?張曉東, 羅火靈. VTK圖形圖像開(kāi)發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.
總結(jié)
以上是生活随笔為你收集整理的VTK修炼之道63:纹理映射体绘制_二维纹理映射的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 新浪uc2010免费下载
- 下一篇: VTK修炼之道64:纹理映射体绘制_三维