https://blog.csdn.net/linxinfa/article/details/87861218
關於為什么要拆分的解釋
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
