Unity本身支持多种贴图格式,比如jpg、png、psd等。但是当这些资源导入后,Unity会统一转化为自己的格式(非直接更改源文件),以供游戏运行时使用。
压缩纹理的主要目的是为了节省空间,缩短加载时间。针对不同的需求和平台需要不同的压缩格式,有的需要高性能,有的需要高质量,Unity本身提供了多种压缩格式供选择。
ETC
Ericsson Texture Compression,是由 Khronos 支持的开放标准,在移动平台中广泛采用。它是一种为感知质量设计的有损算法,其依据是人眼对亮度改变的反应要高于色度改变。类似于DXT,ETC也是把4×4的像素块压缩成一个64或128位的数据块,也是有损压缩。
ETC又分为ETC1和ETC2,通常用于Android平台。其中ETC2是较新的标准,也是Unity官方推荐的格式(虽然我还不太理解)。
相对于ETC1,ETC2向前兼容,不强制要求贴图大小为2的整数次幂,且对RGB的压缩质量更好,支持透明通道。唯一的缺点是需要设备支持OpenGL ES 3.0标准。不过该标准诞生于2012年,目前不支持它的设备非常少,因此不用担心。
注意:可对具有 Alpha 通道的纹理使用 ETC1 格式,但仅当构建目标为 Android 且纹理放置在图集上(通过指定打包标签)时才适用。要启用此功能,请勾选纹理的 Compress using ETC1 复选框。Unity 会将生成的图集拆分为两个纹理,每个纹理都没有 Alpha 通道,然后将它们组合在渲染管线的最后部分中。
PVRTC
PowerVR Texture Compression,PVRTC格式与基于块的压缩格式,比如S3TC、ETC的不同之处是,它使用2张双线性放大的低分辨率图,根据精度和每个像素的权重,融合到一起来呈现纹理,并且2-bpp和4-bpp都支持ARGB数据。PVRTC格式压缩比高,也是有损压缩。
PVRTC格式一般用于iOS平台,可以用在所有的iOS设备上。缺点是要求纹理的高、宽必须都是2的整数次幂(POT),最小为8,并且必须是正方形。
注意:使用该格式,极端情况下会让内存占用变得更大。比如原先300*300的贴图,因为要求尺寸为2的整数次幂,所以变成512*512 . 这种情况下还不如使用RGBA16 .
RGBA16
RGBA16,即RGBA4444,每个像素2个字节,RGBA通道各占4位。
相比以上压缩格式,贴图质量相对较好,缺点是内存占用大,且相对于RGBA32来说会有色彩断层问题。
RGBA32
RGBA32,即RGBA8888,每个像素4个字节,RGBA通道各占8位。
原图无压缩,质量最好 ,缺点是内存占用极大。除非美术要求极高才会使用。
假如贴图没有透明通道则使用RGB24格式,少占用一个字节的空间。
ASTC
ASTC 是在 OpenGL ES3.0 出现后在 2012 年中产生的一种业界领先的纹理压缩格式,它的压缩分块从 4×4 到 12×12 最终可以压缩到每个像素占用 1bit 以下,压缩比例有多种可选。ASTC 格式支持 RGBA,且适用于 2 的幂次方长宽等比尺寸和无尺寸要求的 NPOT(非 2 的幂次方)纹理。
目前我最推荐使用的一种压缩格式,优点是压缩质量高,显示质量好,且Android和iOS平台都可以使用,比较省心。压缩质量从4×4到12×12,按需选择。
缺点和ETC2差不多,老设备不支持。其中iOS设备从iPhone 5s才开始支持,Android主流压缩格式也正在从ETC2转向ASTC(这也是我不太理解Unity还在推荐ETC2的原因)。另一个小缺点是压缩时间稍长,不过也不是问题。
所以长期来看,ASTC将一统江湖!
结论
综上来看,新项目的贴图基本可以无脑使用ASTC,这里有张图,有个大佬总结出来的。
不过尽管ASTC支持非二次幂纹理,但在时机开发中还是建议UI及美术尽量制作二次幂纹理。
具体可参考:https://www.zhihu.com/question/376921536/answer/1063272336