ASTC纹理压缩格式介绍
一、ASTC纹理压缩格式介绍
ASTC是在OpenGL ES 3.0出现后,在2012年中产生的一种业界领先的纹理压缩格式,它的压缩分块从4x4到12x12最终可以压缩到每个像素占用1bit以下,压缩比例有多种可选。ASTC格式支持RGBA,且适用于2的幂次方长宽等比尺寸和无尺寸要求的NPOT(非2的幂次方)纹理。
以ASTC 4x4 block压缩格式为例,每个像素占用1字节,8bits。一张1024x1024大小的贴图压缩后的大小为1MB。
ASTC在压缩质量和容量上有很大的优势。
文档中有详细的测试数据:Using ASTC Texture Compression for Game Assets | NVIDIA Developer
二、适配机型
1. iOS
苹果从A8处理器开始支持ASTC,iPhone6及iPad mini 4以上iOS设备支持,2014年的iPhone 5s及iPad mini 3以前的设备不支持。
2. 安卓
安卓主流压缩格式正在从ETC2转向ASTC。
Unity官方对安卓ASTC格式支持的说明:
Unity - Manual: Recommended, default, and supported texture formats, by platform
官方文档中提到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压缩格式的支持。
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格式的压缩结果与容量对比
从上图可以看出,一张512x512尺寸的贴图(不带Alpha通道,开启Mipmap)的容量为1MB,压缩为ETC2 4 bits后容量为170.7KB,有明显失真,压缩为ASTC 6x6后容量为154.7KB,无明显失真,ASTC 6x6的容量小于ETC2 4 bits,压缩质量高于ETC2 4 bits。
从上图可以看出,压缩为ASTC 8x8后容量为85.4KB,容量约为ETC2 4 bits的50%,压缩质量高于ETC2 4 bits。
2. 无Alpha通道,RGB 24 位/像素的压缩格式选择
从上图可以看出,一张512x512尺寸的贴图(不带Alpha通道),压缩为ASTC 6x6、ASTC 8x8、ASTC 10x10后均无明显失真,压缩为ASTC 8x8后容量与ASTC 6x6相比减小了约44.8%,压缩为ASTC 10x10后容量与ASTC 8x8相比减小了约33.7%。
以法线贴图举例:
从上图可以看出,一张512x512尺寸的法线贴图,压缩为ASTC 4x4无明显失真,压缩为ASTC 5x5肉眼可见失真,压缩为ASTC 6x6后明显失真。
以面部贴图举例:
从上图可以看出,压缩为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 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的幂次方纹理比其他尺寸更优,这里有复杂的图形学因素。
参考文章:《OpenGL支持非二次幂纹理的底层原理是什么?》
简单的理解,贴图在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较低的像素占比,如ASTC 8x8。
6)在项目实际使用中发现,对于法线贴图,ETC2 4bits的压缩效果比ASTC 5x5好,对于带透明通道的贴图,存在ETC2 8 Bits比ASTC 4x4更优的情况,之前在测试中漏掉了对比,还需要进一步对比,根据实际情况进行选择。
A通道细节多的情况下,选择ASTC,A通道细节少的情况下,选择ETC2。
这是侑虎科技第1117篇文章,感谢作者Ssiya供稿。欢迎转发分享,未经作者授权请勿转载。如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)
作者主页:Ssiya - 知乎
再次感谢Ssiya的分享,如果您有任何独到的见解或者发现也欢迎联系我们,一起探讨。(QQ群:793972859)
ASTC纹理压缩格式介绍相关推荐
- unity 纹理压缩格式‘_[2018.1]Unity贴图压缩格式设置
一.移动平台GPU 参考文档: 各种移动GPU压缩纹理的使用方法 - LuMing - 博客园www.cnblogs.com 1.Imagination Technologies的PowerVR S ...
- Unity常见纹理压缩格式
前言:本人一直对RGB16bit有一个疑惑,比如RGB565其表值范围只有(32,64,32)如何能表示0-255,今天就用这篇文章梳理一下. 预备知识: 一个字节有8位:1byte = 8 bit. ...
- Unity 之 纹理类型导入设置和压缩格式介绍
Unity 之 纹理类型导入设置和压缩格式介绍 一,纹理相关 1.1 导入设置 1.2 支持格式 二,纹理类型 2.1 纹理类型说明 2.2 纹理尺寸大小 三,所有支持的纹理压缩格式 一,纹理相关 1 ...
- unity 纹理压缩格式‘_纹理优化:让你的纹理也“瘦”下来
在上一期<纹理优化:不仅仅是一张图片那么简单>中,我们针对纹理相关的优化,挑选了部分知识点分析.无论是大家在开发时的疏忽,还是对相关知识点的理解不足,这些问题的积累最终都会反映到项目的性能 ...
- 关于cocosCreator纹理压缩的介绍
最近看关于cocosCreator的优化文章,发现纹理优化这块有很大的空间可以操作,于是打算写一篇关于纹理压缩的文章记录一下学习过程. 一.压缩纹理是什么 在游戏中纹理占用了相当大的包体积,但GPU无 ...
- 显存优化:纹理压缩功能介绍与使用说明
由于近期在开发者群里发现一些开发者对纹理压缩不太理解,遇到一些使用上的问题,所以本次文章中对纹理压缩进行详细的说明和使用上的介绍,希望能对有需求的开发者带来帮助. 本篇文章已经先更新到官网的文档中,也 ...
- Unity 优化翻译官方文档(二) ------ 平台特定覆盖的纹理压缩格式
官方文档 : https://docs.unity3d.com/Manual/class-TextureImporterOverride.html 虽然Unity支持许多常见的图像格式作为导入纹理的源 ...
- 文件格式和压缩格式介绍
文件格式和压缩格式介绍 一.常用的文件存储格式 TEXTFILE textfile为默认格式,存储方式为行式存储,在检索时磁盘开销大 数据解析开销大,而对压缩的text文件 hive无法进行合并和拆分 ...
- 常用纹理和纹理压缩格式
简单纹理格式 RGBA8888 每个像素4字节,RGBA通道各占用8位 RGBA4444 每个像素2字节,RGBA通道各占用4位 RGB888 每个像素3字节,RGB通道各占用8位,无透明通道 RGB ...
- 各种压缩格式介绍!(摘录2)
http://xpatrick.spaces.live.com/ 简述:DivX和Xvid的历史与未来,基于MPEG-4的两种影音压缩技术 简述:DivX和Xvid的历史与未来,基于MPEG-4的两种 ...
最新文章
- 服务器画热图显示无效的变量,使用pheatmap包绘制热图
- 皮一皮:这是仙女用的嘛?
- Maven-EclipseEE使用Maven构建Java web项目从0到1
- 2017广东工业大学程序设计竞赛决赛 题解源码(A,数学解方程,B,贪心博弈,C,递归,D,水,E,贪心,面试题,F,贪心,枚举,LCA,G,dp,记忆化搜索,H,思维题)...
- 【NLP】情感分析实战:金融市场中的NLP
- xavier初始化_深入解读xavier初始化(附源码)
- python函数(一)
- 巨蟒python全栈开发-第6天 is==
- 迈足狂奔!铁塔公司:目前北京已建好4400多座大型5G基站
- Builder模式的误区:将复杂对象的构建进行封装,就是Builder模式了吗?
- 自己编译操作系统,安装systemtap
- Bartender模板三种动态图片设置方法(仅供参考)
- 面试必备:消息队列原理和选型(荣耀典藏版)
- 高性能内存分配器 jemalloc 基本原理
- 学计算机的逻辑学博士,逻辑学博士点
- aptana手动配置python环境_Python学习1:使用Aptana构建Python开发环境
- 未能从dhcp服务器获得ip地址,当出现无法从DHCP服务器中获得地址的常见处理步骤...
- 嘉应大学黄林鑫计算机学院,林鑫-中国科学院大学-UCAS
- 泰坦尼克号乘客生存情况分析之第二部分特征工程
- Ubuntu下用Emacs编写D语言程序
热门文章
- 某公司的雇员分为以下若干类: Employee:这是所有员工总的父类.属性:员工的姓名,员工的生日月份。 方法:getSalary(intmonth)
- 计算机两个活动分区,硬盘无法设置活动分区,硬盘只能有一个活动分区吗
- 从Transformer、BERT到GPT2和XLNet:高端玩家如何用论文互怼
- hadoop 编程规范(hadoop专利分析)
- 【Java加密】JCA体系结构
- 计算机与音乐整合的教学设计,小学音乐课程整合研究《郊游》优秀教学设计
- linux mysql.sock文件_关于linux上mysql.sock文件的个人理解
- 智障Sloth的第108次启动mininet链接控制器失败的原因
- (79)【按键】[独立按键] - 1: 单击,双击,三击以及N击
- 自考CISSP信息分享