纹理映射是创建逼真效果的强大的图形工具,其原理是吧二维的图像贴到物体的表面上面去。根据二维图像渲染出丰富多彩的效果,所以也叫纹理贴图。纹理映射需要三个要素:待贴图的表面,纹理映射以及纹理坐标。其中纹理映射在VTK中就是vtkImageData的数据集。而纹理坐标则用于控制纹理图在表面的位置。
效果预览
实现步骤
- 首先读入一张JPEG的二维纹理图
- 定义一个纹理类vtkTexture对象
- 吧读入的JPEG输入到vtkTexture中去。
- 定义一个planeSouuce对象,然后将贴图贴到plane上面去
- 生成一个平面放入到场景中去
关键步骤
// 创建一个vtkJPEGReader的智能指针
vtkSmartPointer< vtkJPEGReader > reader =
vtkSmartPointer< vtkJPEGReader >::New();
reader->SetFileName(argv[1]);
//创建一个材质对象
vtkSmartPointer< vtkTexture > texture =
vtkSmartPointer< vtkTexture >::New();
texture->SetInputConnection(reader->GetOutputPort());
texture->InterpolateOn();
// 给模型添加材质
actor->SetTexture(texture);
代码实现
#include <vtkSmartPointer.h>
#include <vtkJPEGReader.h>
#include <vtkTexture.h>
#include <vtkPlaneSource.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>
#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
int main(int argc, char* argv[])
{
if (argc < 2)
{
std::cout << argv[0] << " " << "TextureFile(*.jpg)" << std::endl;
return EXIT_FAILURE;
}
vtkSmartPointer< vtkJPEGReader > reader =
vtkSmartPointer< vtkJPEGReader >::New();
reader->SetFileName(argv[1]);
vtkSmartPointer< vtkTexture > texture =
vtkSmartPointer< vtkTexture >::New();
texture->SetInputConnection(reader->GetOutputPort());
texture->InterpolateOn();
vtkSmartPointer< vtkPlaneSource > plane =
vtkSmartPointer< vtkPlaneSource >::New();
vtkSmartPointer< vtkPolyDataMapper > mapper =
vtkSmartPointer< vtkPolyDataMapper >::New();
mapper->SetInputConnection(plane->GetOutputPort());
vtkSmartPointer< vtkActor > actor =
vtkSmartPointer< vtkActor >::New();
actor->SetMapper(mapper);
actor->SetTexture(texture);
vtkSmartPointer<vtkRenderer> renderer =
vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetBackground(1.0, 1.0, 1.0);
vtkSmartPointer<vtkRenderWindow> renWin =
vtkSmartPointer<vtkRenderWindow>::New();
renWin->AddRenderer(renderer);
renWin->SetSize(640, 480);
renWin->Render();
renWin->SetWindowName("TextureExample");
vtkSmartPointer<vtkRenderWindowInteractor> iren =
vtkSmartPointer<vtkRenderWindowInteractor>::New();
iren->SetRenderWindow(renWin);
iren->Initialize();
iren->Start();
return EXIT_SUCCESS;
}