unity游戏优化之ETC压缩和 Alpha通道处理

前言  在unity中。带有透明通道的图片压缩后。均会出现一定的质量的下降。并且带有透明通道的图片占用内存较大。之前一直没有想到解决方案。最近看了一个游戏项目。里面有一个很好的解决方案。我研究了一下。就分享出来了。

  它的具体就是将透明通道和图片内容剥离开来。在用Shader合并。这样就能减少一半的大小。
效果及方法  首先。我们将图片放入tp中。类型悬着tga。然后导出。如下:
unity游戏优化之ETC压缩和 Alpha通道处理 

  导出后。我们得到一个tga图片和一个txt配置。我们将tga用ps打开。然后找到图片的通道处:如下:
unity游戏优化之ETC压缩和 Alpha通道处理 
  如上。我们选中Alpha 1.右键。删除该透明通道。然后将图片存储为bmp图片。
  然后。我们可以在菜单中后退一步。或者重新打开没有删除透明通道的图片。执行如下操作。
  1.选中Alpha1. 按 ctrl + c 复制改透明通道。
  2.选中 红 通道。ctrl + v 粘贴通道。绿 蓝 通道执行同样的操作。
  3.删除Alpha 1 透明通道。将图片保存为bmp。

  最后得到如下文件
unity游戏优化之ETC压缩和 Alpha通道处理 
  我们将图片移到Unity中。做成图集。然后给图集的材质球赋值我们的shader(Shader代码在最下)。
unity游戏优化之ETC压缩和 Alpha通道处理 
  然后我们来对比下。普通的和剥离的效果区别:
unity游戏优化之ETC压缩和 Alpha通道处理 
  效果没什么变化。然后。我们在看下另一个数据:
unity游戏优化之ETC压缩和 Alpha通道处理 

unity游戏优化之ETC压缩和 Alpha通道处理 

  一张只有没剥离的四分之一。然后在加一张透明通道。也只是1M。
  最后。我们看下内存监察的数据图:
unity游戏优化之ETC压缩和 Alpha通道处理 

  1+1 ?= 8   数学不是很好。你们算算。

Shader代码:

[csharp] view plain copy
  1. Shader "Test/AlphaTex"  
  2. {  
  3.     Properties  
  4.     {  
  5.         _MainTex ("Base (RGB)", 2D) = "white" { }  
  6.         _AlphaTex("AlphaTex",2D) = "white"{}  
  7.     }  
  8.     SubShader  
  9.     {  
  10.         Tags  
  11.         {  
  12.             "Queue" = "Transparent+1"  
  13.         }  
  14.         Pass  
  15.         {  
  16.             Lighting Off  
  17.             ZTest Off  
  18.             Blend SrcAlpha OneMinusSrcAlpha  
  19.             Cull Off  
  20.             CGPROGRAM  
  21.             #pragma vertex vert  
  22.             #pragma fragment frag  
  23.  
  24.             #include "UnityCG.cginc"  
  25.   
  26.             sampler2D _MainTex;  
  27.             sampler2D _AlphaTex;  
  28.   
  29.             float _AlphaFactor;  
  30.   
  31.             struct v2f  
  32.             {  
  33.                     float4  pos : SV_POSITION;  
  34.                     float2  uv : TEXCOORD0;  
  35.                     float4 color :COLOR;  
  36.             };  
  37.   
  38.             half4 _MainTex_ST;  
  39.             half4 _AlphaTex_ST;  
  40.   
  41.             v2f vert (appdata_full v)  
  42.             {  
  43.                     v2f o;  
  44.                     o.pos = mul (UNITY_MATRIX_MVP, v.vertex);  
  45.                     o.uv =  v.texcoord;  
  46.                     o.color = v.color;  
  47.                     return o;  
  48.             }  
  49.   
  50.             half4 frag (v2f i) : COLOR  
  51.             {  
  52.                 half4 texcol = tex2D (_MainTex, i.uv);  
  53.                 half4 result = texcol;  
  54.      
  55.          //     result.a = tex2D(_AlphaTex,i.uv).r;  
  56.   
  57.                 result.a = tex2D(_AlphaTex,i.uv)*i.color.a ;  
  58.   
  59.                 return result;  
  60.             }  
  61.             ENDCG  
  62.         }  
  63.     }  
  64. }