Unity通過RGBA圖生成alpha通道的圖


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




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM