ETC1压缩算法详解

2021-11-18  本文已影响0人  太刀
美女

0. Ericsson 压缩算法官方 GitHub

ETCPACK

1. 基本思想

2. 像素块编码思想

如何将一个 4x4 的像素块编码为 64 位数据呢?

可以这么理解:当两个子块的平均颜色值相差比较小时,基本颜色可以使用更高精度的 R5G5B5 来替代R4G4B4获得更少的信息损失

以上就是编码后的 64 位数据块表示的意义

3. 内存布局和解码过程

以RGB555基本色和RGB3333颜色差表示的编码为例,每个4x4 像素块经过ETC1 编码后的 64 位数据的内存布局大概是这样


ETC1内存布局

假如编码前像素块表示为下图


目标像素

我们需要得到图中编号2对应像素的颜色,需要进行如下的解码步骤:

补位规则:

individual 模式,直接将4位数复制到尾部,得到8位
differential 模式,将5位中的高3位复制到尾部,得到8位
differential 模式,一定是将子块1基本色和子块2偏移值相加后再进行补位

这里的映射表是一个全局数据,不会编码到文件中。但是这个全局数据是怎么来的,放在什么地方,没有查到相关资料。不过因为解码时要用,所以我估计是存放在纹理的某个全局区域

上面知道目标像素位于子块2,这里还需要从编码数据的34-36获得子块2的修正表索引,得到索引为(1,1,0)=6,根据上面的映射表,根据下标(6, -b) 可以索引到像素的颜色差值为-106

4. 编码过程

其实从上面的解压过程可以推测出编码的过程

4. 遗留或未考查清楚的问题

参考:
UI图集压缩优化,以及对Dither和ETC1算法的深入了解
几种主流贴图压缩算法的实现原理详解
OES_compressed_ETC1_RGB8_texture

上一篇 下一篇

猜你喜欢

热点阅读