轉發收藏【原創】淺談UGUI的ETC1+A的紋理壓縮方案總結


這個信息很早了,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張紋理拖進去,

111.png


 
(4)在Canvas下面新建一個Image,選擇圖集的Sprite,並且選擇xia相應的材質賦值上去:

222.png


 
至此,大功告成!!

 


 鏈接: http://pan.baidu.com/s/1slDEGv7 密碼: quxy


免責聲明!

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



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