gltf按照图形编程所需的格式来存储数据,借以二进制编码提高传输速度。**gltf不再使用面向对象的思维存储三维模型、贴图纹理,而是按显卡的思维存储,存的是顶点、法线、顶点颜色等最基础的信息,只不过组织结构上进行了精心的设计!它面向终点,就意味着可编辑性差,因为渲染性能的提高牺牲了可编辑性。**它不再像fbx、obj一样容易编辑和转换。
glTF的核心优势就是对于Buffer的读取, Buffer中读取的数据可以直接用memcpy的方式作为BufferGeometry数据传到GPU中。
gltf的形式:
glTF 文件有两种拓展形式,.gltf(JSON / ASCII)或.glb(二进制)。.gltf 文件可能是自包含的,也可能引用外部二进制和纹理资源,而 .glb 文件则是完全自包含的(但使用外部工具可以将其缓冲区/纹理保存为嵌入或单独的文件,后面会提到)。
KHR_draco_mesh_compression
最常见的一种网格压缩方式,采用开源的Draco算法,用于压缩和解压缩3D 网格和点云,并且可能会改变网格中顶点的顺序和数量。压缩的使文件小得多,但是在客户端设备上需要额外的解码时间。 可以使用gltf-pipelinegltf 文件优化工具进行压缩
结合实际项目进行以下对比:
(1) 请求两个文件+解密耗时,与本身 glb 文件压缩后的体积大小相比,真实性能对比;
(2) 画质是否会出现设计师无法接受的损失
KHR_mesh_quantization
顶点属性通常使用FLOAT类型存储,将原始始浮点值转换为16位或8位存储以适应统一的3D或2D网格,也就是我们所说的quantization向量化,该插件主要就是将其向量化。
EXT_meshopt_compression
此插件假定缓冲区视图数据针对 GPU 效率进行了优化——使用量化并使用最佳数据顺序进行 GPU 渲染——并在 bufferView 数据之上提供一个压缩层。每个 bufferView 都是独立压缩的,这允许加载器最大程度地将数据直接解压缩到 GPU 存储中。
除了优化压缩率之外,压缩格式还具有两个特性——非常快速的解码(使用 WebAssembly SIMD,解码器在现代桌面硬件上以约 1 GB/秒的速度运行),以及与通用压缩兼容的字节存储。也就是说,不是尽可能地减少编码大小,而是以通用压缩器可以进一步压缩它的方式构建比特流。