关于为什么要拆分的解释
Unity在android上默认机制是当所用的平台支持ETC2时,会使用ETC2,当仅支持ETC1时会拆分alpha通道。而ios下通常不需要拆分alpha的,如果是考虑到贴图的大小非要拆分的话,是需要自己来实现的。简单的实现思路:写个插件来读取原贴图,分别获取颜色值和alpha,存储在两张贴图中。shader也需稍作修改,采样两张纹理,根据alpha纹理来混合颜色
前言
在Unity项目中,我们为了优化图片的压缩大小,会采用将RGBA图分离成一张ETC压缩格式的RGB图和一张alpha图的方式。
Unity图集压缩优化:RGBA分离成ETC和alpha(附shader代码):https://blog.csdn.net/linxinfa/article/details/88680013
Editor脚本
我们可以写一个Editor工具来完成 【生成alpha图】这样的工作。
代码如下:
//GenAlphaTexture.cs
using UnityEngine;
using UnityEditor;
using System.IO;
public class GenAlphaTexture
{
[MenuItem("GameTools/GenAlphaTexture")]
public static void StartGenAlphaTexture()
{
var textures = Selection.GetFiltered<Texture2D>(SelectionMode.DeepAssets);
foreach (var t in textures)
{
var path = AssetDatabase.GetAssetPath(t);
// 如果提示图片不可读,需要设置一下isReadable为true, 操作完记得再设置为false
// var imp = AssetImporter.GetAtPath(path) as TextureImporter;
// imp.isReadable = true;
// AssetDatabase.ImportAsset(path);
var newTexture = new Texture2D(t.width, t.height, TextureFormat.RGBA32, false);
var colors = t.GetPixels32();
var targetColors = newTexture.GetPixels32();
for (int i = 0, len = colors.Length; i < len; ++i)
{
var c = colors[i];
targetColors[i] = new Color32(c.a, c.a, c.a, c.a);
}
newTexture.SetPixels32(targetColors);
string fname = path.Split('.')[0] + "_a.png";
File.WriteAllBytes(fname, newTexture.EncodeToPNG());
// imp.isReadable = false;
// AssetDatabase.ImportAsset(path);
AssetDatabase.Refresh();
}
}
}
把上面的脚本放到Unity工程目录:Assets/Editor目录中
然后选中要处理的图片,然后点击菜单GameTools/GenAlphaTexture,就会在同目录中生成一张alpha通道的图。
我们把原图和生成的alpha图的压缩格式都设置成ETC 4 bits,这样大小加起来比原图大小还要小一半。
如果是iOS平台,因为没有ETC压缩格式,可以用PVRTC的压缩格式,但是必须是正方形尺寸的图片,否则就用RGB 16 bit的压缩格式。
平台 Android iOS
正方形图片 ETC 4 bits PVRTC 4 bits
长方形图片 ETC 4 bits RGB 16 bit