草莓♭布丁

导航

Unity常见的几种图片压缩方式:DXT、ETC、ASTC

一、图片大小问题

  Unity打包后的图片大小仅与分辨率和导入设置有关,和原图大小无关。例如,jpg是有损压缩,压缩源文件只会让最终结果变模糊,对打包后的大小没有任何帮助。

二、DXT压缩

1,DXT是PC端常用的压缩算法,质量较低

 

 

 2,压缩算法介绍

 

 

  DXT压缩将图片拆分成4*4的小块,每一块取极值的2种颜色,剩下的颜色取插值、共有00,01,10,11四种颜色值。

  压缩后单个颜色是16位,是RGB565、

  不支持透明通道,原图RGB24,16个格子,需要24*16=384位

  压缩后,两个16位颜色+16个插值,16*2+2*16=64位,压缩比例1/6

3,DXT3和DXT5压缩

  在DXT1的基础上,支持透明图片,额外使用64位数据来保存透明通道值,压缩比例1/3。

DXT3压缩:每一个像素点使用4位保存alpha值,透明值较为粗糙

DXT5压缩:透明通道也单独取插值,有2个8位极值,每一个像素点使用3位插值,8*2+3*16=64位

4,缺点

细节上会有丢失,例如:

三、ETC压缩

1,ETC是Android平台通用的压缩格式,质量较低

 

ETC:不支持透明通道,图片宽高必须是2的整数次幂

ETC2:是ETC的扩展,支持透明通道,且图片宽高只要是4的倍数即可

2,压缩算法介绍

 

  也是将图片分成4*4的小块进行压缩,其中每一块会分成两半,用1位表示是横着还是竖着拆分。

  取2种颜色,从2半中各取一个,分为individual模式还是 differential模式,用1位表示取色模式。

individual模式:取两个RGB444的颜色,适用于两边颜色差异大的情况

differential模式:取RGB555+RGB333的颜色,其中,第二个块的颜色是偏移值,适用于两边颜色差异不大的情况,精度更高。

 

 

   压缩时会生成一个全局的映射表,两个子块各需要3位来确定使用哪一行的数据。

  对于每一个像素点,使用2位数据表示使用这一行的哪一个modifier,去除一个偏移值。例如表中(0,0)格子的-8,偏移值就是(-8,-8,-8),在子块颜色的基础上加上偏移值得到当前像素的颜色。

压缩前:16*24=384位

压缩后:1+1+24+3*2+2*16=64位,压缩比例1/6

四、ASTC压缩

1,ASTC是Android和IOS平台下的一种高质量压缩方式,支持Android5.0和iPhone6以上机型

 

 2,压缩算法介绍

  也是分块压缩,一块128位,块的大小很灵活,有4*4,6*6,8*8,12*12等多种大小。支持LDR、HDR、2D和3D纹理。每个块也有端点对endpoints,端点对不一定是RGBA的,也可以只用其中部分通道,比如RG通道,这样可以对法线贴图进行更好的压缩。

BISE算法:例如有5个数字,值为0,1,2,正常存储需要2*5=10位。但是实际上只有3^5=243<256种情况,可以使用8位表示这些情况,即使用8位就可以表示5个值为0,1,2的整数。

 

 ASTC压缩时,各个部分长度不固定。

BlockMode:平面数、权重范围、权重网格的大小

Part:分区数量

ConfigData、MoreConfigData:每个端点对的端点模式

对于块内颜色分布较为复杂的情况,分析块内颜色的分布,并做分区,分别存储其对应的endpoints;对于块内的像素取值时先定位分区,再计算在其在分区内的颜色。

对块内每个像素存储一个插值weight,但是weight的数量可以比像素少。对于规格较大的块,例如12x12,只能存储4x6的权重网格。解码时,权重网格会被双线性放大到块的大小。

3,块大小选择(块越大,压缩质量越差,但是图片越小)

(1)法线贴图:尽量选择4*4,避免丢失过多数据

(2)细节处的贴图:选择4*4或者6*6,否则会丢失细节

(3)一般的贴图:选择6*6或8*8

(4)无关紧要,但是尺寸特别大的图:可以考虑8*8,10*10,12*12,不然打包出来太大

posted on 2022-05-09 18:33  草莓♭布丁  阅读(7883)  评论(0编辑  收藏  举报

Live2D