## 5.9 DXT压缩纹理扩展 在前面两节从OpenGL获取到了压缩纹理,并用来做渲染,在单台电脑上测试是一切正常的。 由于我经常在公司两台电脑、家里两台电脑之前测试,所以发现一个问题:在不同电脑上,从OpenGL获取到的压缩纹理格式并不相同,这导致有的电脑识别不了另一台电脑导出的压缩纹理。 前面上传纹理进行压缩的代码如下: 第三个参数 指定了压缩纹理格式,可以看到这里只是指定了要压缩,但是并没有指定某一个压缩格式,那么OpenGL就会自动选择一个。 经过测试发现,在公司电脑上压缩出来的是 ,而在家里的电脑是 。 公司电脑上识别不了家里电脑压缩出来的格式,但是公司压缩的却能被家里电脑识别。 公司压缩出来的是 格式,这个格式很常见,在 这一节,用来对比的Unity压缩纹理格式就是 。
CLion项目文件位于 samples\texture\export_dxt
在前面两节从OpenGL获取到了压缩纹理,并用来做渲染,在单台电脑上测试是一切正常的。
由于我经常在公司两台电脑、家里两台电脑之前测试,所以发现一个问题:在不同电脑上,从OpenGL获取到的压缩纹理格式并不相同,这导致有的电脑识别不了另一台电脑导出的压缩纹理。
前面上传纹理进行压缩的代码如下:
//3. 将图片rgb数据进行压缩上传到GPU。 glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGB, texture2d->width_, texture2d->height_, 0, texture2d->gl_texture_format_, GL_UNSIGNED_BYTE, data);
第三个参数 GL_COMPRESSED_RGB 指定了压缩纹理格式,可以看到这里只是指定了要压缩,但是并没有指定某一个压缩格式,那么OpenGL就会自动选择一个。
经过测试发现,在公司电脑上压缩出来的是COMPRESSED_RGBA_S3TC_DXT5_EXT 33779,而在家里的电脑是COMPRESSED_RGBA_FXT1_3DFX 34481。
公司电脑上识别不了家里电脑压缩出来的格式,但是公司压缩的却能被家里电脑识别。
公司压缩出来的是DXT格式,这个格式很常见,在5.7 图片压缩工具这一节,用来对比的Unity压缩纹理格式就是DXT1。

对glTexImage2D指定压缩纹理格式为 COMPRESSED_RGBA_S3TC_DXT5_EXT就可以获取DXT格式的压缩纹理。
//file:texture2d.cpp line:27 Texture2D* Texture2D::LoadFromFile(std::string& image_file_path) { ...... int image_data_format=GL_RGB; if (data!= nullptr) { //根据颜色通道数,判断颜色格式。 switch (channels_in_file) { case 1: { image_data_format = GL_ALPHA; break; } case 3: { image_data_format = GL_RGB; texture2d->gl_texture_format_=GL_COMPRESSED_RGB_S3TC_DXT1_EXT; break; } case 4: { image_data_format = GL_RGBA; texture2d->gl_texture_format_=GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; break; } } } ...... }
但是当修改代码后,发现编译不通过,找不到COMPRESSED_RGBA_S3TC_DXT5_EXT这个枚举。
这是因为OpenGL自身并不支持DXT格式,从COMPRESSED_RGBA_S3TC_DXT5_EXT以_EXT看出,对DXT格式的支持是以扩展提供的。
官网相关介绍:https://www.khronos.org/opengl/wiki/S3_Texture_Compression
扩展的枚举,都在glext.h这个头文件,官网下载:https://www.khronos.org/registry/OpenGL/api/GL/glext.h。
下载后放到项目中就可以编译成功。
使用导出的DXT格式纹理渲染,一切OK。
教程项目原始图片路径是写死在代码中的,后面优化了。 Windows系统直接将图片拖到程序上就可以压缩。 Mac系统在命令行运行程序,将图片路径作为参数传递。 支持一次处理多个图片。 优化后的CLion项目文件位于 samples\texture\export_compressed_texture_tools