专栏名称: COCOS
Cocos引擎官方账号,第一时间为您送上引擎动态、精品教程、达人专访等干货,还会定期举办有奖活动喔!
目录
相关文章推荐
山东省交通运输厅  ·  山东机场集团:2025年春节假期预计保障旅客 ... ·  2 天前  
德州晚报  ·  破100亿!全球第一! ·  3 天前  
鲁中晨报  ·  全市集中行动!淄博4天查处633起 ·  4 天前  
51好读  ›  专栏  ›  COCOS

【技术分享】Cocos如何完整实现ETC2支持

COCOS  · 公众号  ·  · 2017-07-31 00:00

正文

感谢『论坛 ID: colinsusie 』友情提供


ETC2简要介绍



ETC1的问题是不支持透明通道,而PVR2的问题是透明图片质量太差,且图片大小必须是2的幂和正方形,而ETC2的出现正好弥补了这两个格式的不足。


ETC2 不仅兼容 ETC1 ,还支持透明通道,并且提供了更多的像素格式。 ETC2 已经是OpenGL ES3.0的标准之一,也就是只要操作系统和硬件支持ES3.0,则必然支持ETC2,不管它是Android还是IOS。


目前市面上使用 ETC2 作为压缩纹理的游戏不多,主要原因是老机器不支持,特别是安卓。而制约其流行起来的原因,其实就是两个:GPU的支持、OS的支持。


我从wikipedia4上查了OpenGL ES 3.0的兼容情况,大概是这样的:

  • 软件:

    • android 4.3以上支持ES3.0

    • IOS 7以上支持ES3.0

  • 硬件:

    • Adreno 300 and 400 series (Android, BlackBerry 10, Windows Phone 8, Windows RT)

    • Mali T600 series onwards (Android, Linux, Windows 7)

    • PowerVR Series6 (iOS, Linux)

    • Vivante (Android, OS X 10.8.3, Windows 7)

    • Nvidia (Android, Linux, Windows 7)

    • Intel (Linux)

  • 苹果设备从A7开始支持ES3.0,最低要求的设备是:

    • iPhone 5S

    • iPad Air

    • iPad mini with Retina display

尽管苹果的开发文档说到:


然而我对PVRTC实在是爱不起来,又必须是2的幂,又必须是正方形,最终效果还那么差(4bit一个像素)。所以当A7支持ETC2之后,其实是可以考虑换用ETC2的,这样可以和安卓很好的统一起来。


改用ES3.0的EGLContext


如何在Cocos中支持 ETC2 ,其实这件事由官方来做更好。但由于考虑到设备兼容性问题,就没有实现这个特性。好在支持这个并不困难,这里动手实现了。


Cocos使用的是ES2.0的版本,经测试发现,安卓上如果硬件支持ETC2,context并不用换成3.0。而IOS就必须明确创建3.0的EGLContext,才可以使用ETC2。


引擎团队负责人之前曾提交过一个PR支持GLES3,在这里5,只需要把它修改的文件合并进项目即可,即可以选择合并两个,也可以单独IOS。


PKM2格式说明



ETC2只是一个压缩算法,还需要一种文件格式来包含它, ETC 1常包含在pkm文件中, ETC 2也可以在pkm中,只不过 ETC 1是pkm10版本,而 ETC 2需要pkm20版本,这两个文件版本是兼容的,它的格式如下:


其中format字段:


我修改的时候只加了ETC2_RGB_NO_MIPMAPS和ETC2_RGBA_NO_MIPMAPS的支持,第一个是RGB,和ETC1兼容,一个像素占用4位;第二个是RGBA,提供透明通道,一个像素占用8位;这有点像以前贴子提到的ETC1+Alpha,好处是我们不用再写自定义Shader了。


Cocos引擎修改




上面预热了那么久,终于要修改引擎了,这一步并不麻烦,我们只要依照ETC1的代码添加ETC2的代码就行。


修改Configuration,提供ETC2的支持判断

  • 增加_supportsETC2成员变量,用于判断是否支持ETC2

  • 增加函数checkForEtc2:


  • 在Configuration::gatherGPUInfo添加代码:


  • 加一个访问函数:Configuration::supportsETC2,和ETC1的流程一样,参考即可。

修改CCImage,支持ETC2的加载

  • 提供解析PKM2的函数如下:


有了上面的说明,相信这个代码很容易能看懂。

  • Image::Format增加一种类型: ETC2







请到「今天看啥」查看全文