【改进版】Unity工程里图片的RGB和Alpha通道的分离

“这篇文章里有两个明显的问题:1. 处理Alpha贴图时是一个像素一个像素地处理,用Texture.SetPixel()函数。推荐批量处理,,用Texture.SetPixels()函数。推荐批量处理,用Texture.SetPixels()函数。”

改进之:

using UnityEngine; using System.Collections; using System.Collections.Generic; using UnityEditor; using System.IO; using System.Reflection;public class MaterialTextureForETC1{private static string defaultWhiteTexPath_relative = "Assets/Default_Alpha.png";private static Texture2D defaultWhiteTex = null;[MenuItem("EffortForETC1/Depart RGB and Alpha Channel")]static void SeperateAllTexturesRGBandAlphaChannel(){Debug.Log("Start Departing.");if (!GetDefaultWhiteTexture()){return;}string[] paths = Directory.GetFiles(Application.dataPath, "*.*", SearchOption.AllDirectories);foreach (string path in paths){if (!string.IsNullOrEmpty(path) && IsTextureFile(path) && !IsTextureConverted(path)) //full name{SeperateRGBAandlphaChannel(path);}}AssetDatabase.Refresh(); //Refresh to ensure new generated RBA and Alpha textures shown in Unity as well as the meta fileDebug.Log("Finish Departing.");}#region process texturestatic void SeperateRGBAandlphaChannel(string _texPath){string assetRelativePath = GetRelativeAssetPath(_texPath);SetTextureReadableEx(assetRelativePath); //set readable flag and set textureFormat TrueColorTexture2D sourcetex = Resources.LoadAssetAtPath(assetRelativePath, typeof(Texture2D)) as Texture2D; //not just the textures under Resources fileif (!sourcetex){Debug.LogError("Load Texture Failed : " + assetRelativePath);return;}TextureImporter ti = null;try{ti = (TextureImporter)TextureImporter.GetAtPath(assetRelativePath);}catch{Debug.LogError("Load Texture failed: " + assetRelativePath);return;}if (ti == null){return;}bool bGenerateMipMap = ti.mipmapEnabled; //same with the texture import settingTexture2D rgbTex = new Texture2D(sourcetex.width, sourcetex.height, TextureFormat.RGB24, bGenerateMipMap);rgbTex.SetPixels(sourcetex.GetPixels());Texture2D mipMapTex = new Texture2D(sourcetex.width, sourcetex.height, TextureFormat.RGBA32, true); //Alpha Channel needed heremipMapTex.SetPixels(sourcetex.GetPixels());mipMapTex.Apply();Color[] colors2rdLevel = mipMapTex.GetPixels(1); //Second level of MipmapColor[] colorsAlpha = new Color[colors2rdLevel.Length];if (colors2rdLevel.Length != (mipMapTex.width+1) / 2 * (mipMapTex.height+1) / 2){Debug.LogError("Size Error.");return;}bool bAlphaExist = false;for (int i = 0; i < colors2rdLevel.Length; ++i){colorsAlpha[i].r = colors2rdLevel[i].a;colorsAlpha[i].g = colors2rdLevel[i].a;colorsAlpha[i].b = colors2rdLevel[i].a;if (!Mathf.Approximately(colors2rdLevel[i].a, 1.0f)){bAlphaExist = true;}}Texture2D alphaTex = null;if (bAlphaExist){alphaTex = new Texture2D((sourcetex.width+1) / 2, (sourcetex.height+1) / 2, TextureFormat.RGB24, bGenerateMipMap);}else{alphaTex = new Texture2D(defaultWhiteTex.width, defaultWhiteTex.height, TextureFormat.RGB24, false);}alphaTex.SetPixels(colorsAlpha);rgbTex.Apply();alphaTex.Apply();byte[] bytes = rgbTex.EncodeToPNG();File.WriteAllBytes(assetRelativePath, bytes);byte[] alphabytes = alphaTex.EncodeToPNG();string alphaTexRelativePath = GetAlphaTexPath(_texPath);File.WriteAllBytes(alphaTexRelativePath, alphabytes);ReImportAsset(assetRelativePath, rgbTex.width, rgbTex.height);ReImportAsset(alphaTexRelativePath, alphaTex.width, alphaTex.height);Debug.Log("Succeed Departing : " + assetRelativePath);}static void ReImportAsset(string path, int width, int height){try{AssetDatabase.ImportAsset(path);}catch{Debug.LogError("Import Texture failed: " + path);return;}TextureImporter importer = null;try{importer = (TextureImporter)TextureImporter.GetAtPath(path);}catch{Debug.LogError("Load Texture failed: " + path);return;}if (importer == null){return;}importer.maxTextureSize = Mathf.Max(width, height);importer.anisoLevel = 0;importer.isReadable = false; //increase memory cost if readable is trueimporter.textureFormat = TextureImporterFormat.AutomaticCompressed;importer.textureType = TextureImporterType.Image;if (path.Contains("/UI/")){importer.textureType = TextureImporterType.GUI;}AssetDatabase.ImportAsset(path);}static void SetTextureReadableEx(string _relativeAssetPath) //set readable flag and set textureFormat TrueColor{TextureImporter ti = null;try{ti = (TextureImporter)TextureImporter.GetAtPath(_relativeAssetPath);}catch{Debug.LogError("Load Texture failed: " + _relativeAssetPath);return;}if (ti == null){return;}ti.isReadable = true;ti.textureFormat = TextureImporterFormat.AutomaticTruecolor;//this is essential for departing Textures for ETC1. No compression format for following operation.AssetDatabase.ImportAsset(_relativeAssetPath);}static bool GetDefaultWhiteTexture(){defaultWhiteTex = Resources.LoadAssetAtPath(defaultWhiteTexPath_relative, typeof(Texture2D)) as Texture2D; //not just the textures under Resources fileif (!defaultWhiteTex){Debug.LogError("Load Texture Failed : " + defaultWhiteTexPath_relative);return false;}return true;}#endregion#region string or path helperstatic bool IsTextureFile(string _path){string path = _path.ToLower();return path.EndsWith(".psd") || path.EndsWith(".tga") || path.EndsWith(".png") || path.EndsWith(".jpg") || path.EndsWith(".bmp") || path.EndsWith(".tif") || path.EndsWith(".gif");}static bool IsTextureConverted(string _path){return _path.Contains("_RGB.") || _path.Contains("_Alpha.");}static string GetRGBTexPath(string _texPath){return GetTexPath(_texPath, "_RGB.");}static string GetAlphaTexPath(string _texPath){return GetTexPath(_texPath, "_Alpha.");}static string GetTexPath(string _texPath, string _texRole){string dir = System.IO.Path.GetDirectoryName(_texPath);string filename = System.IO.Path.GetFileNameWithoutExtension(_texPath);string result = dir + "/" + filename + _texRole + "png";return result;}static string GetRelativeAssetPath(string _fullPath){_fullPath = GetRightFormatPath(_fullPath);int idx = _fullPath.IndexOf("Assets");string assetRelativePath = _fullPath.Substring(idx);return assetRelativePath;}static string GetRightFormatPath(string _path){return _path.Replace("\\", "/");}#endregion}

感悟了不同的人生。凌晨,随着滑轮接触地面,

【改进版】Unity工程里图片的RGB和Alpha通道的分离

相关文章:

你感兴趣的文章:

标签云: