ASTC纹理压缩格式详解

article/2025/11/10 6:31:16

https://zhuanlan.zhihu.com/p/158740249

一、ASTC纹理压缩格式介绍

ASTC是在OpenGL ES3.0出现后在2012年中产生的一种业界领先的纹理压缩格式,它的压缩分块从4x4到12x12最终可以压缩到每个像素占用1bit以下,压缩比例有多种可选。ASTC格式支持RGBA,且适用于2的幂次方长宽等比尺寸和无尺寸要求的NPOT(非2的幂次方)纹理。

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

ASTC在压缩质量和容量上有很大的优势。

文档中有详细的测试数据:

Using ASTC Texture Compression for Game Assets​developer.nvidia.com图标

二、适配机型

1、iOS

苹果从A8处理器开始支持 ASTC,iPhone6及iPad mini 4以上iOS设备支持,2014年的iPhone 5s及iPad mini 3以前的设备不支持。

2、安卓

安卓主流压缩格式正在从ETC2转向ASTC。

Unity官方对安卓ASTC格式支持的说明:

https://docs.unity3d.com/Manual/class-TextureImporterOverride.html

官方文档中提到GPU对ASTC的支持情况:所有支持OpenGL ES 3.1和部分支持OpenGL ES 3.0的GPU。

鉴于OpenGL ES 3.0 GPU的不确定性,我们对一些当前用户占比较高的低配机型进行了ASTC格式兼容性测试,并补充了一些占比低的GPU型号Mali-G71、Adreno 306、Adreno 308、Adreno 405做测试(测试时间2020.5.21):

市面上大部分机型都支持OpenGL ES 3.1以上,少数GPU配置较低的机型支持OpenGL ES 3.0但不支持ASTC压缩格式,在2020年4月统计的市面占比不到1.5%,从个人角度看ASTC压缩格式是可以普及使用的。

补充:Unity官方文档2018.4版本中有介绍对ASTC压缩格式的支持:https://docs.unity3d.com/2018.4/Documentation/Manual/class-TextureImporterOverride.html

Texture Compression ASTC Platform Support:tvOS (all), iOS (A8), Android (PowerVR 6XT, Mali T600 series, Adreno 400 series, Tegra K1)

三、压缩比率的选择

前文我们了解了不同的ASTC格式的Bits Per Pixel(在本文中翻译为像素占用),为了更直观的感受,使用一张容易产生压缩失真的贴图进行示例。

1、ASTC与ETC2格式的压缩结果与容量对比

RGB8 vs ETC2 4bits vs ASTC 6x6

从上图可以看出,一张512x512尺寸的贴图(不带Alpha通道,开启Mipmap)的容量为1MB,压缩为ETC2 4 bits后容量为170.7KB,有明显失真,压缩为ASTC 6x6后容量为154.7KB,无明显失真,ASTC 6x6的容量小于ETC2 4 bits,压缩质量高于ETC2 4 bits。

ASTC 6x6 vs ETC2 4bits vs ASTC 8x8

从上图可以看出,压缩为ASTC 8x8后容量为85.4KB,容量约为ETC2 4 bits的50%,压缩质量高于ETC2 4 bits。

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

ASTC 6x6 vs ASTC 8x8 vs ASTC 10x10

从上图可以看出,一张512x512尺寸的贴图(不带Alpha通道),压缩为ASTC 6x6、ASTC 8x8、ASTC10x10后均无明显失真,压缩为ASTC 8x8后容量与ASTC 6x6相比减小了约44.8%,压缩为ASTC10x10后容量与ASTC 8x8相比减小了约33.7%。

以法线贴图举例:

RGB8 vs ASTC 4x4 vs ASTC 5x5 vs ASTC 6x6

从上图可以看出,一张512x512尺寸的法线贴图,压缩为ASTC 4x4无明显失真,压缩为ASTC 5x5肉眼可见失真,压缩为ASTC6x6后明显失真。

以面部贴图举例:

从上图可以看出,压缩为ASTC 6x6无明显失真,压缩为ASTC 8x8后肉眼可见失真。

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

结论与NV文档数据对比:

唯一有出入的地方是普通贴图的压缩选择ASTC 6x6还是ASTC 8x8,从个人角度,8x8的推荐指数应该为0。

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

ASTC 4x4 vs ASTC 5x5 vs ASTC 6x6

从上图可以看出,压缩为ASTC 5x5肉眼可见失真,压缩为ASTC 6x6后有明显失真,压缩为ASTC 5x5后容量与ASTC 4x4相比减小了约34.9%。在同一压缩格式下,带Alpha通道比不带Alpha通道的压缩质量下降明显。

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

结论与NV文档数据对比一致:

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

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

从上图可以看出,对于带Alpha通道的32位图和不带Alpha通道的24位图,选择同一压缩格式时,压缩结果有很大差异。

对于一张带Alpha通道的32位图,选择Import Settings中的Alpha Source为None,压缩结果与不带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的幂次方时,只要硬件支持该压缩格式,就可以使用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。

6)在项目实际使用中发现,对于法线贴图,ETC2 4bits的压缩效果比ASTC 5x5好,对于带透明通道的贴图,存在ETC2 8 Bits比ASTC 4x4更优的情况,之前在测试中漏掉了对比,还需要进一步对比,根据实际情况进行选择。


http://chatgpt.dhexx.cn/article/2YPfU7Uy.shtml

相关文章

astc纹理压缩格式

astc是当前android和ios平台下压缩最好的纹理格式,并且主流的机器基本都支持, astc:支持非2次幂的,2次幂的,等宽高的 一、ASTC纹理压缩格式介绍 ASTC是在OpenGL ES3.0出现后在2012年中产生的一种业界领先的纹理压缩格式。 它的压…

ASTC textures

ASTC textures 原文:https://arm-software.github.io/opengl-es-sdk-for-android/astc_textures.html This document describes usage of compressed ASTC textures. Introduction This tutorial shows how Adaptive Scalable Texture Compression (ASTC) can be …

[图形学]ASTC纹理压缩格式

纹理压缩的目的 1,降低内存,特别是移动端应用,内存占用不应过大,否则低端机很容易崩溃 2,降低带宽,手游类应用,在渲染时会有大量贴图传输到GPU,不限制的话不仅会严重影响渲染性能&a…

ASTC纹理压缩格式(Adaptive Scalable Texture Compression)

原文:这是一个pdf的下载链接 介绍 Adaptive Scalable Texture Compression(ASTC)是一种世界领先的新型纹理压缩格式。这种压缩格式已经加入Khronos标准,并已在某些硬件平台中提供。本文介绍了它的工作原理、使用方法和如何最大程度地使用它。更深入的信…

ASTC纹理压缩格式介绍

一、ASTC纹理压缩格式介绍 ASTC是在OpenGL ES 3.0出现后,在2012年中产生的一种业界领先的纹理压缩格式,它的压缩分块从4x4到12x12最终可以压缩到每个像素占用1bit以下,压缩比例有多种可选。ASTC格式支持RGBA,且适用于2的幂次方长宽…

选择软件人力外包公司看这几点没错

近几年,大数据、云计算等各种互联网技术飞速发展,深入到我们工作生活的各个角落。很多企业为了提升竞争力也加快了信息化建设的步伐,而信息化建设的关键就是软件人才,谁能快速构建真正高效的软件开发团队,谁就能先一步…

10 个Web3 设计灵感网站

10 个Web3 设计灵感网站:Cosmos、Axies Infinity、DeSo Foundation、Foundation App、Llama、Snapshot、Juicebox、Alchemy、RabbitHole 正如Twitter前首席执行官Jack Dorsey最近发的一条推文“你不拥有web3,但风险投资家拥有”,而Marc Andre…

web 服务器有哪些

<1>什么是web服务器 "网络服务"&#xff08;Web Service&#xff09;的本质&#xff0c;就是通过网络调用其他网站的资源。 Web Service架构和云 如果一个软件的主要部分采用了"网络服务"&#xff0c;即它把存储或计算环节"外包"给其他…

要不要进外包?

互联网行业的估计都听过这句话:外包&#xff0c;你是外包&#xff0c;麻烦不要偷吃公司零食&#xff0c;注意素质&#xff01; 事情是这样的:她说自己被外派到一家大公司上班&#xff0c;因为那家公司是大公司&#xff0c;在休息的时候还提供零食和下午茶。大家都知道女生爱吃…

为什么程序员做外包会被瞧不起?

二哥&#xff0c;有个事想询问下您的意见&#xff0c;您觉得应届生值得去外包吗&#xff1f;公司虽然挺大的&#xff0c;中xx&#xff0c;但待遇感觉挺低&#xff0c;马上要报到&#xff0c;挺纠结的。 以上是读者小 K 给我发的私信。除此之外&#xff0c;还有个读者 down 也问…

被迫选择了到了外包公司

即使大厂裁员下来的员工愿意被迫选择了到了外包公司&#xff0c;迫不得已做外包的工作&#xff0c;那么&#xff0c;中小型企业那势必也得裁员&#xff0c;为了接收从大厂下来的&#xff0c;有大厂背景的员工&#xff0c;那么就会裁掉自己公司的员工。 这样看来&#xff0c;这…

测试应届生是去自研小公司好还是外包公司好?

我不知道当年怎么想的&#xff0c;能在一个外包公司一干就是3年&#xff0c;后来终于跳出来了&#xff0c;现在的公司虽然不是什么大厂吧&#xff0c;但至少是个正经的互联网企业&#xff0c;待遇也不错。其实很多地方的朋友都有提到外包公司的一些弊端。 外包公司&#xff1a…

网站建设公司该不该把web前端外包出来!精辟

如今的网站建设公司其实过的并不好&#xff0c;一些建站平台、模板建站、仿站等都对网站定制造成了比较大的影响&#xff0c;网站建设公司如何降低用人成本、灵活的整合第三方资源成为度过“特殊时期”的重要手段&#xff0c;迎接下一波春天的到来。 网站建设公司该不该把前端…

外包公司面试门槛高吗?软件测试员进外包公司容易吗?

虽然很多测试人员都抵制外包&#xff0c;但实际情况则是依旧有大量软件测试员&#xff0c;选择加入到外包这个圈子。外包公司面试门槛高吗?外包公司容易进吗?本篇来解答一下这个问题。 外包公司面试门槛高吗&#xff1f; 外包的面试门槛&#xff0c;相对大厂要低很多。尤其…

我的web前端工作日记11------在腾讯外包的这一年

说在前面的话 本文只是大概说一下自己在腾讯做了一年前端外包的收获和一些心得感悟&#xff0c;希望自己能客观的描述&#xff0c;能给一些后来者参考取舍&#xff0c;看是否值得去腾讯做外包。写的没啥逻辑&#xff0c;都是想到啥就写啥&#xff0c;所以大家将就着看看。 一…

进程平均周转时间的计算

题目&#xff1a; 有4个进程A,B,C,D,设它们依次进入就绪队列&#xff0c;因相差时间很短可视为同时到达。4个进程按轮转法分别运行11,7,2,和4个时间单位&#xff0c;设时间片为1。四个进程的平均周转时间为 &#xff08;&#xff09;&#xff1f; 分析 要理解周转时间的含义&am…

操作系统进程完成时间,周转时间,带权周转时间, 平均周转时间, 带权平均周转时间计算

计算规则 周转时间作业完成时刻-作业到达时刻&#xff1b; 带权周转时间周转时间/服务时间&#xff1b; 平均周转时间作业周转总时间/作业个数&#xff1b; 平均带权周转时间带权周转总时间/作业个数&#xff1b;

平均周转时间和平均带权周转时间怎么算?

周转时间&#xff1a;从作业被提交给系统开始&#xff0c;到作业完成为止的这段时间间隔称为作业周转时间。 带权周转时间&#xff1a;即作业的周转时间T与系统为它提供服务的时间Ts之比&#xff0c;即W  T/Ts 周转时间 作业完成时刻 - 作业到达时刻带权周转时间 周转时间…

操作系统:周转时间和其他时间

1&#xff0c;周转时间 周转时间&#xff1a;作业被提交给系统开始&#xff0c;到作业完成为止的这段时间间隔。 包括&#xff1a;&#xff08;1&#xff09;作业在外存后备队列上的等待作业调度的时间。&#xff08;2&#xff09;进程在就绪队列上等待进程调度的时间。&#x…

多种调度算法的平均周转时间算例

有5个批处理的作业&#xff08;A、B、C、D和E&#xff09;几乎同时到达一个计算中心&#xff0c;估计的运行时间分别为2、4、6、8、10分钟&#xff0c;它们的优先数分别为1、2、3、4、5&#xff08;1为最低优先级&#xff09;。对下面的每种调度算法&#xff0c;分别计算作业的…