您好, 访客   登录/注册

基于体素地形的优化研究

来源:用户上传      作者:

  摘要:在充分认识体素的基本概念和基于体素地形表达的特点上,结合UE4分析了体素地形对于三维地形的构建带来的影响及体素地形构建过程中的优化分析。通过对体素建模过程中出现的一些问题,提出相应的解决方案。
  关键词:体素;虚拟地形;Unreal Engine;三维建模
  中图分类号:TB文献标识码:Adoi:10.19311/j.cnki.1672-3198.2019.10.079
  三维地形可视化是对现实世界中的自然地理环境的表达和模拟,以期望用计算机的方式来表达和模拟现实世界,即现在常说的虚拟现实。构建和表达地形的方式多种多样,可以通过使用一些工具来完成建模,如Unity Engine、UE4、Cry Engine等。三维地形的实现方式各有不同,从其模型构建的本质上可分为两类:基于多边形的面模型和基于体素的体模型。大多数的三维地形采用的是基于多边形的面模型来建模,如三角形网格模型。对于一些简单的地形环境,使用面模型来建模往往可以达到比较好的可视化效果,并且基于面模型的三维可视化技术比较成熟,有许多的优化手段和解决方案,如LOD层次细节模型。面模型可视化方法在表现洞穴,拱桥和垂壁等复杂地形的时候,有很大的缺陷,如效率低、表现不好,并且难以实现地形体数据的表达和实时编辑,尤其在地理空间变化的模拟上(如侵蚀现象),表现效果不佳。
  基于体素的体模型在地形可视化方向的应用晚于面模型,基于其在复杂地理空间中的较好表现效果,和其在游戏场景中有着重要的作用,现在越来越多的引起人们的关注。三维游戏世界场景广泛使用三角形网格模型(3D triangle mesh)构建,包括地形、建筑、植被以及其他静态物件。一些以自然环境为主的游戏,如大部分RPG、MOBA类型游戏,会使用到高度场(height field)去表示地形;一些室内游戏,如FPS、TPS、ACT等,会使用构造实体几何(construct solid geometry,CSG)技术去构建基本的室内环境(也可以称为BSP/binary space partitioning 笔刷)。以上这些制作方式各有优缺点,面模型是合乎当代硬件的游戏世界表示方式,也是较自由的建模方式,并有成熟的数字创作工具如3ds Max和Maya。面模型建模的缺點有建模成本高、只有表面表示方式,无法判断是否在其内部,并且不容易修改,不容易做连续或离散级数的细致程度(level of detail,LOD)等。这时随着开放世界类型游戏的出现,体素(voxel)开始越来越被人们所熟知。
  1体素的概念和特点
  Wikipedia给出Voxel的定义为“Voxel(体素,更准确地说是测定体积的像素)是一个体积像素,用来表示三维空间中规则格网的值。类似于二维空间中用来表示二维图像数据的像素。”每个体素使用一个比特来进行存储,表示该空间是实心还是空心,这种二元体素(Binary Voxel)虽然是最简单的体素形式,但它还可以存储其他属性。例如在《我的世界》中的体素会存储空间中的材质(泥土、石头、水等)。体素地形库(DatabaseBlock)是体素管理的基本单位,所有的体素是在体素地形库中生成。构建地形需要的体素数据为地形的绘制、地形的AO、地形的碰撞、地表的植被、地形的修改。
  2地形系统的构建及改进
  2.1根据需求构建地形系统
  首先定义可视范围,对可视范围内的地形进行渲染,以体素地形库(DatabaseBlock)为单位,管理地形。然后每帧查询可视范围内的DatabaseBlock,如果发现DatabaseBlock对应的Mesh不存在(即没有被渲染),则从体素地形库中获取DatabaseBlock中对应的体素数据,根据体素数据构建渲染模型(RenderMesh)进行渲染,再构建碰撞模型(CollisionMesh),用于进行碰撞检测,同时根据体素可以生成植被等渲染信息。当地形库中的体素数据发生修改的时候,需要体素地形库通知地形系统,重新获取体素数据,进行模型的构建和渲染。
  2.2当前体素地形存在的问题
  系统运行时会出现运行时卡顿,地形范围不能太大,地形的AO不能影响地形上其他的模型(Mesh)等。
  2.3出现的问题类型
  (1)DrawCall数量太多。
  由于针对每个RenderBlock进行Mesh的提取,每个类型的体素都对应一个或者多个不同类型的材质(最多为6个),复杂的体素类型导致了超多的材质,从而使得DrawCall数量暴增。
  可简化为公式:
  每个体素需要六种材质 * 体素的类型数(200)= 总共需求的材质种类(1200)
  (2)三角形数量过多。
  由于体素地形的特殊性,提取mesh是按照简单立方体表面提取算法来提取的,将导致有大量冗余的三角形产生,可以删除冗余的三角形,简化渲染模型。如对于大面积的水域,使用两个三角形就可以绘制。
  (3)视锥剔除效率低下。
  选取DatabaseBlock为大小作为渲染Mesh的单位,单位过大。渲染采用的是外包盒的方式渲染,由于整体的包围盒比较大,进行视锥剔除的效率偏低。本来可以不用提交渲染的Mesh,也不能被剔除。
  (4)没有进行遮挡剔除。
  对地形系统中,一个很重要的优化手段就是遮挡剔除,即被遮挡的Mesh,不应该被提交渲染。
  (5)地形上物体不会受到AO的影响。
  由于计算完地形的AO值后,直接通过地形的顶点信息传入Shader中,计算光照信息的时候只是对地形产生影响,不会对地形上其它的物体产生影响。比如NPC从洞外进入山洞里不会变暗。
  (6)植被的管理以及渲染效率低下。   由于存在大量的树木,直接对树木进行渲染,将会导致渲染效率低下,应该使用实例化的方式进行渲染,并且要考虑遮挡剔除等。
  (7)其它一些问题。
  碰撞检测效率不高,物理碰撞的Mesh没有优化,导致物理引擎中碰撞效率不高。顶点数据格式过大,导致带宽需求变大,同时CacheMiss的概率也响应增大。对Block线性遍历,遍历Block的复杂度为O(n),可以使用加速结构提高Block的遍历效率。
  2.4针对上述问题提出的优化方案如下
  (1)减少材质的数量,使用TextureArray,保证尽可能少的Material。
  (2)使用冗余三角形的删除算法,减少三角形的个数。
  (3)使用紧凑的顶点坐标格式,减少带宽的依赖以及CacheMiss的概率。
  (4)视锥剔除时,使得测试目标变小,提高视锥剔除的效率。
  (5)使用遮挡剔除,减少提交渲染物体的数量。
  (6)使用3DTexture存储AO值,渲染其它物体的时候,AO值参与计算。
  (7)使用实例化的方式渲染树木等静态物体,使用二叉树进行管理,并使用遮挡测试进行优化。
  (8)使用Octree管理地形,提高渲染节点的遍历效率,并使用合并Mesh的方法进行优化。
  (9)使用地形的LOD提高渲染的效率。
  3结语
  通过上述提出的优化方案,可以有效的解决系统运行卡顿,地形范围过小以及AO影响等问题。三维模型的构建使用传统的基于多边形的方式,在地形复杂性和灵活性的表达上,具有很大的限制;基于体素的地形制作方式,带来了各种创新的方式,提高三维世界场景品质的同时,节省了成本。现在虚拟现实技術的成功,很大一部分来源于三维虚拟世界的高度逼真,让人沉浸其中。而基于体素建模的应用可以很好的满足高品质场景的要求。随着体素建模技术的发展与成熟,留给我们的既是机遇也是挑战。
  参考文献
  [1]蒋秉川.基于体素模型的战场环境建模与可视化研究[D].郑州:解放军信息工程大学,2013.
  [2]蒋秉川,游雄,夏青.一种基于体素的三维地形可视化方法研究[J].测绘通报,2013,(03):46-49.
  [3]蒋秉川,万刚,范承啸,夏青.战场环境体素模型适应性分析及体要素分类方法研究[J].系统仿真学报,2017,29(02):241-247.
  [4]Wikipedia[EB/OL].http://en.wikipedia.org/wiki/Voxel,2012.
转载注明来源:https://www.xzbu.com/2/view-14893135.htm