关于为什么要拆分的解释

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