CompressedTextureInfo对象 。
1.ETC1ETC1格式是OpenGL ES图形标准的一部分,并且被所有的Android设备所支持 。扩展名为: GL_OES_compressed_ETC1_RGB8_texture,不支持透明通道,所以仅能用于不透明纹理 。且要求大小是2次幂 。当加载压缩纹理时,参数支持如下格式: GL_ETC1_RGB8_OES(RGB,每个像素0.5个字节)ETC1 压缩纹理的加载,主要参考了Android源码:etc1.cpp解析 ETC1 纹理:
// 解析 ETC1 纹理static const CompressedTextureInfo ParseETC1Texture(unsigned char* data) {    CompressedTextureInfo textureInfo;    textureInfo.is_valid = false;    const etc1::etc1_byte *header = data;    if (!etc1::etc1_pkm_is_valid(header)) {        LogE("LoadTexture: etc1_pkm is not valid");        return textureInfo;    }    unsigned int width = etc1::etc1_pkm_get_width(header);    unsigned int height = etc1::etc1_pkm_get_height(header);    GLuint size = 8 * ((width + 3) >> 2) * ((height + 3) >> 2);    GLvoid *texture_data = data + ETC1_PKM_HEADER_SIZE;    textureInfo.is_valid = true;    textureInfo.width = width;    textureInfo.height = height;    textureInfo.size = size;    textureInfo.internal_format = GL_ETC1_RGB8_OES;    textureInfo.data = texture_data;    return textureInfo;}2.ETC2ETC2 是 ETC1 的扩展,压缩比率一样,但压缩质量更高,而且支持透明通道,能完整存储 RGBA 信息 。ETC2 需要 OpenGL ES 3.0(对应 WebGL 2.0)环境,目前还有不少低端 Android 手机不兼容,iOS 方面从 iPhone5S 开始都支持 OpenGL ES 3.0 。ETC2 和 ETC1 一样,长宽可以不相等,但要求是 2 的幂次方 。
首先定义好 ETC2 的 Header:
// etc2_texture.hclass Etc2Header {public:    Etc2Header(const unsigned char *data);    unsigned short getWidth(void) const;    unsigned short getHeight(void) const;    unsigned short getPaddedWidth(void) const;    unsigned short getPaddedHeight(void) const;    GLsizei getSize(GLenum internalFormat) const;private:    unsigned char paddedWidthMSB;    unsigned char paddedWidthLSB;    unsigned char paddedHeightMSB;    unsigned char paddedHeightLSB;    unsigned char widthMSB;    unsigned char widthLSB;    unsigned char heightMSB;    unsigned char heightLSB;};// etc2_texture.cppEtc2Header::Etc2Header(const unsigned char *data) {    paddedWidthMSB  = data[8];    paddedWidthLSB  = data[9];    paddedHeightMSB = data[10];    paddedHeightLSB = data[11];    widthMSB        = data[12];    widthLSB        = data[13];    heightMSB       = data[14];    heightLSB       = data[15];}unsigned short Etc2Header::getWidth() const {    return (widthMSB << 8) | widthLSB;}unsigned short Etc2Header::getHeight() const {    return (heightMSB << 8) | heightLSB;}unsigned short Etc2Header::getPaddedWidth() const {    return (paddedWidthMSB << 8) | paddedWidthLSB;}unsigned short Etc2Header::getPaddedHeight() const {    return (paddedHeightMSB << 8) | paddedHeightLSB;}GLsizei Etc2Header::getSize(GLenum internalFormat) const {    if (internalFormat != GL_COMPRESSED_RG11_EAC        && internalFormat != GL_COMPRESSED_SIGNED_RG11_EAC        && internalFormat != GL_COMPRESSED_RGBA8_ETC2_EAC        && internalFormat != GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC) {        return (getPaddedWidth() * getPaddedHeight()) >> 1;    }    return (getPaddedWidth() * getPaddedHeight());}
经验总结扩展阅读
- 护肤中收敛水在哪一步使用
- 如何辨认算盘木质
- 有什么表测试电瓶好坏
- 苹果手机怎么使用超级截屏(苹果手机超级截屏在哪里)
- 手把手教你玩转 Gitea|使用 Docker 安装 Gitea
- 26 《吐血整理》高级系列教程-吃透Fiddler抓包教程-Fiddler如何抓取Android7.0以上的Https包-上篇
- 如何设置两个无线路由器组网
- 京东50元购物卡怎么用
- DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色
- 为什么阿里Java开发手册不推荐使用Timestamp

 
   
   
   
   
   
   
   
   
   
   
   
  