三维模型轻量化技术
2021-06-02陈龙郭军张建中
陈龙, 郭军, 张建中
(煤炭科学研究总院 矿山大数据研究院, 北京 100013)
收稿日期:2021-02-24;修回日期:2021-04-26;责任编辑:盛男,郑海霞。
基金项目:北京市科技计划应用技术协同创新资助项目(Z201100004520015);中国煤炭科工集团有限公司科技创新创业资金专项资助项目(2019-2-ZD002)。
作者简介:陈龙(1987—),男,山西山阴人,工程师,硕士,主要从事三维地理信息系统研发工作,E-mail:chenlong@ccteg-bigdata.com。
引用格式:陈龙,郭军,张建中.三维模型轻量化技术[J].工矿自动化,2021,47(5):116-120.
CHEN Long,GUO Jun,ZHANG Jianzhong.3D model lightweight technology[J].Industry and Mine Automation,2021,47(5):116-120.
0 引言
随着WebGL技术的出现,用户无需安装任何插件就可在浏览器端直接打开三维可视化系统,提高了用户体验[1]。Cesium是一款基于WebGL技术实现的三维渲染引擎,在HTML5标准的浏览器和移动端运行[2],有详细的API文档和活跃的社区支持,可实现2D、2.5D、3D形式的地图展示。通过Cesium将煤矿空间地理信息进行可视化表达,为煤矿“一张图”、管控一体化、煤矿数字孪生等应用提供了保障[3]。
随着三维模型数据量的增大,模型加载速度降低且浏览不流畅,因此需要对三维模型进行轻量化处理,但是Cesium并没有提供三维模型轻量化工具[4]。本文在分析Cesium的模型格式3DTiles的基础上,从批渲染、带宽节省和数据量降低3个方面提出了一种三维模型轻量化技术,可达到三维模型高效加载且浏览流畅的目的。
1 3DTiles格式
3DTiles是散列文件的合集,记录了模型属性数据、逻辑关系等,是一种对数据的组织方式[5]。3DTiles在glTF基础上加入了 多细节层次(Level of Detail,LOD)结构,如图1所示。
图1 3DTiles结构Fig.1 3DTile structure
3DTiles包括tileset.json文件和Data文件。Data文件里面包括多个三维瓦片文件集Tile_0_0,Tile_0_1,…,每个瓦片文件集包括1个json文件和Tiles,Tiles里面包含多个Tile文件。
1.1 tileset.json
tileset.json文件是3DTiles的入口文件,用来描述整个三维瓦片文件集,记录逻辑信息及其他元数据[6]。tileset.json文件中的属性content记录了瓦片文件集的相对路径,通过该属性可进行数据查找。
1.2 Tile
Tile是一个二进制的瓦片数据,包括Batched 3D Model (b3dm)、Instanced 3D Model (i3dm)、Point Cloud(pnts)、Composite(cmpt) 4种格式,可用于不同场景。
Tile文件结构如图2所示。
图2 Tile文件结构Fig.2 Tile file structure
(1) header。header格式见表1。header占28 byte,包括7个属性数据。header主要对Tile文件进行了描述,且记录了Tile的类型、版本号、文件大小、FeatureTable的json长度、FeatureTable二进制数据长度、BatchTable的json长度、BatchTable二进制数据长度。
表1 header格式Table 1 Format of header
(2) FeatureTable。FeatureTable记录整个瓦片渲染的相关数据,由FeatureTableJson和FeatureTableBinary组成。FeatureTableJson是元数据的角色,以json方式记录模型的个数、坐标中心等。FeatureTableBinary记录二进制本体数据。
(3) BatchTable。BatchTable记录每个模型的属性数据及扩展数据,由BatchTableJson和BatchTableBinary组成。BatchTableJson记录属性的描述信息、字节偏移长度、数据类型等。BatchTableBinary记录二进制本体数据,根据BatchTableJson记录的信息可在二进制本体数据中进行定位。
(4) glb。内嵌的glb符合glTF数据格式规范,所有的几何信息、纹理信息、可编程管线等均存储在glb中。
2 轻量化关键技术
影响三维场景渲染性能的因素有CPU、GPU和带宽。CPU性能降低的原因包括使用过多的DrawCall、复杂的脚本或物理模拟。如果GPU中使用了过多的顶点及逐顶点计算,会造成GPU资源浪费。三维模型是由几何信息、材质、贴图组成,为了减小模型文件大小,要求模型中使用的贴图尺寸不能过大,将纹理图片和几何信息进行压缩,从而可降低三维模型的文件大小,利于网络传输。
2.1 批渲染
图形渲染的原理是CPU向GPU发送渲染命令,GPU接收并执行相应的渲染命令。DrawCall是CPU通过调用DirectX或OpenGL的图形编程接口来命令GPU进行渲染操作,CPU每一次提交命令给GPU,都需要做大量工作[7]。在渲染每个不同材质的物体时,均需要调用相应的API。当DrawCall过多,CPU就会产生很多额外开销用于准备工作,花费大量时间将命令提交给GPU,造成CPU负载增加,GPU资源浪费。采用批渲染将渲染状态(如材质、贴图、可编程管线、几何信息等)一致的物体合成1个大物体,放在1个DrawCall中,在1次渲染任务中进行绘制,GPU不用多次切换渲染状态[7],提高了渲染效率。
(1) 材质共享。将模型中使用的纹理图片通过算法进行合并,重新计算并记录纹理坐标,将多张小纹理图片合并成1张大纹理图片。使用了同一张纹理图片,就可以使用同一种材质,然后使用不同的采样坐标对纹理图片采样[8],就能实现正确的纹理贴图。CPU无需多次调用图形API,在1个DrawCall中就可以加载合并后的大纹理图片。多张小纹理图片合并成1张大纹理图片的效果如图3所示。
图3 纹理图片合并Fig.3 Texture image merge
(2) 模型网格合并。对于使用了同一种材质的纹理,它们之间仅模型的几何信息不同,如顶点、索引、法线、纹理坐标等。如果将这些数据在允许的数量范围内进行合并,将合并后的顶点缓存对象提交给GPU,就可以在1个渲染批次完成三维模型渲染。
2.2 带宽节省
影响浏览器加载三维模型速度的重要因素是带宽。对网络传输数据进行压缩,最大限度地节省带宽,提高三维视觉体验。
(1) 纹理压缩。Crunch是一个开源的压缩算法,其解压速度很快。该算法可大幅降低纹理的存储大小,降低显存及数据请求时间,压缩经过合并的纹理,将压缩后的纹理通过二进制方式写入Tile的glb中,在使用的时候进行解压,提升数据解析及加载渲染的效率。
(2) 顶点压缩。使用Draco对模型几何网格的连接信息和几何信息分别进行编码,之后进行压缩,将压缩后的信息通过二进制方式写入Tile的glb中,加载模型时,通过解析压缩信息,得到正确的模型几何信息。使用Draco压缩算法可节省约80%的存储空间[9]。
(3) 多级渐远纹理(Mipmap)。因为模型数据要生成多级LOD模型,如果每一级都使用同一高精度纹理,会产生纹理浪费。对合并后的大纹理图片进行重采样,逐级生成低精度的Mipmap层级,保证在每一级使用不同精度的纹理图片,最大限度降低显卡显存占用率[10-11]。利用Mipmap将合并的纹理图片转换成不同分辨率的纹理图片,如图4所示。
图4 多级纹理图片Fig.4 Multi-level texture image
2.3 数据量降低
GPU的渲染能力与模型的顶点数量有关,顶点数量庞大,GPU负载增加。在不影响视觉体验的情况下,减少模型的顶点数量,可减轻GPU负载压力。
(1) LOD。在三维场景中,如果相机位置较远,肉眼难以区分模型的细节部分,采用LOD技术逐级减少模型的顶点数量,从而减少GPU的渲染数据量,提高三维场景流畅性[12]。为同一个对象准备多个包含不同细节程度的模型,并将模型赋值给LOD的不同等级,将不同细节程度的模型组织好父子关系,并设置相机参考值,Cesium在加载模型时,会自动根据相机位置来判断加载哪个等级的模型[13]。
(2) 三角面简化。采取边折叠算法生成连续的细节层次,该算法的优势在于移除不必要的硬边及纹理衔接,避免边界平滑和纹理分离[14]。通过对边折叠算法进行改进,可设置三角面简化的比例,在允许范围内尽量保持简化模型一致。不同三角面简化比例模型如图5所示。可看出原始模型表面光滑,具有很多细节,三角面数量较多;三角面简化50%后的模型细节有所简化;三角面简化80%后的模型三角面数量已大量减少。
图5 不同三角面简化比例模型Fig.5 Simplified scale model of different triangles
在最大程度保持模型外观的基础上,通过逐级简化来减少顶点数量。如果模型在距离相机较远的位置,使用三角面简化80%的模型;若模型在距离相机较近的位置,使用三角面简化50%的模型;若模型在距离相机很近的位置,使用原始模型,这样可以缓解GPU压力。
(3) 数据空间结构组织。3DTiles在三维模型中支持自适应空间细分,包括kd树、四叉树、八叉树等空间数据结构。每种空间数据结构具有不同的使用场景,本文采用八叉树算法[15-16]对模型数据进行分块。根据模型复杂程度,自适应设置八叉树深度。按需加载模型的某一部分并进行渲染,从而提高场景流畅度。
3 应用效果
使用CPU I7-8750、内存为16 GB、显卡 NVIDIA GTX1060、显示器刷新率为60 Hz的电脑,基于Cesium平台对三维模型轻量化处理前后的帧速率进行测试,结果见表2。可看出三维模型轻量化后的帧速率有所提高,达到了提高加载速度、使浏览更加流畅的目的。
表2 三维模型轻量化前后帧速率对比Table 2 Frame rate comparison before and after 3D model lightweight
4 结语
在分析Cesium的模型格式3DTiles的基础上,提出了三维模型轻量化技术。将模型中的纹理图片依据材质和模型网格进行合并,实现正确纹理贴图,降低了DrawCall调用次数;将纹理和顶点进行压缩,降低了纹理图片文件大小;采用Mipmap生成不同分辨率的纹理图片,有利于网络传输;使用LOD和三角面简化技术,逐级降低模型的顶点和三角面数量;根据模型复杂程度,自适应选择八叉树深度,按需加载模型的某一部分,从而降低GPU的渲染数据量,提高三维场景流畅性。基于Cesium平台对三维模型轻量化处理前后的帧速率进行测试,结果表明,三维模型经轻量化处理后帧速率有所提高。