前段时间一直在搞项目上线前的各种优化,关于贴图压缩这块也是需要针对不同的平台做不同的设置,这里备忘一下在各种平台中常使用的几种贴图压缩格式及其细节,以便更加适宜地选择在特定设备下的压缩格式以便节省资源。关于移动平台和硬件设备与压缩格式的对应关系可以参考下这里,基本上比较清楚了。
1. DXTC
DXTC(或BC)为微软为DX而推出的基于block的贴图压缩格式,其主要采用调色板的原理来进行压缩。
BC1:
基于4x4block来进行,不含有alpha通道,每个block内记录两个16bits的颜色做为基准颜色,然后解压时再使用两个基准色调制出另外两个颜色做为块内4个压缩颜色。其计算方式为:
basecolor2 = 2/3 *basecolor0 + 1/3 * basecolor1basecolro3 = 1/3 *basecolor0 + 2/3 * basecolor1
对于每个块内的texel,存储2bits的索引,用来指向到4个基准颜色中的一个。所以对于BC1的压缩状态为64bits:
- 32bits:两个RGB565格式的基准颜色;
- 32bits:16个2bits的索引;
BC3:
在BC1的基础上支持alpha通道。首先,颜色的存储方式与BC1相同,需要64bits;对于alpha部分,使用与颜色部分相同的策略来处理。在block存储两个基准的alpha值,然后在其基础上插值得到其它6个共计8个alpha值,来做为alpha的调色板;然后对于每个texel存储一个3bits的索引,用来指向到这8个alpha中的一个。所以其对应的存储状态为:
- 32bits:两个RGB565格式的基准颜色;
- 32bits:16个2bits的颜色索引;
- 48bits:16个3bits的alpha索引;
- 16bits:2个8bits的基准alpha;
同时,两个alpha值中的不同的标记情况也对应着不同的插值操作:
alphai = (7 - i) / 7 *alpha0 + i/7 * alpha1;(2<=i<=7);
若alpha0 < alpha1
alphai = (5 - i) / 5 *alpha0 + i/5 * alpha1;(2<=i<=5);
alpha6 = 0;
alpha7=255;
2. ETC
ETC也主要有两种方法:ETC1和改进后的ETC2。
ETC1:
采用4x2的block进行分割(原始为4*2*24=192,压缩后为32,压缩率为6):
对于所有图片都使用一个全局的16个组table codeword,每组中有四个数值,且其中是有规律可循的,如下所示:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
-8 | -12 | -31 | -34 | -50 | -47 |