Unity3D小教程:纹理格式

发表于2016-06-21
评论0 1.03w浏览

Unity支持多种纹理格式(注:不是图片文件格式),不同的纹理格式会导致包的大小和内存占用上有所区别。unity打包时,会将图片文件直接保存为纹理格式数据,猜测这样做的目的是为了避免运行时解码的消耗,所以不同的纹理格式会影响最终的打包大小。

上图中标记的大小就是指纹理对象所占的内存大小,以及打包时,图片压缩之前的大小。

通常会分为4种方式压缩纹理,如下表

PC
android
ios
最高质量
RGBA32
RGBA32
RGBA32
压缩方式一
RGBA16
RGBA16
RGBA16
压缩方式二
DXT5
RGBA ETC 8 bits
RGB PVR 4bits
压缩方式三
DXT1
RGB ETC 4 bits + RGB ETC 4 bits
RGB PVR 4bits + RGB PVR 4 bits

Unity中纹理格式一般为:X (Y) Z bits,X是指像素的通道,通常是RGBA,RGB等;Y是指压缩格式,PC有DXT1,DXT5,android有ETC,ETC2,ios有PVR等;Z是指像素所占字节数,有32, 16, 8, 4, 2等,这个值越小说明所占内存越小,也表明质量越低。

最高质量:优点是最清晰;缺点是内存占用大,每个像素32位=4字节,一张1024×1024的纹理,占用内存4MB。

压缩方式一:优点是通用,内存占用较少,是最高质量纹理内存占用一半;缺点是色阶明显,因为表示颜色的粒度变大了。

压缩方式二:需要区分平台,优点是内存占用很低,硬件支持;缺点是不能覆盖全级别设备,在低级设备上不支持,如果低级设备不支持的情况,则会解码为RGBA32,增大内存占用。

压缩方式三:需要区分平台,优点是内存占用很低,硬件支持,且可以覆盖全级别设备;缺点是不带alpha通道。

下面介绍一种使用压缩方式三格式表示带有alpha通道纹理的方式

原理是使用两张纹理,一张纹理表示RGB通道数据,一张纹理表示Alpha数据。可以通过XnView或者PS从原图中提取alpha通道信息生成一张图片,主纹理不需要额外处理,只需要简单忽略alpha通道即可。在渲染时使用两张纹理参数的shader,从主纹理中采样RGB数据,从Alpha纹理中采样Alpha数据,从而得到最终的颜色。

alpha通道图如下:

对应的片段shader如下:

1
2
3
4
5
6
7
8
fixed4 frag (v2f i) : SV_Target
{
    // sample the texture
    fixed3 rgb = tex2D(_MainTex, i.uv).rgb;
    fixed alpha = tex2D(_AlphaTex, i.uv).r;
 
    return fixed4(rgb, alpha);
}

示例工程地址


  腾讯GAD游戏程序交流群:484290331

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引