因为 Android 平台各类硬件标准的不统一,为了开发的软件项目可以在大部分 Android 机上完美运行,咱们须要以较差的硬件支持为基础作准备。php
Android 平台基本上都支持对不带 Alpha 通道的图片进行 ETC1 压缩。Android 4.3 因为对 OpenGL ES 3.0 的支持,添加了对透明图的 ETC2 压缩。css
为了实如今大部分 Android 机上以低容量低存储以及处理图片,咱们但愿把一些比较大的透明图用RGB图替代,简言之就是把 PNG 图换成 JPG 图存储。html
如何实现呢。要么是把透明通道单独提取出来做为另外一张图进行存放。这样处理下能够节省 Android 平台下至少一半的开销。可是对 iOS 平台来讲,则多了一张图的开销。固然,若是在项目设立之初就想到这个问题,那么彻底能够分开打包。框架
针对大图每每是许多小图合成的图集 Atlas,且 GPU 在处理图片是老是须要 POT (Power of Two)大小的纹理这两个特性。另外一种处理方式是把小图挤到半张 Atlas 里面,另外半张放透明度信息。这样处理, iOS 平台下的开销也就不会太大。其实,因为小图每每长宽比不规则,不少本来须要一张大图的Atlas彻底能够放在半张图里面。tcp
本文主要是介绍后面的处理方式。固然,也就讲个思路。先把图片排到半张图获得半图,再利用 Mali 的 TCT 工具得到所需的全图。最后写一个 Shader 来获得完整的图片信息。搞定。ide
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)。编码
命令行须要在bin目录下执行。以为不方即可以把路径添加到环境变量 PATH,并把 .dll 文件都放到 C:\Windows\System32\
目录下(不知道是否是这里,笔者没这么干,这个步骤也是YY的。。)。es5
PNG 转为一半 JPG ,一半灰度图的 KTX 文件:
$ etcpack [文件名].png img -c etc1 -aa -ktx
KTX 转 JPG 格式(放到当前目录下的 myImage文件夹):
$ etcpack [文件名].ktx myImage -ext JPG
Shader 的框架部分抄的 Particle Add Scaling -AlphaBlended.shader
文件。在顶点着色中进行了简单的 MVP 转换。在片断着色中取图片上部分的RGB值,取下半部分的R值做为透明度。
DXT 是 DirectX 提供的一种压缩格式。只能针对 POT 格式纹理进行处理。DDS 文件采用此种压缩方式进行文件存储。
支持的纹理格式 占用空间
DXT1 RGB5A1 4bpp 压缩比 4:1
DXT2 RGBA4444 8bpp 压缩比 2:1
DXT3 RGBA4444 同上 同上
DXT4 经过线性插值生成 Alpha 同上 同上
DXT5 同上 同上 同上
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 的编码
PVRTC 分 4bpp 和 8bpp。具体的编码方式参见 Wiki 。
Understanding PowerVR Series5XT: PVRTC, PVRTC2 and texture compression (PVRTC的原理以及与其余压缩格式的对比的那个链接找不到了,也是在这个网站。。)