gltf和glb模型压缩,我爱模板网通常使用两种方法:
一、3D软件导出时压缩
以Blender为例,在导出时,勾选压缩选项,导出来的模型就被压缩了:
二、gltf-pipeline压缩
1、安装
gltf-pipeline npm i -g gltf-pipeline
2、优点
gltf和glb模型相互转换
压缩gltf和glb
可以选择分离纹理图片
获取glb或gltf信息资源
3、使用终端运行
gltf-pipeline -i model.gltf -o model.glb -d
4、参数详情
参数 | 描述 | 必须/默认 |
---|---|---|
--help , -h | 查看帮助 | No |
--input , -i | 输入一个gltf模型文件. | ✅ Yes |
--output , -o | 输出一个gltf或者glb文件,文件会存储在相同的目录 | No |
--binary , -b | 转换gltf模型到glb模型 | No, default false |
--json , -j | 转换glb模型到gltf模型 | No, default false |
--separate , -s | 分离纹理图片和bin文件至单独的文件 | No, default false |
--separateTextures , -t | 仅仅只分离纹理图片 | No, default false |
--stats | 在终端输出gltf文件信息 | No, default false |
--keepUnusedElements | 保存未使用过的材质,节点,网格对象 | No, default false |
--draco.compressMeshes , -d | 使用Draco经行压缩,默认不压缩 | No, default false |
--draco.compressionLevel | 压缩的级别0-10 级别越大,压缩程度越大,文件越小 | No, default 7 |
--draco.quantizePositionBits | 使用 Draco 压缩时位置属性的量化位. 取值为0-29,值越小,文件越小 | No, default 14 |
--draco.quantizeNormalBits | Quantization bits for normal attribute when using Draco compression. | No, default 10 |
--draco.quantizeTexcoordBits | Quantization bits for texture coordinate attribute when using Draco compression. | No, default 12 |
--draco.quantizeColorBits | Quantization bits for color attribute when using Draco compression. | No, default 8 |
--draco.quantizeGenericBits | Quantization bits for skinning attribute (joint indices and joint weights) and custom attributes when using Draco compression. | No, default 12 |
--draco.unifiedQuantization | Quantize positions of all primitives using the same quantization grid. If not set, quantization is applied separately. | No, default false |
5、具体使用
使用node写了一个批处理文件,运行之前先安装gltf-pipeline和fs-extra包
const gltfPipeline = require('gltf-pipeline'); const fsExtra = require('fs-extra'); const glbToGlb = gltfPipeline.processGlb; let dirs = fsExtra.readdirSync('./originModels') let count = 0 , total = dirs.length dirs.map(dir => { fsExtra.readFile(`./originModels/${dir}`).then(glb => { glbToGlb(glb, { dracoOptions: { compressionLevel: 10, compressMeshes : true }, stats : true }).then(({glb}) => { fsExtra.writeFile(`./targetModels/${dir}`, glb).then(() => { count++ console.log(`模型压缩${count}/${total}`) if(count == total) { console.log('模型压缩完成') } }) }) }) })
目录如下,在该文件下面建立两个originModels和targetModels文件夹
模型压缩完成对比图