走进汉振
INTO HANCHINE
汉振分享 | 基于LOD技术优化3D渲染的实现
日期:2020年03月31日

细节层次(Levels of Detail,简称LOD)模型的概念,普遍认为当物体覆盖屏幕较小区域时,可以使用该物体描述较粗的模型,并给出了一个用于可见面判定算法的几何层次模型,以便对复杂场景进行快速绘制。1982年,Rubin结合光线跟踪算法,提出了用复杂场景的层次来表示算法及相关的绘制算法,从而使计算机能以较少的时间绘制复杂场景。

LOD技术在不影响画面视觉效果的条件下,通过逐次简化景物的表面细节来减少场景的几何复杂性,从而提高绘制算法的效率。该技术通常对每一原始多面体模型建立几个不同逼近精度的几何模型。与原模型相比,每个模型均保留了一定层次的细节。在绘制时,根据不同的标准选择适当的层次模型来表示物体。

目前,LOD技术已广泛地应用于实时图像通信、交互式可视化、虚拟现实、地形表示、飞行模拟、碰撞检测、及限时图形绘制等领域,成为一项要害技术。很多造型软件和VR开发系统都开始支持LOD模型表示。


Hinkler等的几何优化方法检测出共面或近似共面的三角面片,将这些三角面片合并为大的多边形,然后用较少数目的三角形将这个多边形重新三角化。这个方法的步骤是:


面片分类依据的是他们各自的法线之间的夹角。该算法的误差衡量标准可以归为全局误差,但是由于它仅仅依据法线之间的夹角,其误差评估准确性较差。它不能保证一定误差限制。


几何元素删除法由局部几何优化机制驱动,要计算每次删除产生的近似误差。

Schroeder的顶点删除算法通过删除满足距离或者角度标准的顶点来减小三角网格的复杂度。删除顶点留下的空洞要重新三角化填补。该算法速度快,但不能保证近似误差。它估算局部误差时,未考虑新面片同原始网格的联系和误差积累。

Hoppe的渐进网格算法包含基于边折叠的网格简化方法、能量函数优化和新的多分辨率表示。算法采用了单步和可逆的边折叠操作,可以将整个简化过程存入一个多分辨率数据结构(称为渐进网格表示(PM))。PM方案由一个简化网格Mk和一系列细化记录(通过与从原始网格M0得到简化网格Mk的简化步骤的相反步骤得到), 这些细化记录可以使网格Mk通过逐步求精得到任意精确度的网格Mi。在简化过程中,将每条边按照其折叠的能量代价排序得到一个优先级队列,通过这个队列实现边折叠操作。该算法也是采用全局误差度量。


Rossignac等的顶点聚类算法通过检测且合并相邻顶点的聚类来简化网格。每个聚类被一个代表顶点取代,这个代表顶点可能是顶点聚类的中心或者是聚类中具有最大权值的顶点(定义顶点的权值是为了强调相对的视觉重要性)。然后,去除那些由于聚类操作引起的重叠或者退化的边或者三角形。

算法简化引入的误差由用户定义的准确度控制,这个标准用来驱动聚类尺寸的选择。该算法实现简单、速度快,但是没有考虑到保持原始网格的拓扑和几何结构,有可能生成非常粗糙的近似网格。


Turk的重新划分算法先将一定数量的点分布到原有网格上 ,然后新点与老顶点生成一个中间网格,最后删除中间网格中的老顶点,并对产生的多边形区域进行局部三角化,形成以新点为顶点的三角形网格。其中分布新点采用排斥力算法,即先随机分布新点,然后计算新点之间的排斥力,根据排斥力在网格上移动这些新点,使它们重新分布。排斥力的大小与新点之间的距离、新点所在三角形的曲率和面积有关。

这种方法对那些较光滑的模型是很有效的,但对于那些不光滑的模型 ,效果较差;由于根据排斥力重新分布新点,涉及到平面旋转或投影,计算量和误差都较大。


Eck等的基于小波变换的多分辨率模型使用了带有修正项的基本网格,修正项称为小波系数,用来表示模型在不同分辨率情况下的细节特征。算法的三个主要步骤:


此算法可以处理任意拓扑结构的网格,而且可以提供:有界误差、紧凑的多分辨率表示和多分辨率尺度下的网格编辑。


汉振通过对底层opengl底层函数的封装和优化,开发出了实用性更强的3D渲染库,主要用于处理3D点云和模型数据的显示和交互性操作,也提供部分3D数据的优化算法。利用到LOD技术,实现了对大数量级的点云数据和复杂的大型模型的优化显示。不断切换模型和点云的颗粒度,来实现更高效率的点云显示,让用户操作过程中没有受到数据量的拖累,极大的提高了用户操作的体验,也释放了更多的计算机资源给用户和开发人员。


对于模型而言,其实和点云的处理类似,不同的是,模型的各个顶点需要重新组合成面片,然后对不同层级的LOD模型进行重新的渲染显示。从图2、图3、图4中可以看到,模型的颗粒度变化可能看起来不明显,但是坐标系下的LOD颗粒度变化明显,通过不断的拉近模型的距离,坐标系的网格明显增加,同时将不在摄像机范围内的渲染场景裁剪掉,来实现数据的渲染优化。


在点云数据密集的时候,将点云数据进行分别提炼,保留主要的点云数据,当对点云进行放大的时候,及时进行点云的切割和分离,并降低提炼的等级,显示出颗粒度更高的LOD级别的显示内容。如图所示就是百万级点云数据,不断放大时,LOD细化的示意图。通过有效的裁剪和LOD细化,将渲染的数据控制在合理的范围内,当不断地拉近点云时,将更多的细化点云数据,并且不断裁剪场景视野外的内容,减轻渲染压力,获得性能上的提升。图5,6,7,8,9就是各个LOD层级下的细化表现。


更多机器视觉分享,欢迎继续关注“汉振智能”....