笔记部分》
一、什么是纹理压缩格式(概念)
为了解决内存和带宽问题,在计算机图形渲染中(储存纹理)的一种图像压缩、优化技术。
二、为什么要进行纹理压缩?
对于低硬件设备和移动端,有两个问题需要解决。
①内存
假设有一张512*512的RGBA8图像,需要的储存空间为512*512*4b(一个像素4个字节),约等于1M,当游戏内贴图的数量过多,如果不进行压缩,对于移动端来说是难以接受的。
②带宽
在移动端这样内存带宽极度受限的平台上,每当渲染场景,大量贴图被传输给GPU,压缩纹理也能有效降低带宽的需求。
总结:压缩纹理是有效提升渲染效率的方法之一,但是压缩也是有损的,所以也需要在质量和大小之间做平衡。
三、区分图片格式和纹理格式
3.1、常见的格式
①常见的图片压缩格式:png,jpg,gif等
②常见的纹理压缩格式:DXTC,ETC,BC,ASTC(Texture Compression)等等;
3.2、两者的区别
①图片格式:计算机储存图片的格式。
对于图片压缩格式,GPU不能直接读取,需要CPU额外进行解压缩成RGBA32格式(所以无论什么图片格式经过CPU解压缩后都是RGBA);且是基于整张图像进行压缩,因此不支持像素的随机访问。(不太可能为了访问某一个像素对整张图进行解码)
②纹理格式: 是显卡能直接读取的格式。
对于纹理压缩格式,能被GPU直接读取对应大小的字节进行解压缩,因此可以高效的随机访问每一个像素。
3.3、总结
在实时渲染中,对于jpg,png这类图片压缩格式,解码代价高,且会增加额外的CPU工作。所以纹理压缩格式会更高效,在访问时会占用更少的带宽和内存。
四、常见的纹理压缩格式(详解)
4.1、DXTC
①核心思想:将4*4的像素块进行块状的压缩编码,每一块都储存两个颜色参考值/极端值,允许每个像素有2位/3位插值因子,在两个颜色值中进行插值。
(*颜色参考值为16位,RGB通道精度分别是565,查阅了资料后应该是基于“人眼对绿色更为敏感”这一特性。所以一些单通道贴图的组合会把精度做高的信息贴图放在G通道,像PBR金属工作流中的MRA)
②延伸
>DXT1 (6:1)
无Alpha通道。
>DXT2/3(4:1)
在DXT1的基础上,每块都有相同的64位数据编码,但每个像素都有额外的4位来储存Alpha通道,所以64+64=128位。Alpha通道不插值,直接储存数据。
>DXT4/5(4:1)在DXT1的基础上,每块都有相同的64位数据编码,不同的是,使用2个8位的单通道极端数值和额外每像素3位的索引值来储存Alpha。分别压缩,以获得更高的精度。64+2*8+3*16=128;
③优点:与RGB24相比,有着较高的的压缩率,且简化了解码过程。
④额外的Tips:
2/3,4/5的区别在于前者做了预乘,后者Alpha信息独立。
Unity中的DXTnrm,是基于DXT5的压缩方法,将R通道的值储存至A通道后,清空RB通道,这样利用精度最高的g通道和a通道,对法线的xy方向进行分别压缩,能获得更高的精度。
4.2、ATI1/2也被称为BC4/BC5
>BC4
和DXT5 Alpha通道的储存模式相同,使用2个8位的单通道极端数值和每像素3位的索引值来储存。只能储存单个颜色的通道,常用来从储存单通道的颜色信息贴图。Roughness,Ao,Mentalic贴图等。
>BC5
和DXT5 Alpha通道的储存模式相同,使用2个8位的单通道极端数值和每像素3位的索引值来储存。
4.3、BC6/BC7
>BC6 (6:1)
将4*4的像素进行块状编码,每块储存128位数据,(包含两个48位的浮点精度RBG值),外加每个像素有2位索引表。常用于压缩HDR。
>BC7 (3:1)
大致同BC6,常用于压缩LDR。也用于压缩高质量的RGBA,可显著减少法线压缩带来的错误效果。
4.4、在移动端广泛应用的ETC
①核心思想:类似于DXT,ETC也是把4x4的像素块压缩成一个64或128位的数据块,也是有损压缩。
>ETC1(6:1)
将4*4的像素块进行块状编码,每块储存64位数据,将整块编码分为2个大的子快,每个子块包含一个基本色,和一个3位的修饰值索引表,进行叠加就可以确立最终解码值。(也叫修饰值也叫亮部补偿值)
>ETC2(6:1)
为ETC的扩展,支持Alpha通道。ETC2相比ETC1,会增大由于色度所产生误差的可能性。
4.5、ASTC(4:1~36:1)
①核心思想:同样是块状编码,类似于BC7,其数据块大小固定为128位。但覆盖的像素数量是可变的,从4*4到12*12像素都有。每一块中储存了两个插值端点,但不一定储存的是颜色信息,也有可能是Layer信息。这样就可以针对所储存的信息进行更好的压缩。而对于块中的每一个像素,储存其对应的插值。储存的权重数量不一定要和纹素数量对等。即分配了很多的可变的可配置数据。
②优点:会根据不同的纹理贴图类型选择不同压缩率的算法,且贴图大小不一定要为2次幂,支持LDR与HDR。
③缺点:对设备有硬性要求,不兼容。解码时间过长。(随着移动端硬件的发展,GPU越来越不会变成计算瓶颈。所以ASTC的应用正逐渐广泛)
4.6、PVRTC(6:1)
①核心思想:一般针对苹果机的设备,不同于上述DXTC,BC,ASTC这几类的基于块的算法,PVRTC将图像分为高频信号和低频信号。低频信号由两张低分辨率的图像A、B表示。(两张图在维度上都缩小了4倍),高频信号是全分辨率的低精度调制图像,记录了每个像素混合的权重,在解码时低频信号的两张图会放大,根据高频信号调制图像的权重做混合。
拿4-bpp举例,这个压缩方式把每个4*4像素压缩成块状编码,每块储存64位数据。包含15位颜色A+1位标识(标识是用ARGB还是用RGB通道储存),14位颜色B+1位标识。32位调制图像的混合权重值。
②缺点:只支持苹果设备和部分安卓,不兼容。
总结:如果平台不支持对应设置的纹理压缩格式,纹理将被解压缩为RGBA 32并与压缩格式一起存储在内存中。感觉具体使用哪种压缩方式还是取决于目标平台与纹理用法。同时,也要根据纹理的重要程度,是否大程度影响最终效果,考虑是否需要压缩,或使用哪种压缩格式。
四、总结
抄作业环节:
作业部分》
作业:打包测试ASTC和ETC2
因为untiy抽风打包apk出了问题,我这个只能先欠着了555(抹泪)
我就分析分析同学们打的包吧 233
大致整体压缩后的内存占比为
未经压缩后的RGBA > ASTC4*4 >ETC2 >ASTC6*6及以上。ASTC8*8的占用容量几乎达到ETC2的一半。
ASTC6*6的质量看起来是高于ETC2的,但逐渐往上走,到了8*8开始产生明显失真的情况。
因为现在ASTC似乎因为压缩后内存占用小,且效果几乎接近原图,和BC7的高质量接近,应用的比较广泛,所以额外拓展了一下ASTC:
ASTC的适配机型为ios iphone6以上,安卓为大部分。(所以ASTC是真的快取代ETC了吗 233)对于带Alpha通道的贴图,使用同等区块大小,压缩质量明显降低。所以在使用ASTC时,要检查贴图是否带有A通道以更好规划选择的压缩等级。一般来说,同样的贴图带A通道,需要往上走选择质量更好的压缩等级才能避免失真的情况。如果贴图类型为法线贴图,也需要更高的要求,一般选用ASTC5*5,更高精度也可用ASTC4*4。
ASTC的缺陷在于不适配部分GPU配置不行的机型,且压缩时间过长。不过因为应用广泛各个厂商都在推,之后兼容性因该会越来越好,压缩时间过长的问题也可以用分布式解决。
ps:似乎法线贴图也不用强求ASTC,有时候ETC2的结果会更好。
对于纹理压缩格式,如果机型不适配或者贴图大小不符合对应的压缩格式规定,Unity会默认更改为sRGB。