版权声明:本文为博主原创文章,未经博主允许不得转载。 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
}
}
}