首先下载PVRTexTool,官网下载地址:http://community.imgtec.com/developers/powervr/
1. 通过PVRTexTool将需要压缩的图片转换为ETC1格式编码的PVR文件
2. 解析PVR文件,官网有PVR文件的说明文档,PVR文件由header format、metadata format、texture data三部分组成。
如果是V3版本,可这样定义PVR文件头部格式,记得指定字节对齐的方式,不然在计算纹理数据偏移的时候容易出错(唉,我就掉进这个坑里了的)
typedef unsigned int uint32;
typedef unsigned long long uint64;
#pragma pack(push,1)
typedef struct _ST_PVR_HEAD_V3 {
uint32 u32Version;
uint32 u32Flags;
uint64 u64PixelFormat;
uint32 u32ColourSpace;
uint32 u32ChannelType;
uint32 u32Height;
uint32 u32Width;
uint32 u32Depth;
uint32 u32NumSurfaces;
uint32 u32NumFaces;
uint32 u32MIPMapCount;
uint32 u32MetaDataSize;
}ST_PVR_HEAD_V3;
#pragma pack(pop)
3. 读取PVR文件内容,获取压缩纹理的宽、高、纹理数据长度及纹理数据(texture data)起始地址。
由于自己程序中的压缩纹理中mipmapcount的值都为1,因此解析过程就简单得多了。
(1) 宽和高直接从文件头中的相应字段读取
(2) 纹理数据长度 = 文件总长度 - sizeof(ST_PVR_HEAD_V3) - sizeof(metadata), 其中metadata的长度也就是u32MetaDataSize这个字段的值。
4. 通过使用glCompressedTexImage2D()函数加载压缩纹理,填充各字段。
其中internalformat格式是:GL_ETC1_RGB8_OES , 如下:
glCompressedTexImage2D(GL_TEXTURE_2D, 0, GL_ETC1_RGB8_OES, texture->width,
texture->height, 0, imgSize, imgData);