這個信息很早了,2016年6月研究出來的,當時分享在ulua群1共享里面,然后就被大家的文件淹沒了,但是這個話題並不老,這不整理群共享空間的時候,被我翻出來了,拿來炒炒。
ETC1+A還是目前業內絕大多數手游紋理壓縮方案,因為ETC2依賴於OpenGL3.0,而安卓的OpenGL3依賴於Android 4.3.0,如果不支持OpenGL3的話,系統會自動軟解碼紋理壓縮,但是U3D處理這塊很麻煩,要自己分割Alpha通道出來,然后再修改shader合並Alpha,挺麻煩的。
Unity5.2開始吧就有個選項:
當時看到這個選項挺興奮的,因為引擎總是自身支持ETC1+A了,我們終於不用瞎折騰了,經過測試,UGUI並不支持這個選項,什么yis意思:就是說你如果用UGUI的Image組件,它的Sprite並不能使用這個選項,設置也沒卵用。fuck,那要你干嘛?后來翻了下unity官方論壇,弄了半天說是只有Sprite Renderer才支持,也就是2D/Sprite組件,但是,我想要UGUI支持咋辦?官方給出的jie結論是:未來支持。。。
既然官方靠不住,那就自己研究吧,UGUI自帶的Sprite Packerbie別指望了,完全黑箱操作,你也沒法干預,這塊直接放棄掉,想起了在NGUI時代就盛行的Texture Packer,經過研究終於搞定了。
分3部分:
(1)Editor腳本,將RGBA的紋理分割為RGB+A,然后將兩張紋理分別用ETC1壓縮。
Texture2D aTex = new Texture2D(tex.width, tex.height, TextureFormat.ARGB32, false); Color newColor = new Color(0f, 0f, 0f); for (int i = 0; i < tex.width; ++i) { for (int j = 0; j < tex.height; ++j) { newColor = tex.GetPixel(i, j); //rgbTex.SetPixel(i, j, newColor); newColor.r = newColor.a; newColor.g = 0; newColor.b = 0; aTex.SetPixel(i, j, newColor); } } string path = oldPath.Substring(0, oldPath.LastIndexOf(".")); byte bytes = aTex.EncodeToPNG(); File.WriteAllBytes(path + "_ETC1_A.png", bytes);
(2)shader部分,從官方自帶的builtin_shaders-5.2.3p3里面解壓出UI-Default.shader放入工程,然后修改代碼:
fixed4 frag(v2f IN) : SV_Target { half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color; fixed4 alpha = tex2D(_AlphaTex, IN.texcoord); if (_UseClipRect) color *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect); if (_UseAlphaClip) clip (color.a - 0.001); color.a = color.a * alpha.r; return color; }
上面代碼就是簡單的合並了alpha通道。
(3)然后新建一個材質,選擇修改后的shader,將第一步生成的2張紋理拖進去,
(4)在Canvas下面新建一個Image,選擇圖集的Sprite,並且選擇xia相應的材質賦值上去:
至此,大功告成!!
鏈接: http://pan.baidu.com/s/1slDEGv7 密碼: quxy