Direct3D客户端游戏开发本章要点:Direct3D客户端游戏开发纹理包装纹理压缩纹理包装纹理包装(TextureWrapping),决定了如何在纹理坐标之间作插值计算,即纹理多边形的光栅化方式。使用纹理包装时,Direct3D通常把纹理视为一个二维的平面,假设0.0与1.0重合,Direct3D将在纹理范围内找出点a到b之间的最短路径,并在其中插入新的图素。Direct3D纹理Direct3D游戏开发a(0.6,1.0)(1.0,0.0)b(0.1,0.1)(0.0,1.0)纹理包装下图表示在默认的纹理包装方式下,点a的(u,v)位置为(0.6,1.0)、点b为(0.1,0.1)的插值线:Direct3D纹理Direct3D游戏开发a(0.8,0.8)(1.0,0.0)b(0.2,0.2)(0.0,1.0)纹理包装下图表示启用了u方向上的纹理包装,点a和点b之间的插值线:Direct3D纹理Direct3D游戏开发纹理包装启用u方向的纹理包装,Direct3D会把纹理视为u方向环绕在一个圆柱体上而包装起来。这样,ab间最短路径的插值计算就不再穿越纹理中部,而是穿越纹理的边框,即0.0或1.0所在的位置。Direct3D纹理Direct3D游戏开发a(0.6,1.0)b(0.1,0.1)(0.0,0.0)或(1.0,0.0)纹理包装启用u方向的纹理包装图示:Direct3D纹理Direct3D游戏开发纹理包装启用v方向的纹理包装与前同理,只不过变成了一个横着放置的圆柱体。下图表示启用了v方向上的纹理包装,点a和点b之间的插值线:a(0.8,0.8)(1.0,0.0)b(0.2,0.2)(0.0,1.0)Direct3D纹理Direct3D游戏开发纹理包装启用纹理包装,通过D3DRS_WRAPx来设置渲染状态,其中x为要设置的多层纹理序号(从0∼7)。要启用某个方向上的纹理包装,必须包含表示u方向的D3DWRAP_U或表示v方向的D3DWRAP_V。同时在u和v方向上都进行纹理包装时,可以把纹理想像成一个环形。例如,为了把一张纹理包装到一个球体上时,就需要在两个方向上同时进行纹理包装。Direct3D纹理Direct3D游戏开发纹理包装同时在u和v方向上都进行纹理包装,可以使用下面的函数:g_pD3DDevice-SetRenderState(D3DRS_WRAP0,D3DWRAP_U|D3DWRAP_V);注意:当使用了纹理包装后,纹理坐标的取值被限定在了0.0∼1.0的范围内,超出范围的纹理坐标值将成为无效值。因此,纹理包装和纹理寻址不能同时使用。Direct3D纹理Direct3D游戏开发DXT纹理压缩纹理越精细,其纹理所占的内存空间就越大。如果想要使用高质量的纹理,又要保证系统的运行效率,使用纹理压缩就是一种有用且必要的手段。Direct3D支持纹理的压缩和实时解压,即DXT纹理压缩。Direct3D提供了五种DXT纹理压缩的方式,从D3DFMT_DXT1、D3DFMT_DXT2到D3DFMT_DXT5。Direct3D纹理Direct3D游戏开发D3DFMT_DXT1格式支持15位RGB和1位Alpha图形格式,即D3DFMT_A1R5G5B5的图形格式。这种格式的压缩比是4:1。(4×4块16位的RGBA纹理元素可以被压缩为64位:2个16位的RGBA值和16个2位索引)这样的压缩比不是很高,但是已经足以有效的把3D加速卡用于存储纹理的容量提高4倍。DXT纹理压缩D3DFMT_DXT2、D3DFMT_DXT3支持的是12位RGB和4位Alpha,即D3DFMT_A4R4G4B4。Direct3D纹理Direct3D游戏开发DXT纹理压缩D3DFMT_DXT4和D3DFMT_DXT5采用线性插值的方法来生成Alpha透明。与JPEG等其他图形文件的压缩方式相比,DXT纹理压缩的优点有:每个4×4的纹理元素块都可以进行压缩。每个压缩块的大小都相等。解压缩算法的速度很快。Direct3D纹理Direct3D游戏开发使用DXT压缩:1.确定当前显卡设备是否支持某种压缩格式:g_pD3DDevice-CheckDeviceFormat(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_A1R5G5B5,0,D3DRTYPE_TEXTURE,D3DFMT_DXT1);表示查询显卡是否支持D3DFMT_DXT1纹理压缩模式。DXT纹理压缩Direct3D纹理Direct3D游戏开发使用DXT压缩:2.生成某种特定格式的压缩纹理:LPDIRECT3DTEXTURE9g_pTexture=NULL;D3DXCreateTextureFromFileEx(g_pd3dDevice,“brick.jpg”,512,512,5,0,D3DFMT_X8R8G8B8,D3DPOOL_DEFAULT,D3DX_DEFAULT,D3DX_DEFAULT,0xFF000000,0,0,&g_pTexture);表示从磁盘文件中生成一个D3DFMT_DXT5的多级压缩纹理。DXT纹理压缩Direct3D纹理Direct3D游戏开发HRESULTD3DXCreateTextureFromFileEx(LPDIRECT3DDEVICE9pDevice,//调入是IDirect3DDevice9对象指针LPCTSTRpSrcFile,//文件名UINTWidth,//图像的宽UINTHeight,//图像的长UINTMipLevels,//图片的图层,一般用D3DX_DEFAULT,但也用1的DWORDUsage,//设定这个纹理的使用方法,这个参数可以是0,//D3DUSAGE_RENDERTARGET,和//D3DUSAGE_DYNAMIC。一般用的是0,也可以使用D3DUSAGE_DYNAMIC,//这样可以动态改变纹理中的数据。如果纹理不需要动态性改变,就不需要设定这//个参数为D3DUSAGE_DYNAMIC。D3DFORMATFormat,//纹理的格式,可以自己定义,也可以直接定义为D3DFMT_UNKNOWN,让程序//在载入图像文件时定义象素深度D3DPOOLPool,//这是如何管理这些纹理,一般使用D3DPOOL_MANAGEDDWORDFilter,//图像像素的过滤方式DWORDMipFilter,//MIP的像素过滤方式D3DCOLORColorKey,//透明色,设定这个颜色,在显示时,这图像中的这个颜色将忽略D3DXIMAGE_INFO*pSrcInfo,//记录载入图片信息PALETTEENTRY*pPalette,//记录调色板信息LPDIRECT3DTEXTURE9*ppTexture//用来储存载入图片的纹理对象实例);在上次的公告板中,调用为:D3DXCreateTextureFromFileEx(Device,Billboard.bmp,D3DX_DEFAULT,D3DX_DEFAULT,D3DX_DEFAULT,0,D3DFMT_A1R5G5B5,D3DPOOL_MANAGED,D3DX_FILTER_TRIANGLE,D3DX_FILTER_TRIANGLE,D3DCOLOR_RGBA(0,0,0,255),NULL,NULL,&BillboardTexture);在这里,关键颜色值为D3DFMT_A1R5G5B5(就是RGB都少于5的颜色),将载入的图片里面的关键颜色值设置为透明色.只要在画时加上Device-SetRenderState(D3DRS_ALPHATESTENABLE,TRUE);//启用alpha测试就可以让指定的颜色透明。在公告和粒子系统中可能常用到这个函数。1.纹理包装和纹理寻址可以同时使用。()2.默认的纹理包装方式为线性纹理包装。()3.纹理包装在u和v方向上可以同时使用。()4.DXT纹理压缩方式为D3DFMT_DXTx。()5.D3DFMT_DXT1的压缩比为8:1。()课堂练习:(判断题)Direct3D纹理Direct3D游戏开发1.纹理包装和纹理寻址可以同时使用。(F)2.默认的纹理包装方式为线性纹理包装。(T)3.纹理包装在u和v方向上可以同时使用。(T)4.DXT纹理压缩方式为D3DFMT_DXTx。(T)5.D3DFMT_DXT1的压缩比为8:1。(F)课堂练习:(判断题答案)Direct3D纹理Direct3D游戏开发小结:纹理包装和DXT纹理压缩的概念纹理包装u,v方向的纹理插值计算纹理压缩Direct3D纹理Direct3D游戏开发课后作业:1.画出在v方向上进行纹理包装的圆柱体。2.试写出DXT纹理压缩的5种方式。3.总结DXT纹理压缩的优点。Direct3D纹理Direct3D游戏开发