显示纹理

 ES显示纹理的原理和pc上的显示原理差不多,这里就不多讲了。。。我加载的模型是.x文件格式的。。只需将其各类坐标导出即可。。。放到相应类型的数组,以备使用。对于.x文件的格式,这里还是介绍一下,以免以后再去查:

X文件格式
AVS图像格式
以X为文件扩展名的文件是微软定义的文件格式.用来存放3D模型.  
X文件有文本和二进制两种存储形式.  
 
X文件内部结构如下:  
 
·Frame  
定义框架容器,用来装Mesh对象。可以包含多个Mesh对象,也可以包含子框架。在骨骼动画中可以装载一块骨骼,和一系列骨骼(如手臂),可以没有Mesh对象(表示骨骼时)。  
包括两部分:  
1、Mesh对象。  
2、转换矩阵,本地转换矩阵,初始化最初动作状态。  
 
FrameTransformMatrix  
定义框架的本地转换矩阵,是一个4X4矩阵(Matrix4x4类型),共16个浮点数据  
(注意这里的4X4矩阵是行主的)  
 
AnimationKey  
动画键,定义具体的动作数据,包括一系列旋转、移动、放缩、矩阵变换。  
包括三部分:  
1、动作键类型,包括旋转、移动、放缩、矩阵  
2、指示有几个键数值  
3、具体的键值列表(FloatKeys类型,包含时间值)  
 
AnimationSet  
动作组合,包括一个或多个动作(Animation)。每一个动作组合表示一个完整的动作  
 
FloatKeys  
定义浮点数组,它用来定义动作键数值。  
包括两部分:  
1、浮点值个数  
2、浮点值列表  
 
Coords2d  
定义纹理坐标向量,包括两个Float值,分别是 u、v 。  
 
ColorRGBA  
定义RGBA对象。包括四个Float值,分别是R、G、B、alpha  
 
ColorRGB  
定义RGB对象。包括三个Float值,分别是R、G、B  
 
Boolean2d  
二维Boolean类型,用来定义faceWrapvalues键值  
 
Boolean  
定义Boolean类型,0或1。  
 
IndexedColor  
索引颜色定义,包含两部分:1、索引号 2、RGB值  
 
·Material  
定义材质信息,可以被应用到一个完整的Mesh对象,也可以应用到其中的一个面。  
包含五部分:  
1、FaceColor,环境光,包括四个浮点值,其中有Alpha值  
2、Power,镜面反射的光泽度,控制亮点大小,一个浮点值  
3、specularcolor,镜面反射  
4、发射光  
 
·Matrix4x4  
定义四乘四矩阵,共16个值。  
 
Mesh  
定义一个Mesh对象。  
共有9个部分组成:  
1、包含的顶点数  
2、顶点列表,一个顶点包含三个浮点值  
3、面数  
4、面的顶点索引列表,每个面包含三个顶点  
5、MeshFaceWraps 结构,暂时无用  
6、MeshTextureCoords 纹理坐标,可选  
7、MeshNormals 法向,可选  
8、MeshVertexColors 顶点颜色,默认为白色  
9、MeshMaterialList 材质,不提供的话默认为白色  
 
MeshFace  
面索引,在Mesh结构中用于定义面索引  
包括两部分,1、面数 2、顶点索引构成的面数组  
 
·MeshFaceWraps  
暂时不用  
·MeshTextureCoords  
定义纹理坐标  
1、纹理坐标的个数  
2、纹理坐标,每个纹理坐标有两个浮点值  
 
·MeshMaterialList  
定义材质应用  
1、定义多少个材质被使用  
2、材质影响面的个数  
3、面索引  
 
·MeshNormals  
定义Mesh的法向量,包括四部分  
1、nNormals,法向量的个数=顶点数  
2、Normals,顶点法向量列表  
3、nFaceNormals,面的个数=面数  
4、FaceNormals,面对应的法向量  
 
·MeshVertexColors  
指定顶点的颜色代替原来的材质  
1、顶点数目  
2、颜色索引  
 
·Patch  
定义一个Bezier曲线控制面片  
· PatchMesh  
定义一个Bezier Patch定义的Mesh  
 
·Quaternion  
定义四元数  
 
·SkinWeights  
定义骨骼影响权重。  
包括以下几个部分:  
1、骨骼的名字  
2、有多少个权重值  
3、顶点的索引列表  
4、相对应的影响顶点索引列表  
5、本地转换矩阵,转换到骨骼空间  
 
·TextureFilename  
纹理的名称,字符串类型,加双引号如:“C://demo.dds”  
 
·TimedFloatKeys  
时间值,用于Animaterkey中定义时间间隔  
 
·Vector  
三维向量,三个浮点值  
 
·VertexDuplicationIndices  
保留副本,用于精简Mesh的操作  
1、顶点数  
2、原始顶点数,实际顶点数  
 
·XSkinMeshHeader  
描述被导出的SkinMesh相关信息  
1、影响一个顶点的最多变换数目  
2、影响每个面三个顶点的最大变换数目  
3、影响一个顶点的骨骼数
接下来需要做的就是,纹理图片的加载:

我使用的是N97 sdk,它里面有OpenGL 相关的例子,在例子里面有一个工具包,这里我们需要将这个包拿过来用用(别人写的,不用白布用。。。)。将需要贴图的图片放到inc里面,然后在inf文件加上这样一句话:

PRJ_EXPORTS

../inc/desk1.jpg ../release/winscw/udeb/z/private/E4E87DBF/desk1.jpg

意思是:在编译的时候,会在指定的位置拷贝这个图片

 

这样在程序中便可以动态的加载这个图片(用它工具包里的方法,现成的,,,不用自己写。。。)

_LIT(KDeskTexture, "desk1.jpg");
 iTextureManger->RequestToLoad(KDeskTexture, &iTexture);
 //Start to load the textures.
 iTextureManger->DoLoadL();

这段代码就是加载desk1这个图片。。。

 

在显示之前的初始工作也别忘了,代码这里就不给了。。。

主要是对于模型的顶点、面、法向量、纹理坐标的使用:

 

glEnableClientState(GL_VERTEX_ARRAY);
 glEnableClientState(GL_NORMAL_ARRAY);
 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 glEnableClientState(GL_COLOR_ARRAY);

启用相关的数组

 

glVertexPointer(3,GL_FLOAT,0,objVertexdataDuck);
 glNormalPointer(GL_BYTE, 0, objNormaldataDuck );
 glTexCoordPointer( 2, GL_BYTE, 0, objTextureCoord );
 glColorPointer(3,GL_UNSIGNED_BYTE,0,objColor);

在这里,我没有使用缓存的办法。。。当然也可以使用glBindBuffer()之类。。。。如有需要,私下联系。。。。

qq:369670643

 

接下来就是绘图显示:

glBindTexture(GL_TEXTURE_2D, iTexture.iID);
 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
 glDrawElements(GL_TRIANGLES, NUM_DUCK_FACES * 3, GL_UNSIGNED_BYTE, objFacedataDuck );

 

注:纹理贴图的图片必须是2的整数次幂。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值