VTK笔记

您所在的位置:网站首页 抖音安妮的原名叫什么 VTK笔记

VTK笔记

2024-06-30 07:31| 来源: 网络整理| 查看: 265

纹理贴图

  计算机图形学中的纹理既包括通常意义上物体表面的纹理即使物体表面呈现凹凸不平的沟纹,同时也包括在物体的光滑表面上的彩色图案,通常我们更多地称之为花纹。对于花纹而言,就是在物体表面绘出彩色花纹或图案,产生了纹理后的物体表面依然光滑如故。对于沟纹而言,实际上也是要在表面绘出彩色花纹或图案,同时要求视觉上给人以凹凸不平感即可。 凹凸不平的图案一般是不规则的。在计算机图形学中,这两种类型的纹理的生成方法完全一致, 这也是计算机图形学中把他们统称为纹理的原因所在。 所以纹理映射就是在物体的表面上绘制彩色的图案。   在三维图像世界中表示物体表面细节的一幅或几幅二维图形,也称纹理贴图(texture mapping),当把纹理按照特定的方式映射到物体表面上的时候能使物体看上去更加真实。纹理映射是一种允许我们为三角形赋予图像数据的技术,能够更细腻更真实地表现渲染场景。   在计算机图形学中,纹理贴图是使用图像、函数或其他数据源来改变物体表面外观的技术。   可以使用凹凸纹理在光滑的球上,呈现出凹凸不平的球的效果; 在这里插入图片描述   3D图形学(4):纹理贴图中详细介绍了3D图像学中纹理的生成原理,以及常用的几种纹理贴图方案;   《VTK图形图像开发进阶》中在2.2.4节讲到“其原理是渲染时把二维的图像贴到物体的表面上,根据二维图像渲染出丰富多彩的效果,所以纹理映射也被叫做纹理贴图”;纹理贴图的三个要素是:待贴图的表面、纹理映射以及纹理坐标(控制纹理图在面上的位置);

vtkTexture

在这里插入图片描述   vtkTexture是一种处理纹理贴图加载和与图像绑定的算法类,从输入图像数据集类型中获取数据。用户可以创建可视化管道来读取、处理和构造纹理。需要注意的是只有定义了纹理坐标并且渲染系统支持纹理时,纹理才会工作。   vtkTexture的实例通过actor的SetTexture()方法与actor关联。多个actor可以共享纹理贴图(节省内存资源)。   注意:   当前仅支持二维纹理贴图,即使数据管道支持1、2和三维纹理坐标。   一些渲染器(如旧的OpenGL)要求纹理贴图尺寸在每个方向上为2的幂。如果使用非二次幂纹理贴图,则会在一个或多个方向上自动将其重采样为二次幂,而代价是昂贵的计算。如果OpenGL实现足够新(OpenGL>=2.0或存在扩展GL_ARB_texture_non_power_of_two),则没有此类限制,也没有额外的计算成本。

接口 线性插值开关

  用于控制在纹理映射时,是否进行线性插值;

vtkGetMacro(Interpolate, vtkTypeBool); vtkSetMacro(Interpolate, vtkTypeBool); vtkBooleanMacro(Interpolate, vtkTypeBool); mipmap开关

  MIP map(有时候拼写成mipmap)是一种电脑图形图像技术,用于在三维图像的二维代替物中达到立体感效应。MIP map技术与材质贴图技术结合,根据距观看者远近距离的不同,以不同的分辨率将单一的材质贴图以多重图像的形式表现出来并代表平面纹理:尺寸最大的图像放在前面显著的位置,而相对较小的图像则后退到背景区域。每一个不同的尺寸等级定义成一个MIP map水平。MIP map技术帮助避免了不想要的锯齿边缘(称为锯齿状图形)在图像中出现,这种锯齿状图形可能是由于在不同分辨率下使用bit map图像产生的。

vtkGetMacro(Mipmap, bool); vtkSetMacro(Mipmap, bool); vtkBooleanMacro(Mipmap, bool); 示例 墙角

  具体步骤:     1.读入一张jpeg的二维图像作为纹理图textureFile;     2.定义一个纹理vtkTexture类的对象atext,将textureFile的输出放入atext的输入中,作为它即将贴到平面上的一个纹理图;     3.定义一个vtkPlaneSource对象plane,类vtkPlaneSource可以生成一个平面,也就是纹理图要贴图的地方。     4.定义一个vtkActor对象planeActor,将plane对应的vtkPolyDataMapper设置到其中,通过SetTexture方法设定atext为该演员的纹理;

vtkNew readerFactory; vtkSmartPointer textureFile; textureFile.TakeReference(readerFactory->CreateImageReader2("G:\\Data\\texture.jpg")); textureFile->SetFileName("G:\\Data\\texture.jpg"); textureFile->Update(); vtkNew atext; atext->SetInputConnection(textureFile->GetOutputPort()); atext->InterpolateOn(); // Create a plane source and actor. The vtkPlanesSource generates // texture coordinates. vtkNew plane; vtkNew planeMapper; planeMapper->SetInputConnection(plane->GetOutputPort()); vtkNew planeActor; planeActor->SetMapper(planeMapper); planeActor->SetTexture(atext); // Create the RenderWindow, Renderer and both Actors vtkNew colors; vtkNew renderer; vtkNew renWin; renWin->AddRenderer(renderer); vtkNew iren; iren->SetRenderWindow(renWin); // Add the actors to the renderer, set the background and size renderer->AddActor(planeActor); renderer->SetBackground(colors->GetColor3d("DarkSlateGray").GetData()); renWin->SetSize(640, 480); renWin->SetWindowName("TexturePlane"); // render the image renWin->Render(); renderer->ResetCamera(); renderer->GetActiveCamera()->Elevation(-30); renderer->GetActiveCamera()->Roll(-20); renderer->ResetCameraClippingRange(); renWin->Render(); iren->Start();

在这里插入图片描述 在这里插入图片描述

在这里插入图片描述   vtkPlaneSource在创建平面的同时自动产生了纹理坐标,可以用下面的代码将坐标输出;可以看到plane平面的坐标和实际坐标的对应关系;

vtkNew plane; plane->Update(); double a[3] = { 0 }; cout cout 0 }; cout cout std::cout


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3