吐槽一下Cocos的网格数据



一点题外话:最近在做Cocos打包后的网格模型替换。有发过一些帖子,没有结果,就开始自己研究,自己做,原理也简单,就是读取发布后的.bin文件,然后再把FBX或者是GLTF转成.bin文件格式,就可以了。
然后就开始研究GLTF的格式,发现这个格式是真的简洁,就是为了OpenGL、WebGL这类渲染引擎的数据结果而设计,而且还可以进行数据压缩。理论上gltf格式可以直接加载使用,而且性能还不差。建议引擎这边考虑支持一下直接加载使用gltf。
我在写替换的程序中发现,cocos的网格数据存储会多一个a_tangent这个属性,我来给小白说一下多这个属性是什么概念,就是一般情况下,一个网格使用到三个属性,顶点坐标,uv坐标,再加个三角形索引,然后可以简单算一下一个模型的大小= 顶点的数量 * (顶点坐标 * 3(XYZ三个坐标数值) + UV坐标*2(U跟V两个数值) + 索引数值。
但cocos的存储结构为:顶点坐标,uv坐标,三角形索引,法线坐标,切线坐标(也就是a_tangent),多了两个属性,一个是法线坐标,一个是切线坐标。我们再简单计算一下cocos的网格大小= 顶点的数量 * (顶点坐标 * 3 + UV坐标 * 2 + 法线坐标 * 3 + 切线坐标 * 4) + 三角形索引。也就是说一个模型经过cocos转换后,每个顶点会多出来7个数据。是简单数据的一倍还多,那这个法线跟切线可不可以动态算出来呢,可以,法线可以根据顶点和三角形索引计算出来,切线可以根据法线+uv坐标+三角形索引计算出来。
我知道法线跟切线在PBR材质中需要被使用到,提前存储可以减少运行时计算时间,但web小程序也一样有小包体的需求,建议官方让用户自己来选择,要包体空间还是减少运行时时间,而不是帮我们做了决定,让打包网格数据一下子涨这么大一个。

2赞