最近在做web3d的项目,就是把web模型通过webGl展示到浏览器,关于模型制作的方法,模型动画的交互,模型导出gltf的方法,本文主要讲的就是gltf压缩问题,这样可以把gltf模型提及压缩的最小,web显示速度更快。

GLTF介绍:

首先说下gltf是什么,glTF 称为“ 3D 界的 JPEG”,使用了更优的数据结构,为应用程序实时渲染而生,特别适合web3d的展示。内存更小方便传输。
glTF 导出格式有两种后缀格式可供选择:.gltf 和 .glb:

  • .gltf 文件导出时一般会输出两种文件类型,一是 .bin 文件,以二进制流的方式存储顶点坐标、顶点法线坐标和贴图纹理坐标、贴图信息等模型基本数据信息;二是 .gltf 文件,本质是 json 文件,记录对bin文件中模型顶点基本数据的索引、材质索引等信息,方便编辑,可读性较好;
  • glb 文件格式只导出一个 .glb 文件,将所有数据都输出为二进制流,通常来说会更小一点,若不关心模型内的具体数据可直接选择此类型。

GLTF压缩方法:

gtlf压缩的方法很多:

  1. gltf-pipeline:用于压缩和解压缩 3D 几何网格(geometric mesh)和点云(point cloud)。换句话说,它显著缩小了 3D 图形文件的大小
  2. KTX 2.0 2021 年 4 月 20 日,Khronos® 集团宣布批准KTX™ 2.0,为这种容器格式添加了对Basis Universal超压缩的支持,以实现可靠、无处不在的 GPU 纹理分布。Basis Universal 是由Binomial开发的一种压缩技术,可以生成紧凑的纹理,可以在运行时有效地转码为各种 GPU 压缩纹理格式。
    换句话说:gltf-pipeline通过压缩模型网格,通过减点和面,实现体积变小,而KTX 2.0通过新技术,改变传统的png,jpg等格式的问题图片,实现压缩。

gltf-pipeline:

gltf-pipeline使用介绍:

首先全局安装

npm install -g gltf-pipeline

参数

参数 解释
-i 输入路径,需要压缩的模型路径和名称
-o 输出路径,压缩结果的模型路径和名称
-b 将输入的glTF转换为glb
-j 将输入的glb转换为glTF
-s 编写单独的缓冲区、着色器和纹理而不是把它们嵌入到glTF中
-t 只写出单独的纹理
-keepUnusedElements 保留未使用的材质、节点和网格
-d 使用Draco压缩网格。添加KHR_draco_mesh_压缩扩展
-draco.compressionLevel Draco压缩级别[0-10],大多数是10,最小值为0。值为0将会连续应用 编码并保留face顺序。

其实还有很多参数没有列出来,因为我懒,所以只把常用的列出来了。

举例:
控制台cd到需要转换的文件目录
gltf三种存在形式

  1. gltf单文件(json)

  2. glb但文件(二进制文件)

  3. gltf拆分(包括bin文件和纹理贴图)

gltf --------> glb

#压缩gltf文件 -b表示输出glb格式,-d表示压缩
gltf-pipeline -i scene.glb -b -d

glb --------> gltf

#压缩glb文件 -j表示输出gltf格式,-d表示压缩
gltf-pipeline -i model.gltf -j -d

glb --------> gltf(bin)

#压缩glb文件并将纹理图片分离出来
gltf-pipeline -i scene.glb -j -d -t

glb --------> glb(压缩)

#单纯压缩gltb
gltf-pipeline -i model.glb -b -d

注意:如果加了-d压缩,加载模型不能单纯的直接用GLTFLoader。需要引入DRACOLoader。

// Instantiate a loader
const loader = new GLTFLoader();
const dracoLoader = new DRACOLoader();
dracoLoader.setDecoderPath( '/examples/js/libs/draco/' );
loader.setDRACOLoader( dracoLoader );
loader.load(// 模型地址'models/gltf/duck/duck.gltf',// called when the resource is loadedfunction ( gltf ) {scene.add( gltf.scene );},// 进度处理(关于进度加载完模型不出来,下篇再讲)function ( xhr ) {console.log( ( xhr.loaded / xhr.total * 100 ) + '% loaded' );},// 报错处理function ( error ) {console.log( 'An error happened' );}
);

gltf-pipeline压缩无效,内存不变的问题

有时候,模型体积很大并不是,模型的网格面很多,所以通过-d压缩是几乎无效的,因为这种模型很大很可能是,纹理贴图很大。

像这样一样,贴图信息几乎已经有了40m,网速快的话加载也需要半分钟,网速慢就完全没希望了。
如果是贴图很大可以通过最新推出的KTX2.0来解决纹理问题,但是为了方便,不如直接压缩png图片,推荐一款软件 ImageOptim。几乎无损压缩,
体积可以缩小1/3.当然了这种软件多的是,大家可以随便用个美图秀秀或者ps也行。

接下里就是体积网格压缩,可适当提高压缩等级
gltf-pipeline -i model.gltf -j -d
直接输入命令就可以。
总结:最好是想把模型拆分乘bin和纹理图片的格式。如果bin和gltf文件过大就用gltf-pipeline,如果纹理过大就直接压缩纹理图片。

gltf-pipeline压缩gltf大小不变等问题相关推荐

  1. 凹凸实验室:3D性能优化 | 说一说glTF文件压缩

    引言 最近做T级互动,需要使用到3D模型.相信大家和我一样,在开始着手的时候,一定会有这么些问题: 1.如何选择3D模型的导出格式 2.如何对模型文件进行优化 3.在大流量的项目中兼容性怎么样 让我们 ...

  2. gltf-pipeline压缩gltf与加载教程

    gltf-pipeline的git地址:https://gitcode.net/mirrors/analyticalgraphicsinc/gltf-pipeline 1.全局安装: npm inst ...

  3. 【问题帖】压缩图片大小至指定Kb以下

    像PS,QQ影像等都有该功能,将图片大小压缩至指定kb以下. 我也来山寨一把,到目前为止,控制图片的大小,平时的解决方案通过分辨率和质量来控制的. 假定最后压缩的大小是100kb,那么在保证不大于10 ...

  4. 如何让弹窗不影响主界面_如何压缩视频大小不影响画质

    生活中在网站下载的视频,手机拍摄的视频,或者自己录制的视频,需要分享给朋友,上传到某些平台,在传输的过程中,文件太大,平台传输失败,我们如何让视频压缩到很小并且不影响画质,.今天小编来告诉你如何使用& ...

  5. 压缩图片_Word快速压缩图片大小

    (每周一.三.五更新) 有朋友发消息说,TA的一份Word文档中,由于插入了很多图片,所以文件大小变得很大,无法上传到网上的工作平台上.询问快速解决的办法.其实在Word里,有专门调整图片大小的工具, ...

  6. 压缩pdf大小_PDF压缩到指定大小该怎么操作?分享完成PDF压缩超好用的方法

    PDF文件怎么压缩到指定的大小?大家有没有发现现在很多可以传输文的平台都有文件大小的限制?比如微信,传输的文件大小不得超过10M.如果我们现在需要在微信中发送给同事一份体积很大的PDF文件,在传输之前 ...

  7. 【Python黑科技】图片太大不能上传?三种压缩图片大小的方法(代码注释详细)

    目录 实现效果 原图大小8.46MB PIL库quality降低图片质量方式压缩图片366KB PIL库thumbnail压缩图片大小来压缩图片985KB OpenCV缩放图片大小来压缩图片 177K ...

  8. 图片太大,怎么压缩图片大小?

    图片太大,怎么压缩图片大小?我们知道图片被应用到生活的方方面面,所以我们经常会遇到因图片体积大半天打不开,或者是因为图片大好传送不过去.再或者因为图片太多内存不够等等情况,总之可能会带来很多我们预想不 ...

  9. 如何免费压缩图片-批量免费压缩图片大小的软件

    如何免费压缩图片,今天给大家分享一款免费压缩图片的软件,支持任意格式的照片压缩,不仅可以压缩照片还可以放大图片,支持批量照片自动水印.批量关键词采集全网图片,导入链接批量下载图片,整站图片下载导出.详 ...

最新文章

  1. E-UTRA channel bandwidths per operating band (36.101)
  2. BZOJ3738 : [Ontak2013]Kapitał
  3. win7笔记本电脑如何分割和重命名磁盘
  4. linux脚本打印循环次数,shell脚本编程基础(3)——循环用法
  5. 1276A. As Simple as One and Two
  6. 谷歌 AI 中国中心彻底变天了!
  7. Spring源码剖析-Spring核心类认识(一)
  8. 举例说明儿化音的作用_六年级语文下学期复习资料
  9. Mugeda(木疙瘩)H5案例课—什么,才是福-岑远科-专题视频课程
  10. 组装一台计算机必需的配件有,哪位可以告诉我自己想组装一台电脑需要那些配件...
  11. 怎样在线生成ICO 图标?图片怎么转ICO图标?
  12. springcloud24:分布式事务 Seata处理分布式事务总结篇
  13. 详解 PerformanceResourceTiming API,咦,这货真的干!
  14. k开头的英文单词计算机专业,英语单词k字头
  15. 国家开放大学计算机应用基础本科性考,精选国家开放大学电大本科《1200计算机应用基础》形考任务1试题及答案...
  16. python习题练习(一)
  17. CF进制转换专题进阶
  18. 北大青鸟java超市账单管理系统_java超市账单管理系统.pdf
  19. synchronized使用场景及区别
  20. 微信(WeChat web page)

热门文章

  1. 一名Web3D开发工程师的Three.js知识总结与学习步骤
  2. 手机锁屏忘记密码,可以通过adb进行解屏安全不丢失东西
  3. JavaScript加密解密7种方法总结分析
  4. android移动开发基础课后答案,《ANDROID移动应用开发基础》见面课及答案
  5. 安全多方计算:安全定义
  6. xshell7提示需更新,但更新后仍无法使用问题
  7. python可视化Matplotlib库
  8. 网盘搜索引擎汇总——快速搜索你想要的资料
  9. 第十四周总结(初等数论)
  10. 陈二狗的妖孽人生经典语录