Unity3D小教程:纹理格式
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); } |