2021- 凹凸嫚-3D 性能优化glTF 文件压缩
3D 性能优化glTF 文件压缩
一、什么是glTF 文件
场景中出现的
除此以外,它还包括了带有二进制数据和图像文件的链接,如下图所示。

二、.gltf 与.glb
从
- glTF Binary(.glb)
- glTF Embedded(.gltf)
- glTF Separate(.gltf + .bin + textures)
2.1 .glb 文件产生原因
glTF JSON 指向外部二进制数据(几何、关键帧、皮肤)和图像。glTF JSON 嵌入base64 编码的二进制数据,并使用数据URI 内联图像。
对于这些资源,由于
为了解决这个问题,引入了一种容器格式
2.2 文件对比
2.2.1 同一个glTF 文件,.glb 格式要比.gltf 小
- 自包含的:

- 引用外部二进制和纹理资源的:

2.2.2 .gltf 文件预览
- 自包含的:

- 引用外部二进制和纹理资源:

2.2.3 glb 文件预览
- 自包含的:

- 引用外部二进制和纹理资源:

从图中可以看到,当非自包含型的时候,请求
三、glTF 文件拆分
上文提到,
可以使用
glTF 与glb 的相互转换- 将缓冲区
/ 纹理保存为嵌入或单独的文件 - 将
glTF 1.0 模型转换为glTF 2.0( 使用KHR_techniques_webgl 和KHR_blend) - 使用
Draco 进行网格压缩
在这里,我们是要使用“将缓冲区

再回顾一下,

所以,只要将拆分出来的这几个文件,放入同一个路径中,然后像之前那样引入就好了。
- 压缩方式
gltf-pipeline -i male.glb -o male-processed.glb -s
- 使用方式(在
Three.js 中) 普普通通地用就好了,和不拆分的没什么区别
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
const loader = new GLTFLoader();
loader.load(MODEL_FILE_PATH, (gltf) => {
// ....
});
- 性能对比

四、glTF 文件压缩
如上面介绍,

4.1 网格压缩
4.1.1 KHR_draco_mesh_compression
最常见的一种网格压缩方式,采用开源的
- 压缩方式
可以使用
gltf-pipeline -i male.glb -o male-processed.glb -d
- 使用方式(在
Three.js 中)
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";
const loader = new GLTFLoader();
// 创建解码器实例
const dracoLoader = new DRACOLoader();
// 设置解压库文件路径
dracoLoader.setDecoderPath(DECODER_PATH);
// 加载解码器实例
loader.setDRACOLoader(dracoLoader);
loader.load(MODEL_FILE_PATH, (gltf) => {
// ....
});
- 性能分析对比
这个

所以,如果一个项目需要加载多个

可见
除此以外,还有一个很直观的问题,模型画质的损失是肉眼可观的。如图,分别是在

总而言之,如果要将
4.1.2 KHR_mesh_quantization
顶点属性通常使用
例如,静态
- 压缩方式
可以使用
$ gltfpack -i male.glb -o male-processed.glb
- 使用方式(在
Three.js 中)
普普通通地用就好了,和不压缩的没什么区别:
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
const loader = new GLTFLoader();
loader.load(MODEL_FILE_PATH, (gltf) => {
// ....
});
- 性能对比
原文件

4.1.3 EXT_meshopt_compression
此插件假定缓冲区视图数据针对
除了优化压缩率之外,压缩格式还具有两个特性——非常快速的解码(使用
- 压缩方式
可以使用
gltfpack -i male.glb -o male-processed.glb -cc
- 使用方式(在
Three.js 中)
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
import { MeshoptDecoder } from "three/examples/jsm/libs/meshopt_decoder.module.js";
const loader = new GLTFLoader();
loader.setMeshoptDecoder(MeshoptDecoder);
loader.load(MODEL_FILE_PATH, (gltf) => {
// ....
});
- 性能分析对比
原文件
