笔记20 纹理压缩
什么是纹理压缩
纹理压缩是为了解决内存、带宽问题,专为在计算机图形渲染系统中存储纹理而使用的图像压缩技术。
为什么要纹理压缩
图片格式是图片文件的存储格式,通常在磁盘、内存中储存和传输文件时使用。
例如:JPG、PNG、GIF、BMP等。
纹理格式是显卡能够直接进行采样的纹理数据格式,通常在向显卡中加载纹理时使用。
纹理压缩格式基于块压缩,能够更快读取像素所属字节块进行解压缩以支持随机访问;
图片压缩格式基于整张图片进行压缩,无法直接实现单个像素的解析;
图片压缩格式无法被GPU识别,还需要经CPU解压缩成非压缩纹理格式才能被识别。
常见纹理压缩格式
| 非压缩格式 | DirectX标准压缩-DXTC | ATI系列 | IOS设备-PVRTC |
|---|---|---|---|
| RGBA8888(RGBA32) | DXT1 (BC1) | ATI1 (BC4) | PVRTC |
| RGBA4444(RGBA16) | DXT2 (BC2) | ATI2(BC5) | PVRTC2 |
| RGB888(RGB24) | DXT3 (BC2) | BC6H | |
| RGB565 (RGB16) | DXT4 (BC3) | BC7 | –ETC系列– |
| DXT5 (BC3) | — | ETC1 | |
| ASTC | ETC2 |
其中粗体较为常用:ASTC,DXT1(BC1),DXT5(BC3),ETC2,ATI2,BC7,PVRTC2
非压缩格式
RGBA8888(RGBA32)
一个像素32位,包含A通道,即一个像素消耗4字节;
RGBA4444 (RGBA16)
一个像素16位,包含A通道,即一个像素消耗2字节;
RGB888 (RGB24)
一个像素24位,无A通道,即一个像素消耗3字节;
RGB565 (RGB16)
一个像素16位,无A通道,即一个像素消耗2字节;
DXTC (BC1/2/3)
DCTC纹理压缩格式来源于S3公司提出的S3TC算法,基本思想是把4×4的像素块压缩成一个64或128位的数据块,优点为创建了一个固定大小且独立的编码片段,没有共享查找表或其他依赖关系,简化了解码过程。
DXT1
每一个块具有2个16位RGB颜色值(RGB565),代表了此4×4像素块中颜色极端值然后通过线性插值计算出两个中间颜色值,16个2位索引值则表示了每一个像素的颜色值索引。
DXT2/3
DXT2/3与DXT1类似,表示颜色信息的64位数据块不变,另外附加了64位数据来表示每个像素的Alpha信息,整个数据块变为了128位;每个像素占用8位,0-3表示透明信息,4-7表示颜色信息。
DXT4/5
DXT4/5与DXT2/3的差异在于其Alpha信息是通过线性插值所得的,表示颜色信息的64位数据块依然不变,而Alpha信息则由 2个 8位Alpha极端值 和 16个 3位索引值 组成.
在Unity内贴图类型选为法线后会采用DXTnm压缩格式,该格式会把法线贴图R通道存入A通道,然后RB通道清除为1,这样可以将法线XY信息分别存入到RGB/A中分别压缩,以获得更高的精度,然后再根据XY构建出Z通道数据。把颜色信息和透明度信息分开进行压缩,互不干扰,以获得更高的精度。
ATI1/2 (BC4/5)
ATI1 是ATI公司开发的纹理压缩格式,也被称为BC4,其每个数据块存储单个颜色的数据通道,以与DXT5中的Alpha数据相同的方式进行编码,常用于存储高度图、光滑度贴图,效果与原始图像基本无差异;
ATI2 也被称为BC5,每一个块中存储两个颜色通道的数据,同上以与DXT5中Alpha数据相同的方式进行编码,相当于存储了两个BC4块。
如果是在将法线存储在XY双通道中采用BC5格式压缩,由于每个通道都有自己的索引,因此法线贴图XY信息可以比在BC1中保留更多的保真度,缺点是需要使用两倍内存,也需要更多的带宽才能将纹理传递到着色器中;
BC6/7
BC6 和 BC7 仅在D3D11及以上的图形硬件中受支持,它们每个块占用16字节,BC7针对8位RGB或RGBA数据,而BC6针对RGB半精度浮点数据,因此BC6是唯一一个可以原生存储HDR的BC格式;
BC6是专门针对HDR(高动态范围)图像设计的压缩算法,压缩比为6:1;
BC7是专门针对LDR(低动态范围)图像设计的压缩算法,压缩比为3:1,该格式用于高质量的RGBA压缩,可以显著减少由于压缩法线带来的错误效果。一般我们使用BC7给端游高质量图像进行压缩。
BC6和BC7的官方原理说明:
https://docs.microsoft.com/zh-cn/windows/uwp/graphics-concepts/bc6h-format
https://docs.microsoft.com/zh-cn/windows/uwp/graphics-concepts/bc7-format
ETC
DirectX选择了 DXTC 作为标准压缩格式,OpenGL则选择了爱立信研发的ETC格式,几乎所有的安卓设备都可以支持ETC压缩,所以其在移动平台上被广泛应用。
ETC方案与DXTC具有相同特点,将4×4的像素单元压缩成64位数据块,并将像素单元水平或竖直朝向分为两个区块,每个像素颜色等于基础颜色加上索引指向的亮度范围。
ETC1
ETC1 每一个数据块分区中的4位亮度索引信息会从16个内置亮度表中获取当前像素单元对应的亮度表,每个像素的2位像素索引值可以从亮度表的四个值中选取对应的亮度补充值。
- 1. 子块划分方式 (
flipbit): 1位,决定是垂直还是水平划分。 - 2. 基色存储模式 (
diffbit): 1位,决定两个子块的基色存储方式。 - 3. 亮度索引 (
cw1,cw2): 各3位,共6位。这就是你问的“亮度索引信息”。每个子块有自己独立的3位索引,指向一个“亮度修正值表”(共8行,而非16行),用于获取亮度修正值。 - 4. 像素索引 (
pixel indices): 共32位。每个像素用2位索引,共16像素,用于从所在子块的4个颜色值中选一个。
ETC1要求长宽为2的幂次贴图,它适用于所有安卓设备,压缩率比较高;但不适用于带Alpha通道贴图。
ETC2
ETC2是ETC1的扩展,支持了Alpha通道的压缩,硬件要求OpenGLES3.0和OpenGL4.3以上,要求贴图长宽能够被4整除。
ASTC
ASTC是由ARM和AMD联合开发的纹理压缩格式,ASTC在各项指标上都挺不错,优点是可根据不同图片选择不同压缩率的算法,图片不需要为2的幂次,同时支持LDR和HDR,缺点是兼容性不够完善(无法在 iPhone 6 以下设备上运行)且解码时间较长。
ASTC也是基于块的压缩算法,与BC7类似,其数据块大小固定为128位,不同的是块中的像素数量可变,从4×4到12×12像素都有;
每一个数据块中存储了两个插值端点,但不一定存储的是颜色信息,也可能是Layer信息,这样可以用来对 Normal 或 Alpha 进行更好的压缩;
对于块中每一个纹素,存储其对应插值端点的权重,存储的权重数量可以少于纹素数量,可通过插值得到每一个纹素的权重值,然后再进行颜色的计算。
1 | 11位 权重、高度信息,特殊块标识; |
PVRTC
PVRTC 由 Imagination 公司专为PowerVR显卡设计,仅支持 iPhone、iPad 和部分安卓机;不同于 DXTC 和 ETC 这类基于块的算法,PVRTC 将图像分为了低频信号和高频信号,低频信号由两张低分辨率图像AB组成,高频信号则是低精度的调制图像,记录了每个像素混合的权重,解码时 AB图像 经过双线性插值放大,然后根据调制图像的权重进行混合。
PVRTC 4-bpp(4 bit per pixel)把一个4x4的像素单元压成一个64位数据块,每一个块中存储 一个32位的调制数据,一个1位的调制标志,15位的颜色A,1位颜色A不透明标志,14位颜色B,1位颜色B不透明标志。
而PVRTC 2-bpp则是把一个4×4的像素单元压成了32位数据块。
小结
画质比较(受主观判断、纹理影响)
RGBA > ASTC 4x4 > ASTC 6×6 > ETC2 ~ ETC1
| 压缩格式 | 压缩比 |
|---|---|
| DXT1 | 6:1 |
| DXT2/3 | 4:1 |
| DXT4/5 | 4:1 |
| ATI1 | 4:1 |
| AT12 | 4:1 |
| BC6 | 6:1 |
| BC7 | 3:1 |
| PVRTC | 6:1 |
| ASTC | 4:1~35.95:1 |
实际应用中的选择
①低质量使用DXT1格式不支持A通道,使用DXT5格式支持A通道;
②高质量使用BC7格式,支持A通道;
①低质量使用ETC1格式,但不支持A通道;
②低质量使用ETC2格式,支持A通道,需要在OpenGL ES 3.0/OpenGL 4.3以上版本;
③高质量使用ASTC格式,需要在Android 5.0/OpenGL ES 3.1以上版本;
①高质量使用 ASTC 格式,需要 iPhone6 以上版本;
②低质量使用 PVRTC2 格式,支持 iPhone6 以下版本;
英伟达和Unity官方对于不同类型贴图给出了不同的压缩方案建议,感兴趣的同学可以看下:
- Using ASTC Texture Compression for Game Assets | NVIDIA Developer
- Unity -Manual:Recommended, default, and supported texture compression formats, by platform (unity3d.com)
-作业-
结合课程内容,针对 ASTC 与 ETC2 这两个格式进行打包测试,对比分析内存占用。
- 标题: 笔记20 纹理压缩
- 作者: 铁名_IronName
- 创建于 : 2026-04-04 13:23:13
- 更新于 : 2026-04-04 19:21:12
- 链接: https://blog.ironname.top/2026/BRPlan/笔记20-技术美术百人计划/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。