【百人计划】图形3.5 纹理压缩的格式

笔记部分》

 

一、什么是纹理压缩格式(概念)

为了解决内存和带宽问题,在计算机图形渲染中(储存纹理)的一种图像压缩、优化技术。

二、为什么要进行纹理压缩?

对于低硬件设备和移动端,有两个问题需要解决。

①内存

假设有一张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位调制图像的混合权重值。

preview

②缺点:只支持苹果设备和部分安卓,不兼容。

总结:如果平台不支持对应设置的纹理压缩格式,纹理将被解压缩为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。

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值