清华大学DirectX游戏编程第7章(全20章).ppt_第1页
清华大学DirectX游戏编程第7章(全20章).ppt_第2页
清华大学DirectX游戏编程第7章(全20章).ppt_第3页
清华大学DirectX游戏编程第7章(全20章).ppt_第4页
清华大学DirectX游戏编程第7章(全20章).ppt_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2,第7章 纹理,纹理映射是将指定的图像信息映射到三角形上的技术,纹理映射技术可以显著地增强场景的细节表现和真实感。 Direct3D中使用IDirect3DTexture9接口代表一个纹理。纹理是类似于表面缓冲区的像素矩阵,但是纹理可以映射到三角形上。 主要目标: 学习如何将纹理的部分内容映射到三角形上。 学习如何创建纹理。 学习如何使用纹理过滤来生成一个更加平滑的图像。,3,7.1 纹 理 坐 标,Direct3D使用的纹理坐标系统是由水平方向的u轴和垂直方向的v轴组成的。 注意纹理坐标系统中u轴和v轴的指向,其中v轴指向下方(见图7.2)。 对任何的三维空间的三角形,都需要在纹理中找到一

2、个对应的三角形,这个平面三角形上的纹素将映射到三维空间的三角形上。,4,7.1 纹 理 坐 标,例如在图7.3中,左边是三维空间中的一个三角形,右边是纹理上定义的一个平面三角形,这个平面三角形就是将要映射到三维三角形上的纹理。 为了完成这种映射,需要再次改变顶点结构:将一对纹理坐标值添加到顶点结构中,用于指定这个顶点在纹理图片上的位置: struct Vertex float _x, _y, _z; float _nx, _ny, _nz; float _u, _v; / 纹理坐标 static const DWORD FVF; ; const DWORD Vertex:FVF = D3DFV

3、F_XYZ | D3DFVF_NORMAL | D3DFVF_TEX1;,5,7.2 创建并应用纹理,通常是从存放在磁盘中的图片文件中获取纹理数据,然后加载到IDirect3DTexture9对象中,可以通过下面的D3DX函数完成该步骤: HRESULT D3DXCreateTextureFromFile( LPDIRECT3DDEVICE9 pDevice, / 创建纹理的设备 LPCSTR pSrcFile, / 加载图片的文件名 LPDIRECT3DTEXTURE9 *ppTexture / 代表纹理接口的指针 ); 该函数可以加载下列格式的图片即BMP、DDS、DIB、JPG、PGN和

4、TGA。,6,7.2 创建并应用纹理,如果要将指定纹理设定为当前纹理,可使用SetTexture函数: HRESULT IDirect3DDevice9:SetTexture( DWORD Stage, / 07 中的一个数,指定纹理阶段 IDirect3DBaseTexture9 *pTexture / 要设置的纹理指针 ); 如果三角形要使用不同的纹理,可以参照以下代码来实现: Device-SetTexture(0, _tex0); drawTrisUsingTex0(); Device-SetTexture(0, _tex1); drawTrisUsingTex1();,7,7.3 纹

5、 理 过 滤,当纹理三角形比屏幕三角形小时,需要将纹理三角形放大;当纹理三角形比屏幕三角形大的时候,纹理三角形需要缩小。这两种情况下都会出现失真。过滤就是Direct3D用来减少这种失真现象的技术。 Direct3D支持三种过滤方法,每种方法提供了不同的过滤品质。 纹理过滤用IDirect3DDevice9:SetSamplerState方法进行设置。 最近点取样方法,该方法为默认的过滤方法。 线性纹理过滤 各向异性纹理过滤,8,7.4 多纹理映射,创建多纹理映射链实质就是为纹理创建一系列具有不同分辨率的纹理,并预先指定小分辨率纹理的过滤级别,这样才能保持纹理细节,如图7.4所示。,9,7.4

6、.1 多纹理映射过滤,多纹理映射过滤是用于控制Direct3D如何使用多纹理映射的技术,可以像下面的代码这样来设置多纹理映射过滤: Device-SetSamplerState(0, D3DSAMP_MIPFILTER, Filter); 通过设置Filter参数为不同的标志,可以获得三个可选的过滤方法: D3DTEXF_NONE表示关闭多纹理映射。 D3DTEXF_POINT表示Direct3D将选择最接近屏幕三角形大小的一级纹理。 D3DTEXF_LINEAR表示Direct3D将选择两个最接近屏幕三角形大小的纹理级别,10,7.4.2 在Direct3D中使用多纹理映射,在Direct3

7、D中使用多纹理映射是相当容易的,如果设备支持多纹理映射,通过使用D3DXCreateTextureFromFile函数将创建一个多纹理映射链。 另外,Direct3D将会自动选择最适合屏幕三角形大小的一级纹理。 由此可见,使用多纹理映射是十分方便的,因为大部分工作都是由Direct3D自动完成的。,11,7.5 纹理坐标寻址模式,纹理坐标超过这个范围后的行为由Direct3D寻址类型来决定。Direct3D中的寻址类型主要有四种:纹理缠绕、边框颜色、纹理夹持和镜像纹理,图7.56.8分别是这些不同纹理寻址模式的效果。,12,7.5 纹理坐标寻址模式,在效果图中,四边形的四个顶点纹理坐标被指定为

8、(0, 0),(0, 3),(3, 0)和(3, 3)。在u和v方向上的坐标值都被扩展为标准坐标范围的3倍,所以效果图就被划分为33的区域矩阵。如果想在四边形上绑定55的纹理贴图,可以指定纹理寻址模式为纹理缠绕模式,并将纹理坐标指定为(0, 0),(0, 5),(5, 0)和(5, 5)。 下面的代码示范了如何设置4种不同的纹理寻址模式: 参见教材P115,13,7.6 程序示例:带纹理的四边形,该示例说明如何在一个四边形上贴上纹理图片,以及如何设置纹理过滤(见图7.9)。如果设备支持多纹理映射,D3DXCreateTextureFromFile函数会自动地创建多纹理映射链。,14,7.6 程

9、序示例:带纹理的四边形,要给场景添加纹理,需要完成如下步骤。 (1)构造带纹理坐标的物体顶点。 (2)用D3DXCreateTextureFromFile函数给IDirect3DTexture9接口加载纹理。 (3)设置缩小、放大和多纹理映射过滤模式。 (4)在渲染物体前,用IDirect3Ddevice9:SetTexture方法设置和这个物体相关的纹理。,15,7.6 程序示例:带纹理的四边形,Setup函数比较容易,首先通过使用两个带有纹理坐标的三角形来构成四边形;然后把位图文件dx5_logo.bmp加载到IDirect3DTexture9接口中;接下来使用SetTexture方法设置

10、所要使用的纹理;最后设置纹理过滤模式为线性过滤模式,并设置多纹理映射过滤模式为D3DTEXF_POINT。 具体代码如下: 参见教材P117,16,7.6 程序示例:带纹理的四边形,现在可以像平常一样渲染四边形,它已经和当前所使用的纹理建立了映射关系: 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-Present(0, 0, 0, 0); return true; ,17,7.7 小 结,纹理坐标用于定

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论