Unity的UGUI中使用ETC1+Alpha的格式

来源:互联网 发布:网络机顶盒为什么老卡 编辑:程序博客网 时间:2024/06/03 17:25

 http://gad.qq.com/article/detail/7199107

相信很多开发人员都很奇怪UGUI中使用ETC1+Alpha的格式,因为自Unity5.3之后,安卓平台的默认压缩纹理改为ETC2。ETC2支持半透明,使用也很方便,不过问题是尚未普及,尤其是低端机是不支持ETC2的。Unity对不支持ETC2的机子,在加载图片的时候会解压为RGBA,不过这样就会造成极大的内存浪费,也会严重影响加载速度。

        对于没有透明色且为2的整次幂的正方形图片,Unity会转为ETC1,所以模型的纹理是可以用默认的压缩格式。

        需要注意的是非2的整次幂的图片,以及含有半透明的图片。这里主要是UI图片资源。

        Unity提供了ETC1+Alpha的支持。在图片分页进行如图所示的设置

 Unity的UGUI中使用ETC1+Alpha的格式

也可以通过代码进行自动化设置

 
    private static void SetTextureSprite(AssetImporter ai, string tag = null)    {        TextureImporter importer = ai as TextureImporter;        if (importer == null) return;        importer.textureType = TextureImporterType.Sprite;        importer.mipmapEnabled = false;        importer.isReadable = false;        if (tag != null)        {            tag = tag.Replace(GameConfig.AB_EXT, "");            tag = tag.ToLower();            importer.spritePackingTag = tag;        }#if UNITY_ANDROID        int maxSize = 1024;        TextureImporterFormat format = TextureImporterFormat.AutomaticCompressed;        int quality = 50;        importer.GetPlatformTextureSettings("Android", out maxSize, out format, out quality);        // 压缩的格式,android下修改为分离alpha通道的etc1        if (format == TextureImporterFormat.AutomaticCompressed)        {            importer.SetPlatformTextureSettings("Android", maxSize, TextureImporterFormat.ETC_RGB4, quality, true);            importer.SetAllowsAlphaSplitting(true);        }#else    // iPhone#endif    }

这里要注意几点:

1、图片必须设置好Sprite Tag,即进行图集打包,才能支持ETC1+Alpha。

2、BuildSetting里面 Texture Compression要选成 ETC(default)。如果选成其他的,则会使用ETC2,这样在低端机可以显示,但是效率很低。

3、Project Setting--Graphic--Always Included Shaders里面添加 UI/DefaultETC1。如果没有添加则真机上显示异常。

4、Unity5.3.0以及之前的版本,UGUI的Image是不支持ETC1的,只有SpriteRender渲染正常。  最新版本是没问题的。

5、如果自己写了某些自定义Shader,如图片灰化,那么这个也要做相应的支持。否则渲染不正常。具体支持方式参考UI/DefaultETC1

0 0
原创粉丝点击