安卓中压缩纹理ETC1和ETC2
etc是纹理压缩算法,pkm是纹理打包格式。pkm里面放的是往往是etc压缩的纹理。ETC1:1. 头文件:(1) ETC1的文件头大小为16:(2) 将ETC1纹理存成pkm文件时,加上这个文件头,便于读取时获知大小、格式,上传压缩纹理时把这个头去掉。(3) 文件头内容为:特征符——编码宽——编码高——实际宽——实际高...
etc是纹理压缩算法,pkm是纹理打包格式。pkm里面放的是往往是etc压缩的纹理。
ETC1:
1. 头文件:
(1) ETC1的文件头大小为16:
(2) 将ETC1纹理存成pkm文件时,加上这个文件头,便于读取时获知大小、格式,上传压缩纹理时把这个头去掉。
(3) 文件头内容为:特征符——编码宽——编码高——实际宽——实际高
(4) 尽管ETC1是固定的压缩比,但考虑到像素不对齐的情况,实际宽和实际高还是有必要存储的。
2. 编码构成:
(1) Jpeg压缩标准是把图像划分为一系列8X8的像素块,然后每个像素块压缩成变长编码的。ETC1则是4X4的像素块压缩成固 定的64位编码(8字节),由于固定,才有利于GPU内部实现并行解压缩。因此,不考虑像素非4对齐的情况,它的压缩比 是固定的48/8=6,至于常用的把ARGB分别存储为两张ETC1纹理的做法,压缩比是64/16=4。
(1024*1024)/16 * 8 = 524288
3. 编码过程:
(1) 将图像划分为一系列 4X4 的子块。
(2) 对每个子块,尝试所有的编码可能性,取解码后和原block像素差值和最小的一种编码。
(3) 是否flip,这个决定subblock如何划分。
(4) 每个subblock用哪一行差值表。
(5) 每个像素取哪一列的差值
注:决定好flip之后,颜色均值和是否能用diff方式已经确定,这个不用遍历。
(6) 合并所有子块编码。
不难看出,编码过程需要遍历所有可能性,其复杂度远大于解码,每一个 RGB 像素变成了一个精度较低的RGB均值和一个2位差值号,因此产生压缩。这种预测式表述自然本身就存在偏差,压缩损失亦来自于此。
ETC1和ETC2差别:
更多推荐
所有评论(0)