介绍

Unity Android 平台支持 ETC1 纹理格式,但是 ETC1 不支持 Alpha 通道,如果使用的话需要单独一张 Alpha 通道贴图,并在 Shader 中合并输出。

Unity 默认支持自动将贴图分离 RGB 通道与 Alpha 通道到单独的贴图,UGUI 会自动选择正确的 Shader 显示,如果使用了自定义的 Shader,那么需要自行编写支持 Alpha 分离的版本。

现在 Android 平台一般都使用 ETC2 作为默认纹理格式,ETC1 主要用于低端机。

方案

贴图 Android 平台选项:Split Alpha Channel

Allows splitting of imported texture into RGB+A so that ETC1 compression can be applied (Android only, and works only on textures that are a part of some atlas).

Unity 官方支持文档中已经介绍了如何实现支持贴图 Alpha 通道分离的 Shader。

如果想要在 Shader 中增加对分离 Alpha 通道的支持,只需要增加一个 _AlphaTex 的贴图属性,然后修改 Shader,从这个贴图中提取透明度来参与原来的计算。具体细节可以参考官方 UI Shader,可以对比两个文件查找差异:

注意:以上两个链接不是 Unity 官方链接,Unity 只在官方网站上提供下载,Unity - Download Archive,点击想要下载版本的下拉框,选择 Built in shaders 下载。

测试

为了验证 Unity 可以自动分离贴图并正确显示,可以手动构造一个 Demo 工程,将贴图设为 ETC1,开启 Split Alpha Channel,放在 UI 中显示出来,并打包成 Android 的 APK。

使用 RenderDoc 抓取 Demo 运行的帧,可以清楚地看到,Unity 正确地将 Atlas 拆分成了两张贴图,UI 使用 UIDefault-ETC1 Shader 渲染。

注意:只有在真机上才能看到贴图分离,Unity 编辑器下是没有效果的。

推荐

下面这两个方案都是通过修改打包时 Sprite 的数据来支持分离 Alpha 通道。

下面这是一个完整的工具:批量分离 Alpha 纹理、还原分离 Alpha 纹理、创建纹理 Atlas、从 AssetBundle 中加载 Shader、从 AssetBundle 中加载 Atlas。