astc纹理压缩格式

astc是当前android和ios平台下压缩最好的纹理格式,并且主流的机器基本都支持,
astc:支持非2次幂的,2次幂的,等宽高的

一、ASTC纹理压缩格式介绍

ASTC是在OpenGL ES3.0出现后在2012年中产生的一种业界领先的纹理压缩格式。

它的压缩分块从4x4到12x12最终可以压缩到每个像素占用1bit以下,压缩比例有多种可选。

ASTC格式支持RGBA,且适用于2的幂次方长宽等比尺寸和无尺寸要求的NPOT(非2的幂次方)纹理。

以ASTC 4x4 block压缩格式为例,每个像素占用1字节,8bits。一张1024*1024大小的贴图压缩后的大小为1M。


二、适配机型
1、iOS
苹果从A8处理器开始支持 ASTC,iPhone6及iPad mini 4以上iOS设备支持,2014年的iPhone 5s及iPad mini 3以前的设备不支持。
2、安卓
安卓主流压缩格式正在从ETC2转向ASTC。
官方文档中提到GPU对ASTC的支持情况:所有支持OpenGL ES 3.1和部分支持OpenGL ES 3.0的GPU。
市面上大部分机型都支持OpenGL ES 3.1以上,少数GPU配置较低的机型支持OpenGL ES 3.0
但不支持ASTC压缩格式,在2020年4月统计的市面占比不到1.5%,从个人角度看ASTC压缩格式是可以普及使用的。

2、无Alpha通道,RGB 24 位/像素的压缩比率选择

结论:无Alpha通道的贴图建议压缩格式为ASTC 8x8。如果贴图为法线贴图,建议压缩格式为ASTC 5x5。
有更高要求的贴图(比如面部、场景地面),可以设置压缩格式为ASTC 6x6,法线贴图为ASTC 4x4。

3、带Alpha通道,RGBA 32 位/像素的压缩比率选择

结论:有Alpha通道的贴图建议压缩格式为ASTC 5x5。
有更高要求的贴图(比如特效、UI),可以设置压缩格式为ASTC 4x4。

4、有无Alpha通道对压缩的影响

在同一压缩格式下,贴图容量不变,有无Alpha通道对压缩结果有很大影响,带Alpha通道的贴图压缩质量下降。

5、其他问题

1)对Shader带来的影响
默认贴图是"black"时,如果贴图缺省,默认值是(0,0,0,0),A通道读取出来是0,使用RGB ETC2 4bits格式时,A通道读取出来是0,使用ASTC格式时,A通道读取出来是1。这里要注意Shader默认值的考虑。

2)JPEG格式已经是有损格式,在JPEG丢失的精度与ASTC压缩无关。

3)关于贴图尺寸:尽量使用2的幂的纹理
压缩格式支持非2的幂次方时,只要硬件支持该压缩格式,就可以使用NPOT纹理。但是,2的幂次方纹理比其他尺寸更优,这里有复杂的图形学因素。
参考文章:https://www.zhihu.com/question/376921536/answer/1063272336
简单的理解,贴图在GPU中是以块为单位存储的,为了尽可能节省内存和带宽,压缩格式对贴图也是分块存储的。在递归或循环时,如果一个数是2的幂次方,可以被2整除,而且商也是2的幂次方。OpenGL API支持非2的幂次方,是因为考虑到易用性隐藏了细节,在内部处理了一些必要的拉伸或填充操作。所以,在无特殊要求时,尽量使用POT纹理,并且制作时尽量按照实际应用尺寸来制作,避免一些高精度压缩到低精度使用的情况。

4)无论贴图本身是否带Alpha信息,ASTC压缩的不同设置直接决定压缩大小。控制贴图资源的包体大小,依赖于ASTC压缩格式的规范是否合理,毕竟压缩为ASTC 8x8后容量与ASTC 6x6相比减小了约44.8%(85.4KB vs 154.7KB),压缩为ASTC 8x8后容量与ASTC 4x4相比减小了约300%(85.4KB vs 341.4KB)。而我们通常检查Alpha通道是否为空,可以帮助我们判断Alpha的信息是否冗余,是否应该设置更低的压缩精度。

5)ASTC压缩的算法比较智能,它会为变化更大的通道RGB或者A分配更高的权重,而且对于单色图,RGB通道内容一样时,使用较低的像素占用就可以达到很好的效果。对于单色图完全没有必要使用R8压缩格式,而是应该将RGB通道填充一样的信息,选择ASTC较低的像素占比,如ASTC8x8。

参考链接:ASTC纹理压缩格式详解 - 知乎

ASTC中ARM研发的一种贴图压缩格式,从iOS9(A8架构)开始支持ASTC压缩格式 ,相对于PVRTC2/4而言,ASTC(4X4)的压缩比会增加到0.25,不过显示效果也会好很多,而且不要求图片长宽相等且为2的幂次方。支持Android OpenGL ES 3.1 和 Vulkan 设备。

支持的GPU:
tvOS (all), iOS (A8), Android (PowerVR 6XT, Mali T600 series, Adreno 400 series, Tegra K1).
如果GPU不支持这种压缩格式,则解压为RGB或者RGBA。会增加cpu解压时间,并占用较多内存。
2016年之后的安卓手机基本支持这种压缩格式
iphone6以及之后的机型支持这种压缩格式

图片压缩核心思想是将大图分为多个颜色块,每个颜色块固定大小为16-bytes,单个颜色块里的颜色像素怎么划分不关心。意思是将图片分成多个颜色块,每个颜色块固定大小为16-bytes,但是每一个16-bytes的颜色块中放多少个像素是可选的,分别为4x4,5x5,6x6,8x8,10x10和12x12,单颜色块中放的像素越多那么压缩率越高,相应的质量也越差。

公式

像素大小 = 16-bytes / 分块宽高 * 8-bit;
压缩率 = 原始像素大小(32-bit) / 像素大小;
图像大小 = 原始图片大小 / 压缩率;

假设一张4MB的1024*1024原始图片:

块宽高像素大小(bits)压缩率压缩后图片大小
4*4841MB
5*55.126.25655KB
6*63.568.99455.62KB
8*8216256KB
10*101.2825163KB
12*120.8935.95113.93KB

图片大小(MB)=长x宽x像素大小(bits)/8/1024/1024

ASTC图片纹理压缩探讨
Unity3D - 关于ASTC压缩格式的一些资料搜集
Using ASTC Texture Compression for Game Assets
Texture compression formats for platform-specific overrides

纹理压缩格式——ASTC(转) - 码农教程

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值