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

赞赏 2017-07-31

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只是一个压缩算法,还需要一种文件格式来包含它,ETC1常包含在pkm文件中,ETC2也可以在pkm中,只不过ETC1是pkm10版本,而ETC2需要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

  • 在Image::detectFormat增加如下代码:


实现isEtc2


修改Image::initWithImageData


实现initWithETC2Data


修改CCTexture2D,生成ETC2纹理

  • Texture2D::PixelFormat增加两种类型:


  • static const PixelFormatInfoMapValue TexturePixelFormatInfoTablesValue增加这两种格式的信息:


  • Texture2D::getStringForFormat增加格式说明,其实不加也没关系:


  • Texture2D::initWithMipmaps判断压缩纹理处作一点修改:


到此,引擎改造完成。


Android版本,Android Studio的build.gradle的minSdkVersion改为18,即Android4.3,我没试过不改的话能不能正常使用,小伙伴们有兴趣可以试试。 IOS版本,XCode直接编译,连上真机就可以测试,不过千万一定记得上面的EGLContext要换成3,否则就白忙一场咯。

如果小伙伴们还有关于ETC2改造过程的问题,记得 论坛 共同探讨呦。

登陆后阅读全文
阅读 3389 赞赏 0 有用 4 没用 1 收藏 6 分享

   



0 条留言

相关文章

教程:Cocos Creator如何给资源打上MD5版本号?

教程|如何在Cocos Creator v1.5中集成 Pomelo?

看 Nantas手把手为你详解 v1.5资源导入导出工作流程

Cocos Creator v1.6使用体验Q&A

教程|如何在Cocos Creator 中完美使用 protobuf.js

Cocos Creator可以用来开发大型MMO吗?

Cocos Creator 开源游戏集合贴 (源码 视频 在线统统有)

【Cocos Creator与C++知识分享】AnySDK打包微信登录、微信分享

干货|Cocos Creator Zip压缩文件读取分享

Cocos Creator v1.6支持Camera剔除功能!

有料推荐

这世界欠我一个这样的老公!

高校学生模仿“世界名画”摆拍,可以说是戏精本精了

iPhone X 跌破发行价,苏宁200亿入股恒大 | 财经日日评

果然是高手!这次在日本,特朗普竹杠敲得不是一般狠

资深黄牛现身说法:iPhone X价格秒变不停,就像炒股一样

长一样的双胞胎也能识别?蚂蚁金服发布「眼纹识别」技术

苏联是怎么被阿富汗拖垮的?

美团或入局「分时租赁」共享汽车,王兴要大笔投入「泛出行」领域了? | 36氪独家

你或许被“一盘番茄炒蛋”刷屏了,但有人辛酸,有人质疑

iPhone X发售前夜,黄牛与苹果公司的不安

他的文章

低内存占用、无广告、功能强大又唯美的本地播放器 - Potplayer

从零开始手把手带你全面认识 网易的游戏服务端框架 Pomelo

推荐一款上线 Cocos商店的付费插件——可视化状态机

手把手教你如何优化cocos2d-x手游内存

「新手向」用Cocos Creator也可以轻松做阿拉斗牛

Cocos Creator v1.6支持Camera剔除功能!

Cocos Creator v1.6使用体验Q&A

Cocos Creator可以用来开发大型MMO吗?

教程:Cocos Creator如何给资源打上MD5版本号?

「教程」如何在Cocos Creator中优化首页打开速度

手机扫一扫
分享文章