感谢『论坛 ID:
colinsusie
』友情提供
ETC1的问题是不支持透明通道,而PVR2的问题是透明图片质量太差,且图片大小必须是2的幂和正方形,而ETC2的出现正好弥补了这两个格式的不足。
ETC2
不仅兼容
ETC1
,还支持透明通道,并且提供了更多的像素格式。
ETC2
已经是OpenGL ES3.0的标准之一,也就是只要操作系统和硬件支持ES3.0,则必然支持ETC2,不管它是Android还是IOS。
目前市面上使用
ETC2
作为压缩纹理的游戏不多,主要原因是老机器不支持,特别是安卓。而制约其流行起来的原因,其实就是两个:GPU的支持、OS的支持。
我从wikipedia4上查了OpenGL ES 3.0的兼容情况,大概是这样的:
尽管苹果的开发文档说到:
然而我对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只是一个压缩算法,还需要一种文件格式来包含它,
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了。
上面预热了那么久,终于要修改引擎了,这一步并不麻烦,我们只要依照ETC1的代码添加ETC2的代码就行。
修改Configuration,提供ETC2的支持判断
修改CCImage,支持ETC2的加载
有了上面的说明,相信这个代码很容易能看懂。