《清华大学DirectX游戏编程第7章(全20章).ppt》由会员分享,可在线阅读,更多相关《清华大学DirectX游戏编程第7章(全20章).ppt(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第7章 纹理 纹理映射是将指定的图像信息映射到三角形上纹理映射是将指定的图像信息映射到三角形上的技术,纹理映射技术可以显著地增强场景的的技术,纹理映射技术可以显著地增强场景的细节表现和真实感。细节表现和真实感。Direct3D中使用中使用IDirect3DTexture9接口代表接口代表一个纹理。纹理是类似于表面缓冲区的像素矩一个纹理。纹理是类似于表面缓冲区的像素矩阵,但是纹理可以映射到三角形上。阵,但是纹理可以映射到三角形上。主要目标:学习如何将纹理的部分内容映射到三角形上。学习如何创建纹理。学习如何使用纹理过滤来生成一个更加平滑的图像。27.1 纹 理 坐 标Direct3D使用的纹理坐标
2、系统使用的纹理坐标系统是由水平方向的是由水平方向的u轴和垂直方向轴和垂直方向的的v轴组成的。轴组成的。注意纹理坐标系统中注意纹理坐标系统中u轴和轴和v轴轴的指向,其中的指向,其中v轴指向下方轴指向下方(见见图图7.2)。对任何的三维空间的三角形,对任何的三维空间的三角形,都需要在纹理中找到一个对应都需要在纹理中找到一个对应的三角形,这个平面三角形上的三角形,这个平面三角形上的纹素将映射到三维空间的三的纹素将映射到三维空间的三角形上。角形上。37.1 纹 理 坐 标例如在图例如在图7.3中,左边是三维空间中的一个三角形,右边是纹理中,左边是三维空间中的一个三角形,右边是纹理上定义的一个平面三角形
3、,这个平面三角形就是将要映射到三上定义的一个平面三角形,这个平面三角形就是将要映射到三维三角形上的纹理。维三角形上的纹理。为了完成这种映射,需要再次改变顶点结构:将一对纹理坐标为了完成这种映射,需要再次改变顶点结构:将一对纹理坐标值添加到顶点结构中,用于指定这个顶点在纹理图片上的位置:值添加到顶点结构中,用于指定这个顶点在纹理图片上的位置:struct Vertexfloat _x,_y,_z;float _nx,_ny,_nz;float _u,_v;/纹理坐标static const DWORD FVF;const DWORD Vertex:FVF=D3DFVF_XYZ|D3DFVF_NO
4、RMAL|D3DFVF_TEX1;47.2 创建并应用纹理通常是从存放在磁盘中的图片文件中获取纹理数据,通常是从存放在磁盘中的图片文件中获取纹理数据,然后加载到然后加载到IDirect3DTexture9对象中,可以通过下对象中,可以通过下面的面的D3DX函数完成该步骤:函数完成该步骤:HRESULT D3DXCreateTextureFromFile(LPDIRECT3DDEVICE9 pDevice,/创建纹理的设备 LPCSTR pSrcFile,/加载图片的文件名 LPDIRECT3DTEXTURE9*ppTexture/代表纹理接口的指针);该函数可以加载下列格式的图片该函数可以加载
5、下列格式的图片即即BMP、DDS、DIB、JPG、PGN和和TGA。57.2 创建并应用纹理如果要将指定纹理设定为当前纹理,可使用如果要将指定纹理设定为当前纹理,可使用SetTexture函数:函数:HRESULT IDirect3DDevice9:SetTexture(DWORD Stage,/07 中的一个数,指定纹理阶段 IDirect3DBaseTexture9*pTexture/要设置的纹理指针);如果三角形要使用不同的纹理,可以参照以下代码来如果三角形要使用不同的纹理,可以参照以下代码来实现:实现:Device-SetTexture(0,_tex0);drawTrisUsingTe
6、x0();Device-SetTexture(0,_tex1);drawTrisUsingTex1();67.3 纹 理 过 滤当纹理三角形比屏幕三角形小时,需要将纹理三角形当纹理三角形比屏幕三角形小时,需要将纹理三角形放大;当纹理三角形比屏幕三角形大的时候,纹理三放大;当纹理三角形比屏幕三角形大的时候,纹理三角形需要缩小。这两种情况下都会出现失真。过滤就角形需要缩小。这两种情况下都会出现失真。过滤就是是Direct3D用来减少这种失真现象的技术。用来减少这种失真现象的技术。Direct3D支持三种过滤方法,每种方法提供了不同的支持三种过滤方法,每种方法提供了不同的过滤品质。过滤品质。纹理过滤
7、用纹理过滤用IDirect3DDevice9:SetSamplerState方方法进行设置。法进行设置。最近点取样方法,该方法为默认的过滤方法。线性纹理过滤 各向异性纹理过滤 77.4 多纹理映射创建多纹理映射链实质就是为纹理创建一系列创建多纹理映射链实质就是为纹理创建一系列具有不同分辨率的纹理,并预先指定小分辨率具有不同分辨率的纹理,并预先指定小分辨率纹理的过滤级别,这样才能保持纹理细节,如纹理的过滤级别,这样才能保持纹理细节,如图图7.4所示。所示。87.4.1 多纹理映射过滤多纹理映射过滤是用于控制多纹理映射过滤是用于控制Direct3D如何使用如何使用多纹理映射的技术,可以像下面的代码
8、这样来多纹理映射的技术,可以像下面的代码这样来设置多纹理映射过滤:设置多纹理映射过滤:Device-SetSamplerState(0,D3DSAMP_MIPFILTER,Filter);通过设置通过设置Filter参数为不同的标志,可以获得三参数为不同的标志,可以获得三个可选的过滤方法:个可选的过滤方法:D3DTEXF_NONE表示关闭多纹理映射。D3DTEXF_POINT表示Direct3D将选择最接近屏幕三角形大小的一级纹理。D3DTEXF_LINEAR表示Direct3D将选择两个最接近屏幕三角形大小的纹理级别 97.4.2 在Direct3D中使用多纹理映射在在Direct3D中使用
9、多纹理映射是相当容易的,中使用多纹理映射是相当容易的,如果设备支持多纹理映射,通过使用如果设备支持多纹理映射,通过使用D3DXCreateTextureFromFile函数将创建一个函数将创建一个多纹理映射链。多纹理映射链。另外,另外,Direct3D将会自动选择最适合屏幕三角将会自动选择最适合屏幕三角形大小的一级纹理。形大小的一级纹理。由此可见,使用多纹理映射是十分方便的,因由此可见,使用多纹理映射是十分方便的,因为大部分工作都是由为大部分工作都是由Direct3D自动完成的。自动完成的。107.5 纹理坐标寻址模式纹理坐标超过这个范围后的行为由纹理坐标超过这个范围后的行为由Direct3D
10、寻寻址类型来决定。址类型来决定。Direct3D中的寻址类型主要有中的寻址类型主要有四种:纹理缠绕、边框颜色、纹理夹持和镜像四种:纹理缠绕、边框颜色、纹理夹持和镜像纹理,图纹理,图7.56.8分别是这些不同纹理寻址模式分别是这些不同纹理寻址模式的效果。的效果。117.5 纹理坐标寻址模式在效果图中,四边形的四个顶点纹理坐标被指在效果图中,四边形的四个顶点纹理坐标被指定为定为(0,0),(0,3),(3,0)和和(3,3)。在。在u和和v方向上的坐标值都被扩展为标准坐标范围的方向上的坐标值都被扩展为标准坐标范围的3倍,所以效果图就被划分为倍,所以效果图就被划分为33的区域矩阵。的区域矩阵。如果想
11、在四边形上绑定如果想在四边形上绑定55的纹理贴图,可以的纹理贴图,可以指定纹理寻址模式为纹理缠绕模式,并将纹理指定纹理寻址模式为纹理缠绕模式,并将纹理坐标指定为坐标指定为(0,0),(0,5),(5,0)和和(5,5)。下面的代码示范了如何设置下面的代码示范了如何设置4种不同的纹理寻种不同的纹理寻址模式:址模式:参见教材P115127.6 程序示例:带纹理的四边形该示例说明如何在一个四边形上贴上纹理图片,该示例说明如何在一个四边形上贴上纹理图片,以及如何设置纹理过滤以及如何设置纹理过滤(见图见图7.9)。如果设备支。如果设备支持多纹理映射,持多纹理映射,D3DXCreateTextureFro
12、mFile函数会自动地创建多纹理映射链。函数会自动地创建多纹理映射链。137.6 程序示例:带纹理的四边形要给场景添加纹理,需要完成如下步骤。要给场景添加纹理,需要完成如下步骤。(1)构造带纹理坐标的物体顶点。(2)用D3DXCreateTextureFromFile函数给IDirect3DTexture9接口加载纹理。(3)设置缩小、放大和多纹理映射过滤模式。(4)在渲染物体前,用IDirect3Ddevice9:SetTexture方法设置和这个物体相关的纹理。147.6 程序示例:带纹理的四边形Setup函数比较容易,首先通过使用两个带有函数比较容易,首先通过使用两个带有纹理坐标的三角形
13、来构成四边形;然后把位图纹理坐标的三角形来构成四边形;然后把位图文件文件dx5_logo.bmp加载到加载到IDirect3DTexture9接口中;接下来使用接口中;接下来使用SetTexture方法设置所要方法设置所要使用的纹理;最后设置纹理过滤模式为线性过使用的纹理;最后设置纹理过滤模式为线性过滤模式,并设置多纹理映射过滤模式为滤模式,并设置多纹理映射过滤模式为D3DTEXF_POINT。具体代码如下:具体代码如下:参见教材P117157.6 程序示例:带纹理的四边形现在可以像平常一样渲染四边形,它已经和当前所使用的纹理现在可以像平常一样渲染四边形,它已经和当前所使用的纹理建立了映射关系
14、:建立了映射关系:bool Display(float timeDelta)if(Device)Device-Clear(0,0,D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,0 xffffffff,1.0f,0);Device-BeginScene();Device-SetStreamSource(0,Quad,0,sizeof(Vertex);Device-SetFVF(Vertex:FVF);/用当前启用的纹理渲染图形Device-DrawPrimitive(D3DPT_TRIANGLELIST,0,2);Device-EndScene();Device-Presen
15、t(0,0,0,0);return true;167.7 小 结纹理坐标用于定义纹理图片上的三角形与三维纹理坐标用于定义纹理图片上的三角形与三维世界中的三角形之间的映射关系。通过世界中的三角形之间的映射关系。通过D3DXCreateTextureFromFile函数,用存放在函数,用存放在磁盘中的图片文件来创建纹理。可以通过指定磁盘中的图片文件来创建纹理。可以通过指定缩小、放大和多纹理映射过滤模式来过滤纹理。缩小、放大和多纹理映射过滤模式来过滤纹理。纹理寻址模式用于指定当纹理坐标超出纹理寻址模式用于指定当纹理坐标超出0,1的范围后的范围后Direct3D的处理方法。例如,应对纹的处理方法。例如,应对纹理设置镜像、夹持或者其他寻址模式。理设置镜像、夹持或者其他寻址模式。17