unity游戏优化之ETC压缩和 Alpha通道处理
前言 在unity中。带有透明通道的图片压缩后。均会出现一定的质量的下降。并且带有透明通道的图片占用内存较大。之前一直没有想到解决方案。最近看了一个游戏项目。里面有一个很好的解决方案。我研究了一下。就分享出来了。
它的具体就是将透明通道和图片内容剥离开来。在用Shader合并。这样就能减少一半的大小。效果及方法 首先。我们将图片放入tp中。类型悬着tga。然后导出。如下:
导出后。我们得到一个tga图片和一个txt配置。我们将tga用ps打开。然后找到图片的通道处:如下:
如上。我们选中Alpha 1.右键。删除该透明通道。然后将图片存储为bmp图片。
然后。我们可以在菜单中后退一步。或者重新打开没有删除透明通道的图片。执行如下操作。
1.选中Alpha1. 按 ctrl + c 复制改透明通道。
2.选中 红 通道。ctrl + v 粘贴通道。绿 蓝 通道执行同样的操作。
3.删除Alpha 1 透明通道。将图片保存为bmp。
最后得到如下文件
我们将图片移到Unity中。做成图集。然后给图集的材质球赋值我们的shader(Shader代码在最下)。
然后我们来对比下。普通的和剥离的效果区别:
效果没什么变化。然后。我们在看下另一个数据:
一张只有没剥离的四分之一。然后在加一张透明通道。也只是1M。
最后。我们看下内存监察的数据图:
1+1 ?= 8 数学不是很好。你们算算。
Shader代码:
- Shader "Test/AlphaTex"
- {
- 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).r;
- result.a = tex2D(_AlphaTex,i.uv)*i.color.a ;
- return result;
- }
- ENDCG
- }
- }
- }