原文网址:https://www.youyong.top/article/11599ef9c45a3
ETC2简要介绍
ETC1的问题是不支持透明通道,而 PVR2 的问题是透明图片质量太差,且图片大小必须是2的幂和正方形,而ETC2的出现正好弥补了这两个格式的不足。
ETC2不仅兼容ETC1,还支持透明通道,并且提供了更多的像素格式。ETC2已经是OpenGL ES3.0的标准之一,也就是只要操作系统和硬件支持ES3.0,则必然支持ETC2,不管它是Android还是IOS。
原文网址:https://www.youyong.top/article/11599ef9c45a3
ETC2简要介绍
ETC1的问题是不支持透明通道,而 PVR2 的问题是透明图片质量太差,且图片大小必须是2的幂和正方形,而ETC2的出现正好弥补了这两个格式的不足。
ETC2不仅兼容ETC1,还支持透明通道,并且提供了更多的像素格式。ETC2已经是OpenGL ES3.0的标准之一,也就是只要操作系统和硬件支持ES3.0,则必然支持ETC2,不管它是Android还是IOS。
原文网址:https://www.youyong.top/article/11599ef9c45a3
目前市面上使用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的,这样可以和安卓很好的统一起来。
如何在Cocos中支持ETC2,其实这件事由官方来做更好。但由于考虑到设备兼容性问题,就没有实现这个特性。好在支持这个并不困难,这里动手实现了。
Cocos使用的是ES2.0的版本,经测试发现,安卓上如果硬件支持ETC2,context并不用换成3.0。而IOS就必须明确创建3.0的EGLContext,才可以使用ETC2。
引擎团队负责人之前曾提交过一个PR支持GLES3,在这里5,只需要把它修改的文件合并进项目即可,即可以选择合并两个,也可以单独IOS。
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了。
上面预热了那么久,终于要修改引擎了,这一步并不麻烦,我们只要依照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改造过程的问题,记得来 论坛 共同探讨呦。
共 0 条留言
教程:Cocos Creator如何给资源打上MD5版本号?
教程|如何在Cocos Creator v1.5中集成 Pomelo?
看 Nantas手把手为你详解 v1.5资源导入导出工作流程
教程|如何在Cocos Creator 中完美使用 protobuf.js
Cocos Creator 开源游戏集合贴 (源码 视频 在线统统有)
iPhone X 跌破发行价,苏宁200亿入股恒大 | 财经日日评
资深黄牛现身说法:iPhone X价格秒变不停,就像炒股一样
低内存占用、无广告、功能强大又唯美的本地播放器 - Potplayer
从零开始手把手带你全面认识 网易的游戏服务端框架 Pomelo
Cocos Creator v1.6支持Camera剔除功能!
手机扫一扫
分享文章