Unity图集压缩优化:RGBA分离成ETC和alpha(附shader代码)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/linxinfa/article/details/88680013

在unity中,带有透明通道的图片压缩后,会出现一定的质量的下降,并且带有透明通道的图片占用内存较大。我们可以将RGBA图分离成一张RGB图和一张alpha图,重新设置压缩格式,在用shader合并,这样大小可以减少一半。

Unity通过RGBA图生成alpha通道的图:https://blog.csdn.net/linxinfa/article/details/87861218

android平台

我们把原图和生成的alpha图的压缩格式都设置成ETC 4 bits,这样大小加起来比原图大小还要小一半。

iOS平台

因为没有ETC压缩格式,可以用PVRTC 4 bits的压缩格式,但是必须是正方形尺寸的图片,否则会变形;如果是长方形尺寸的图片,就用RGB 16 bit的压缩格式。

Unity检测图集是否是正方形并且检测它的压缩格式是否是PVRTC:https://blog.csdn.net/linxinfa/article/details/86657128

压缩格式表

平台 Android iOS
正方形图片 ETC 4 bits PVRTC 4 bits
长方形图片 ETC 4 bits RGB 16 bit

shader脚本:合并一张RGB图和一张alpha图

// 合并一张ETC压缩的RGB图和一张alpha图
Shader "Test/UIETC" 
{
    Properties 
        {
                 _MainTex ("Base (RGB)", 2D) = "white" { }
                 _AlphaTex("AlphaTex",2D) = "white"{}
                 }
    SubShader
        {

                 Tags
                 {
                        "Queue" = "Transparent+1"
                 }
         Pass
                 {
                        Lighting Off
                        ZTest Off
                        Blend SrcAlpha OneMinusSrcAlpha
                        Cull Off
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag

                        #include "UnityCG.cginc"

                        sampler2D _MainTex;
                        sampler2D _AlphaTex;

                        float _AlphaFactor;
                
                        struct v2f 
                        {
                                float4  pos : SV_POSITION;
                                float2  uv : TEXCOORD0;
                                float4 color :COLOR;
                        };

                        half4 _MainTex_ST;
                        half4 _AlphaTex_ST;

                        v2f vert (appdata_full v)
                        {
                                v2f o;
                                o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
                                o.uv =  v.texcoord;
                                o.color = v.color;
                                return o;
                        }

                        half4 frag (v2f i) : COLOR
                        {
                                half4 texcol = tex2D (_MainTex, i.uv);

                                half4 result = texcol;

                                result.a = tex2D(_AlphaTex,i.uv)*i.color.a ;

                                return result;
                        }
                        ENDCG
                 }
    }
}

猜你喜欢

转载自blog.csdn.net/linxinfa/article/details/88680013
今日推荐