想问下 上面两个图中 type为sprite-frame与sprite的时候,压缩纹理有什么区别吗?这个压缩问题底层是怎么实现的?调用了webgl的什么接口实现的呢?希望可以解答一下。感谢!
谢邀。
这个类型选项对于压缩问题的最终输出接口是没有影响的。
-
首先需要解释压缩纹理是什么?我们使用压缩纹理解决什么问题?推荐浏览这篇博客就可以明白。https://www.cnblogs.com/fuckgiser/p/5497013.html。
-
之后就是 CocosCreator 如何生成压缩纹理。其实 CocosCreator 2.4.x 版本是使用开源的 Nodejs 图片压缩方案 sharp 来输出 jpg、png、webp 进行压缩。其它格式则是通过命令行执行第三方压缩纹理程序 astcenc.exe、etcpack.exe、PVRTexToolCLI.exe 并辅以相关的配置参数生成的。论坛也有前辈进行了实践:干货分享:Creator使用压缩纹理 。
-
引擎会在初始化时询问该设备支持哪些压缩纹理拓展,以便在不同平台使用不同压缩纹理。
主要使用 gl.getExtension(Extension_name) 的返回结果来判断是否支持某种 gl 拓展。gl 拓展列表可以在 gl api 文档中找到。这里提供 webgl 的 api 链接。
-
确认支持后,引擎会开始解析压缩纹理的文件数据(主要使用 parser 对象的接口 https://github.com/cocos-creator/engine/blob/f7d50d63228ec3047fe054a2d1e1535e90da2bd1/cocos2d/core/asset-manager/parser.js#L147) 。后续就使用 GL 相关拓展接口进行来渲染图片。
var ext = gl.getExtension('WEBGL_compressed_texture_astc');
var texture = gl.createTexture();
gl.bindTexture(gl.TEXTURE_2D, texture);
gl.compressedTexImage2D(gl.TEXTURE_2D, 0, ext.COMPRESSED_RGBA_ASTC_12x12_KHR, 512, 512, 0, textureData);
- 了解了更多后就对引擎认知更清楚了,有帮助你后续的游戏开发。3.4.0 已经支持自定义压缩纹理处理:扩展构建流程 · Cocos Creator
借此机会问下, 比如我的安卓手机,支持 ASTC & ETC2, 我构建安卓时同时选择了两种格式, 引擎运行时如何决定使用哪种格式的压缩纹理?引擎相关代码在哪里?
更新: 我找到了,在 image-asset.ts 270 行附近
感谢
非常感谢您的详细解答!
该主题在最后一个回复创建后14天后自动关闭。不再允许新的回复。