由于 Android 平台各种硬件标准的不统一,为了开发的软件项目能够在大部分 Android 机上完美运行,我们需要以较差的硬件支持为基础做准备。
Android 平台基本上都支持对不带 Alpha 通道的图片进行 ETC1 压缩。Android 4.3 由于对 OpenGL ES 3.0 的支持,添加了对透明图的 ETC2 压缩。
为了实现在大部分 Android 机上以低容量低存储以及处理图片,我们希望把一些比较大的透明图用RGB图替代,简言之就是把 PNG 图换成 JPG 图存储。
如何实现呢。要么是把透明通道单独提取出来作为另一张图进行存放。这样处理下可以节省 Android 平台下至少一半的开销。但是对 iOS 平台来说,则多了一张图的开销。当然,如果在项目设立之初就想到这个问题,那么完全可以分开打包。
针对大图往往是许多小图合成的图集 Atlas,且 GPU 在处理图片是总是需要 POT (Power of Two)大小的纹理这两个特性。另一种处理方式是把小图挤到半张 Atlas 里面,另外半张放透明度信息。这样处理, iOS 平台下的开销也就不会太大。其实,由于小图往往长宽比不规则,很多原本需要一张大图的Atlas完全可以放在半张图里面。
本文主要是介绍后面的处理方式。当然,也就讲个思路。先把图片排到半张图得到半图,再利用 Mali 的 TCT 工具获得所需的全图。最后写一个 Shader 来得到完整的图片信息。搞定。
Unity 相关知识点
Unity 对于平台不支持的压缩格式,会默认转为 RGBA 32bpp。而 Android 平台普遍支持的含透明度格式为 RGBA 16bpp。如果采用 RGB ETC 4bpp 的两幅图,那么需要 8bpp(使用该格式可能会导致遮罩出现问题)。如果能够把两幅图放在同一张纹理里面,那么能够再节省一半,大概4bpp(shader处理的时候会比较消耗GPU)。
Unity 在为 Android 打包时,默认对JPG采用 ETC1,对PNG采用 RGBA 16。
NPOT 的图最终会被转为 POT 的图,而且 Unity 会把 NPOT 的图会被转为 RGBA 32 格式 (GUI Texture 支持 NPOT,图片格式不会改,但是最终送 GPU 的时候还是会转为 POT)。
Mali 的 TCT 工具
命令行需要在bin目录下执行。觉得不方便可以把路径添加到环境变量 PATH,并把 .dll 文件都放到 C:WindowsSystem32
目录下(不知道是不是这里,笔者没这么干,这个步骤也是YY的。。)。
PNG 转为一半 JPG ,一半灰度图的 KTX 文件:
$ etcpack [文件名].png img -c etc1 -aa -ktx
KTX 转 JPG 格式(放到当前目录下的 myImage文件夹):
$ etcpack [文件名].ktx myImage -ext JPG
Shader
Shader 的框架部分抄的 Particle Add Scaling -AlphaBlended.shader
文件。在顶点着色中进行了简单的 MVP 转换。在片段着色中取图片上部分的RGB值,取下半部分的R值作为透明度。
几种主要的纹理格式
1. DXT
DXT 是 DirectX 提供的一种压缩格式。只能针对 POT 格式纹理进行处理。DDS 文件采用此种压缩方式进行文件存储。
支持的纹理格式 占用空间
DXT1 RGB5A1 4bpp 压缩比 4:1
DXT2 RGBA4444 8bpp 压缩比 2:1
DXT3 RGBA4444 同上 同上
DXT4 通过线性插值生成 Alpha 同上 同上
DXT5 同上 同上 同上
2. ETC
ETC1 (Ericsson Texture Compression) 仅仅支持 RGB 4bpp 的图,不支持 Alpha 通道。
OpenGL ES 3.0 能支持 ETC2,但是 Android 4.3 才开始支持 GLES 3.0。
ETC1 采用 4X4 的像素区域编入64位空间,也就是 4bpp。ETC 将像素区域分为4X2(2X4)两个部分。每个部分有一个基色,在基色基础上给两个部分分别 444RGB 的偏移或者 555RGB/333RGB的偏移。每个部分还有3位的亮度选择。 Each pixel is then offset from the base color by adding one of four signed values to the base color for its half of the 4×4 group.
关于ETC2的官方介绍
ETC 纹理压缩和 Alpha 通道处理
ETC 拼接图 Shader 的编码
3. PVRTC
PVRTC 分 4bpp 和 8bpp。具体的编码方式参见 Wiki 。
Understanding PowerVR Series5XT: PVRTC, PVRTC2 and texture compression (PVRTC的原理以及与其他压缩格式的对比的那个连接找不到了,也是在这个网站。。)