来源:腾讯ISUX
链接:isux.tencent.com/articles/isux-optimizing-3d-model.html
亲爱的朋友们,你们还记得QQ 20th周年H5鹅可可爱的空间吗?
为了实现旋转换肤功能,我们在H5随机展示了五种三维空间鹅模型,如下图所示:
然而,3D模型引入H5往往存在资源过多、性能损失严重、还原不真实等问题,这也使得许多3D创意止步于开发阶段。
如何更好地恢复H5的模式?本文将对模型网格和贴图文件进行分析,从技术角度介绍几种优化加载速度和提高渲染性能的方法,从而在保证3D模型不减面、贴图不收缩的同时,将3D模型精致地还原到H5或其他应用程序中。
模型网格压缩
首先,对模型网格进行分析。对于大型3D资源,我们通常在模型设计时通过“缩小曲面”来缩小模型几何尺寸,但也会带来模型精细化的不足。如下图所示:
借助glTF和Draco压缩,3D模型文件可以翻倍,视觉效果几乎一样。下面将详细描述glTF格式和Draco压缩工具。
1. 将模型导出为 glTF 格式
glTF 介绍
GlTF被称为“3D世界中的JPEG”,它使用了更好的数据结构,为应用的实时渲染而生。GlTF具有以下特征:
-由现有OpenGL的维护组织Khronos推出,目的是统一用于应用渲染的3D格式,更适合基于OpenGL的引擎;
-减少3D格式中除渲染外的冗余信息,最大限度减少3D文件资源;
-优化应用读取效率,减少渲染模型运行时间;
-支持3D模型几何,材质,动画,场景,相机等信息。
GlTF导出格式有两种后缀格式可供选择:gltf和。glb:
-.gltf文件在导出时通常输出两种文件类型。一个是。bin文件,以二进制流的形式存储模型的顶点坐标、顶点法线坐标、贴图纹理坐标、贴图信息等基础数据信息;第二,它是一个. gltf文件,本质上是一个json文件。它将模型顶点的基础数据的索引、材质索引等信息记录在bin文件中,编辑方便,可读性好。
-.glb文件格式只有一种。glb文件导出,所有数据输出为二进制流,通常较小。如果不关心模型中的具体数据,可以直接选择这个类型。
glTF 转换
目前有些建模工具不具备导出glTF格式的功能。您可以导出FBX/科拉达格式,然后通过以下工具进行转换:
-FBX呼叫glTF
A.脸书推出的FBX2glTF命令行工具,可以直接从\x13\x15GitHub官网下载发布版;
B.通过可视化编辑工具(如Paint 3D和Substance Painter)进行变换。
-科拉达至glTF
COLLADA2GLTF命令行工具,可以在。dae格式。直接从GitHub官网下载发布版,解压后在命令行输入目录即可调用。
glTF 查看
转换后,可以通过以下查看工具查看glTF资源:
-3D颜料;Windows 10及以上版本自带的;
-glTF在线观众:https://gltf-viewer.donmccurdy.com;
-对于开发者来说,可以直接使用VSCode插件—— glTF工具。
2. 通过 Draco 进行压缩
Draco 及 gltf-pipeline 介绍
Draco是Google推出的3D模型压缩解压工具库。上面提到的FBX2glTF和COLLADA2glTF工具也嵌入了Draco压缩功能。此外,GLTF资源可以通过基于Draco开发的命令行工具gltf-pipeline进行编码和压缩,gltf-pipeline可以由npm安装和使用。用法如下:
#全球安装
npm安装-g gltf-管道
# compress glb file -b表示输出glb格式,而-d表示压缩。
gltf-pipeline -i模型. glb -b -d
#压缩glb文件,分离纹理图片。
gltf-pipeline -i模型. glb -b -d -t
#查看更多参数
gltf-管道-h
Draco 压缩分析
Draco的压缩基本上是有损的,有两种表现:
-Draco通过Edge breaker 3D压缩算法改变了模型网格数据的索引方式,原有网格顺序缺失;
-Draco通过减少顶点坐标、顶点纹理坐标等信息的位数来减少数据存储量。
但是,在gltf-pipeline或其他压缩工具中,可以通过设置参数来调整压缩程度,如下所示:
当- draco.compressionLevel为0时,会保持原来的网格顺序,网格数据索引的压缩强度最小。-Draco . quantify xxxbits可以控制坐标等基本数据值的个数,位数越小,压缩强度越大。由于一个三角网格对应多个顶点坐标、顶点法线坐标、颜色坐标等数据,一般来说-Draco . quantify xxxbits对文件大小的影响会比较大。
如果没有设置参数,gltf-pipeline将直接按默认值压缩。
Draco虽然具有破坏性,但与直接缩小模型表面相比,Draco压缩方法的视觉偏差要小得多。
压缩后的glTF模型需要在应用中嵌入Draco解码工具包,主要是对边缘断路器算法进行解码。解码时间一般小于编码时间,但是必须考虑模型和工具包的大小比较。比如ThreeJS提供draco_decoder模块进行解码,draco_decoder大概600KB。如果模型资源文件比工具包小,就没有必要引入Draco压缩。
3. 效果测试
我们以太空鹅模型为例。仅加载模型的几何图形,不引入材料属性。FBX/glTF/压缩glTF格式分别通过ThreeJS加载,第三种格式用默认参数压缩。测试结果比较如下:
从图中可以看出,从FBX转换成glTF后,文件大小差别不大,但渲染速度明显提高。
另外,压缩后的glTF文件只有正常FBX和glTF文件的1/10左右,三个文件的几何结构在视觉上没有明显的区别。压缩后的glTF启动工作线程进行Draco解码,解码模型要多花一点时间。
模型贴图的优化上述模型压缩仅用于模型网格数据,不会处理glTF文件中的贴图。但是,在许多情况下,地图文件比模型大。此时,模型和纹理贴图需要分别处理(建模时,分别输出一个带有UVtag纹理坐标的“白色模具”和要使用的纹理贴图)。下面描述了如何优化用于应用程序呈现的映射文件。
1. 贴图加载过程分析
以一个基于物理引擎渲染的电视演示模型为例,一般会输出几个大尺寸的贴图文件:颜色贴图、法线贴图、金属粗糙度贴图,如下图所示:
输出的贴图一般是png格式,很多同学会通过压缩png或者把png转换成jpg格式来减小纹理大小。其实这种处理方式只是优化了图片的加载速度。加载后,所有的png/jpg在渲染前仍然需要转码成纹理,而纹理贴图大小相同的GPU占用的内存大小相同,所以压缩后的png/jpg并没有优化渲染过程。
好在很多设备都有可以直接用于渲染的GPU压缩纹理格式,压缩后的纹理可以比png直接转换的纹理缩小5倍甚至更多。如果直接提供压缩纹理格式,就不需要png的转码过程,可以大大减少纹理内存。如下面的方案2所示:
但由于GPU芯片提供商太多,设备的压缩纹理格式多种多样(比如安卓设备常见的格式是ETC1/ETC2,苹果设备常见的格式是PVR TC……),手动输出多种格式成本较高,导致方案2难以落地。
2. Basis Universal 压缩
转折点是今年5月,二项式公司推出了Basis通用压缩GPU纹理技术。Basis Universal支持多种常用的压缩纹理格式。png转换成basis文件后,大小和jpg格式差不多,但在GPU上比png/jpg小6-8倍。
basis文件被应用加载后,可以被basis转码器快速转换成适合设备的压缩纹理格式。如下图所示(图片来自谷歌博客):
基础用法也相对简单。可以通过basisu命令行工具压缩png,直接从\x15github官网下载发布版或者通过CMake编译源代码。以Mac系统为例(Windows系统将命令改为basis.exe),列举几种常见用法:
#输入执行目录
cd bin-osx
#转换。png格式转换为。基础。/巴西苏xxx.png
#针对线性色彩空间的贴图,如法线/金属/粗糙度贴图,需要添加-linear。/巴西苏xxx.png-线性
#最大化画质转换。/basisu xxx.png-comp _ level 5-max _ endpoints 16128-max _ selectors 16128-no _ selector _ RDO
#最大程度压缩线性色彩空间的贴图。/巴西苏xxx.png-线性-全局_选择_ pal-否_混合_选择_cb
生成的。基础文件需要通过程序中的转码器转换成设备的压缩纹理格式。例如,它可以由ThreeJS中的basisTextureLoader转换。具体用法请参考\x14ThreeJS官网\x15。
3. 效果测试
为了让数据更加明显,我们在Mac Chrome浏览器的性能模式下,用ThreeJS分别加载了4096 x 4096的彩图、法线图、金属图和粗糙图,对比如下:
上图使用的basis map的资源文件大小比png减少了11倍以上,主线程的脚本时间和绘制时间也比png/jpg map少。
需要注意的是,由于压缩纹理格式的不同,在基础文件一致的情况下,不同设备的渲染性能可能不一致,这需要进行多端测试。目前部分格式不支持alpha通道,如果半透明颜色贴图无效,可以考虑单独分离alpha贴图。
前景
除了基于webGL的H5,glTF和Basis还可以用于其他基于OpenGL渲染的应用。值得期待的是,目前Google和Binomial正在推进Basis Universal和glTF 3D传输标准的合作。或许在不久的将来,可以迎来与基础图结合的glTF格式,模型可以直接导入到应用中,不需要额外的处理。
参考资料
1.https://spin . atomic object . com/2018/09/30/compress-3d-files-Draco/
2.https://neil3d.github.io/3dengine/gltf-mesh.html
3.https://github.com/google/draco
4.https://www . ECE . uvic . ca/~ Frodo/publications/yuetang _ Meng _ project _ slides . pdf
5.https://developers . Facebook . com/docs/sharing/3d-posts/GL b-tutorials
6.https://github.com/AnalyticalGraphicsInc/gltf-pipeline
7.https://www.khronos.org/gltf/
8.https://news.ycombinator.com/item? id=19986749
9.https://github.com/BinomialLLC/basis_universal
10.https://www . khronos . org/blog/Google-and-binomial-contribute-basis-universal-texture-format-to-khronos-gltf-3d-transmission-open-standard
数字模型渲染图
赣州三维可视化建模、数字孪生智能工厂三维模型开发、智能城市公园三维模型。赣州三维建模可视化管理平台利用可视化技术对数据中心进行描绘,又称虚拟仿真,即通过技术手段(从建筑到设备、从楼层到网线)对数据中心内的所有物理对象进行建模,在计算机中以三维方式生成,供用户查看、交互和分析。机房不再需要在现实中用脚去参观和查看,而是可以随时随地从任何视角进入。武汉的3D建模与可视化平台通过动态模拟和虚拟环境的建立,使参与者能够直接交互、优化和可视化管理虚拟机房或园区。这种新颖的管理手段可以大大提高数据中心机房用户的管理水平和效率,打造机房监控的新形象。
赣州三维可视化建模过程。专业建模软件输出3D模型,用ps等绘图软件制作地图。最后,渲染器将光照信息烘焙到纹理中。最后,模型软件输出通用模型格式和烘焙图,完成三维模型。Cancer Digital Technology会将完成的3D模型和地图导入可视化平台进行调试。它将根据设备的现场环境,在可视化平台中模拟灯光和环境细节,制作动画,并嵌入2D数据看板,丰富场景细节,完成数字双胞胎创建的重要一步。
赣州三维可视化建模、数字孪生智能工厂三维模型开发、智能城市公园三维模型。
赣州工业机械三维可视化展示在企业产品展示方面优势明显,三维展示生产展示能力强。可以结合3D建模和游戏引擎实时内容开发平台,全方位展示工业智能机械产品的性能特点、使用方法、生产数据实时查看、生产过程、后期维护等,也让客户了解产品是否符合自己的需求,性价比是否高。北京智能工厂三维可视化建模可以通过三维空间展示机械过程、内部结构、工作原理等方面,可以展示产品的内部结构。
赣州数码双胞胎智能工厂提供实地照片、CAD图纸、航拍照片等素材,实现定制化一对一3D建模渲染。写实风格和科技风格一应俱全,为3D可视化园区或工厂展现立体效果,大大增加可视化管理平台的真实性。为企业提供实时数据,集成三维建模和可视化系统。三维建模和渲染模型可以借助游戏引擎UE等技术与各种数据格式进行集成,实现与企业数据的无缝集成,为项目提高决策效率。