原文地址 http://www.taidous.com/forum.php?mod=viewthread&tid=23762&wuid=44585
前言 在unity中。带有透明通道的图片压缩后。均会出现一定的质量的下降。并且带有透明通道的图片占用内存较大。之前一直没有想到解决方案。最近看了一个游戏项目。里面有一个很好的解决方案。我研究了一下。就分享出来了。
它的具体就是将透明通道和图片内容剥离开来。在用Shader合并。这样就能减少一半的大小。
效果及方法 首先。我们将图片放入tp中。类型悬着tga。然后导出。如下:
<ignore_js_op>
导出后。我们得到一个tga图片和一个txt配置。我们将tga用ps打开。然后找到图片的通道处:如下:
<ignore_js_op>
如上。我们选中Alpha 1.右键。删除该透明通道。然后将图片存储为bmp图片。
然后。我们可以在菜单中后退一步。或者重新打开没有删除透明通道的图片。执行如下操作。
1.选中Alpha1. 按 ctrl + c 复制改透明通道。
2.选中 红 通道。ctrl + v 粘贴通道。绿 蓝 通道执行同样的操作。
3.删除Alpha 1 透明通道。将图片保存为bmp。
最后得到如下文件
<ignore_js_op>
我们将图片移到Unity中。做成图集。然后给图集的材质球赋值我们的shader(Shader代码在最下)。
<ignore_js_op>
然后我们来对比下。普通的和剥离的效果区别:
<ignore_js_op>
效果没什么变化。然后。我们在看下另一个数据:
<ignore_js_op>
<ignore_js_op>
一张只有没剥离的四分之一。然后在加一张透明通道。也只是1M。
最后。我们看下内存监察的数据图:
<ignore_js_op>
1+1 ?= 8 数学不是很好。你们算算。
Shader代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
Shader
"Test/UIETC"
{
Properties
{
_MainTex
(
"Base (RGB)"
,
2
D
)
=
"white"
{
}
_AlphaTex
(
"AlphaTex"
,
2
D
)
=
"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"
sampler
2
D _MainTex;
sampler
2
D _AlphaTex;
float _AlphaFactor;
struct v
2
f
{
float
4
pos
:
SV_POSITION;
float
2
uv
:
TEXCOORD
0
;
float
4
color
:
COLOR;
}
;
half
4
_MainTex_ST;
half
4
_AlphaTex_ST;
v
2
f vert
(
appdata_full v
)
{
v
2
f o;
o.pos
=
mul
(
UNITY_MATRIX_MVP
,
v.vertex
)
;
o.uv
=
v.texcoord;
o.color
=
v.color;
return
o;
}
half
4
frag
(
v
2
f i
)
:
COLOR
{
half
4
texcol
=
tex
2
D
(
_MainTex
,
i.uv
)
;
half
4
result
=
texcol;
result
.a
=
tex
2
D
(
_AlphaTex
,
i.uv
)
*
i.color.a ;
return
result
;
}
ENDCG
}
}
}
|