由于有很多人都问过我压缩格式的问题,今天飞哥又从新提醒了一次。整理一下发个贴,以供你们查阅和讨论。html
各类纹理格式,你们参照下U3D MANUAL里面的具体描述介绍,这是官方的东西。但我以为有一部内容是错的,例如占用内存大小。测试
http://docs.unity3d.com/Manual/class-TextureImporter.htmlspa
基本知识点:3d
DXT格式是Nvidia Tegra提供的,ETC是安卓原生支持的,OPNEGL2.0都支持。ETC2只有OPENGL3.0支持,PVRTC是Imagination PowerVR提供的,ATC是Qualcomm Snapdragon提供的。通常来讲,IOS只支持PVRTC的压缩格式。一旦相应的贴图格式不兼容的时候,U3D会自动将其转换成RGB(A)格式。最好的兼容是针对GPU进行打包,例如针对小米的都用ATC格式,但通常开发作不到太细化的选择。全部设备对RGB 16BITS/ARGB 16BITS/RGB A16BITS/RGB 24BITS/ARGB 32BITS等支持都很好,只是这些格式算是非压缩格式,对内存消耗和渲染消耗很是不友好。htm
关于压缩后的在储存上的大小,假设高清(ARGB32)大小为1,那么大概数据以下:游戏
RGB PVRTC 4BITS:0.25图片
ARGB PVRTC 4BITS:0.25内存
RGB PVRTC 2BITS:0.13开发
ARGB PVRTC 2BITS:0.13it
RGBA ETC2 4BITS:0.25
RGBA ETC2 8BITS:0.25
RGB + 1-bit ALPHA ETC2 8BITS:0.2
DXT1 :0.3
DXT5 : 0.6
ARGB 16BITS:0.33
RGB 16BITS:0.5
RGB 24BITS:0.85
ARGB 32BITS:1
固然每一个都是根据图片不同而不同的,以上只是大体数据并不是准确数据。
测试方法:单独为改成这样贴图格式的文件打成ASSETBUNDLE看大小。
对此抱有比较大疑问的是ARGB 16 和RGB 16,感受可能这里U3D的BUNDLE有BUG。
内存中的大小,假设高清(ARGB32)大小为1,那么大概数据以下:
RGB PVRTC 2BITS:0.0625
ARGB PVRTC 2BITS:0.0625
RGB PVRTC 4BITS:0.125
ARGB PVRTC 4BITS:0.125
RGBA ETC2 4BITS:0.125
RGBA ETC2 8BITS:0.25
RGB + 1-bit ALPHA ETC2 8BITS:0.125
DXT1 :0.125
DXT5 : 0.25
ARGB 16BITS:0.5
RGB 16BITS:0.5
RGB 24BITS:0.8
ARGB 32BITS:1
建议以下:
通常来讲3D游戏咱们压缩贴图的时候会把贴图分为UI贴图和场景模型贴图来考虑,主要是由于有多重采样的缘故。3D游戏通常来讲都是受摄像机远近大小改变而采起不一样的采样大小,假设不设置多重纹理采样的话,在远处会有很是多的白色噪点。
2D游戏的话,全部都不须要勾选多重采样,具备3D性质的贴图,咱们都须要勾选上GENERATE MIP MAPS,这样会使贴图大小增长25%这样。
正方贴图与非正方贴图也要区分。非正方贴图只有16位的压缩(至关于真彩色减半),因此最好游戏中都是正方的贴图。如下是我的选择贴图压缩格式遵循的一些规则,你们能够参考下,如有问题能够一块儿交流一下。
正方贴图:
IOS下:
a.普通不透明:RGB PVRTC 4BITS
b.普通透明:RGBA PVRTC 4BITS
Android下:
a.普通不透明:RGB ETC 4BITS
b.普通透明:
由于没有通用最兼容的格式,因此通常状况是用RGBA 16BIT或有针对性的选择DXT5/ATC8 BITS/ETC2 8BITS。若是有技术支持,能够采用RGB ETC 4BITS加一张ALPHA 8的贴图来实现透明效果。
非正方贴图:
通常采用16位压缩,16位会带来颜色损失,但若是原本美术就是按16BITS画的话,就不会损失,日本好些手游都是按16BITS来画的。这样的游戏通常少渐变艳度高比较容易看出来。
a.不透明贴图: RGB 16BITS
d.透明贴图:RGBA 16BITS
高清不压缩贴图:
RGBA 32BIT
另外:
对于不重要的贴图,模糊度低的贴图,建议不只要采起像素压缩,还要直接压缩其大小。如光照贴图压到512或256。如背景本来1024的图直接压到256。玩家不注意到就能够了。