当打包一个特别大的图集时候该怎么减小图集大小?
2017-03-16 22:24
381 查看
http://blog.csdn.net/sinat_20559947/article/details/50257259
在unity中。带有透明通道的图片压缩后。均会出现一定的质量的下降。并且带有透明通道的图片占用内存较大。之前一直没有想到解决方案。最近看了一个游戏项目。里面有一个很好的解决方案。我研究了一下。就分享出来了。
它的具体就是将透明通道和图片内容剥离开来。在用Shader合并。这样就能减少一半的大小。
导出后。我们得到一个tga图片和一个txt配置。我们将tga用ps打开。然后找到图片的通道处:如下:
如上。我们选中Alpha 1.右键。删除该透明通道。然后将图片存储为bmp图片。
然后。我们可以在菜单中后退一步。或者重新打开没有删除透明通道的图片。执行如下操作。
1.选中Alpha1. 按 ctrl + c 复制改透明通道。
2.选中 红 通道。ctrl + v 粘贴通道。绿 蓝 通道执行同样的操作。
3.删除Alpha 1 透明通道。将图片保存为bmp。
最后得到如下文件
我们将图片移到Unity中。做成图集。然后给图集的材质球赋值我们的shader(Shader代码在最下)。
然后我们来对比下。普通的和剥离的效果区别:
效果没什么变化。然后。我们在看下另一个数据:
一张只有没剥离的四分之一。然后在加一张透明通道。也只是1M。
最后。我们看下内存监察的数据图:
plain copy
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
}
}
}
在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。
最后。我们看下内存监察的数据图:
Shader代码
[csharp] viewplain copy
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
}
}
}
工程下载地址
链接:http://pan.baidu.com/s/1jGtKLMY 密码:lxhw相关文章推荐
- 【NGUI】当打包一个特别大的图集时候该怎么减小图集大小?
- 在编写网站的时候,给一个div设置背景图片,怎么让这个图片随着div大小的改变,而等比例的缩放。
- 写给自己过去疯狂的一年(2)(写在一个特别的时候)
- [ASP.NET]在asp.net(C#)中怎么获得一个目录的大小?
- Socket中接受tcp数据包,怎么让他receive的时候,就接一个数据包?
- 在asp.net(C#)中怎么获得一个目录的大小?
- 有懂discuz的吗?我需要在我自己的系统注册一个账号的时候,也把当前注册的账号放在discuz的用户里面。应该怎么做呀。需要discuz和java的接口吗?需要更改哪些东西。
- 一个WINFORM上面有两个DataGrid,当选中其中一个的时候,怎么让另一个CurrentRowIndex变成空?
- 每次看到某个数据结构的时候,有两个指针,一个起始,一个结束,一直没想明白为何是起始与结束,不是起始加数量,是怎么操作的?
- Linux多线程编程的时候怎么查看一个进程中的某个线程是否存活
- 小数,分数,百分数及倍数的怎么表达?怎么读? kira86 于2010-07-07发布 l 已有1958人浏览增大字体 减小字体 常态文玩 数百名外教任意选,每天陪你练口语 一个积分学英语,您的账户
- 在asp.net(C#)中怎么获得一个目录的大小?
- 安装程序打包的时候,怎么象petshop一样,把数据库也打到里边
- 好比你有一个衣橱,里面塞满了各种衬衫,你会怎么整理这些衬衫,好让你以后找衬衫的时候容易些? - Google, 谷歌,百度,baidu,阿里巴巴,alibaba,微软,华为,huawei面试题,
- c大小的程序。 b 怎么用turboC编辑一个比较a
- Linux多线程编程的时候怎么查看一个进程中的某个线程是否存活
- 打包的时候,怎么象petshop一样,把数据库也打到里边
- VB Excel 增加一个新sheet 的时候,怎么判断是否存在
- 怎么在页面还没有加载完成时候,在页面上显示一个:"数据加载中......"
- 在VS2005编程中,有的时候DataGridView数据源有几个表的联合查询,而系统又有限制为一个表,怎么办?