加载ETC1格式编码的PVR压缩文件

首先下载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);

你可能感兴趣的:(加载ETC1格式编码的PVR压缩文件)