一种体素地形的管理方法与流程

文档序号:17660384发布日期:2019-05-15 22:20阅读:242来源:国知局
一种体素地形的管理方法与流程

本发明涉及游戏引擎开发技术领域,特别涉及一种基于体素地形系统环境光遮蔽、碰撞模型以及实例化静态模型管理的方法。



背景技术:

目前,随着游戏《我的世界》的火热,基于体素地形的游戏也变得越来越流行。由于其本身所拥有的可定制、可扩展性,使得它更是游戏玩家所追逐的对象。

由于基于体素地形的复杂性,导致如何高效的管理体素地形变得异常的复杂。目前,已经能够管理并且绘制超大的地形系统。对于游戏来说,仅仅地形并不是游戏的全部,游戏中地形系统周边的模块也非常重要,比如附着于地形上的植被、宝箱等。在渲染效果方面,由于地形的可编辑性,游戏中地形的环境光遮蔽需要实时的计算,如何高效的计算地形的环境光遮蔽也是比较棘手的问题。最后,游戏中还有一个重要的内容——碰撞检测,对于当前的背景下,大部分游戏都会选择使用物理引擎来进行碰撞检测的计算,使用物理引擎来进行碰撞检测,需要我们首先构建出碰撞模型,然而由于地形的可编辑性,如何在编辑完地形后快速的构建出碰撞模型,在物理引擎中使用,也给我们带来了一个不小的挑战。



技术实现要素:

为了解决现有技术存在的不足,本发明的目的在于提供一种体素地形的管理方法,通过使用简化的环境光遮蔽算法保证了计算环境光遮蔽的执行效率,通过使用简单的立方体表面提取算法保证了提取网格的高效性,使用二叉树进行管理实例化的静态网格,提高了视锥剔除的效率。

为实现上述目的,本发明提供的体素地形的管理方法,包括以下步骤:

1)选择构建地形,计算地形的环境光遮蔽信息并将其存储到3d纹理中,对环境光遮蔽进行处理;

2)使用立方体表面提取算法以及greedymeshing算法,对碰撞网格进行处理;

3)使用二叉树将静态网格进行实例化。

进一步地,步骤1)所述计算地形的环境光遮蔽信息,是采用当前体素上方,且在指定的半径范围内的实心体素对当前体素所在位置的环境光遮蔽产生影响的方法,计算环境光遮蔽信息;遍历所有的体素,计算出当前位置的环境光遮蔽信息。

进一步地,步骤1)所述将环境光遮蔽信息存储到3d纹理,是使用两个3d纹理,一个作为写缓存,另一个作为读缓存。

进一步地,所述步骤2)进一步包括,遍历所有体素,对同步范围内的碰撞网格采用立方体表面提取算法对其进行提取。

进一步地,所述步骤2)进一步包括以下步骤:

51)使用异步并行机制提取碰撞网格;

52)使用greedymeshing算法进行冗余三角形的删除;

53)将碰撞网格的数据cook为物理引擎使用的数据;

54)将可视范围内的碰撞网格传入物理引擎,进行碰撞检测的计算。

进一步地,所述步骤3)进一步包括以下步骤:

61)对空间进行分割,构建二叉树;

62)使用紧凑型的遮挡测试;

63)使用二叉树的深度优先遍历,提前检测出需要裁剪的节点,减少提交的网格数量;

64)使用优先plainnode的方式进行构建。

进一步地,所述步骤61)进一步包括,使用表面积启发算法进行空间的分割,构建二叉树,二叉树的叶节点对应每个要渲染的网格,其中存放位置、朝向、缩放信息;非叶节点记录孩子节点的数量、当前所表示的包围盒的大小的信息。

更进一步地,所述步骤64)进一步包括以下步骤:

存储编辑的静态网格信息,使用plainnode管理编辑的网格信息,构建plainnode对应信息;

更新二叉树,将对应修改过的节点标记为不渲染状态,修改实例化的数据,将模型的缩放改为零使其隐藏;

plainnode管理的节点和二叉树同时渲染;

通过最新的静态网格信息重新构建二叉树,然后取消plainnode的渲染;

使用最新的二叉树进行渲染静态网格。

为实现上述目的,本发明还提供一种计算机可读存储介质,其上存储有计算机指令,所述计算机指令运行时执行上述的体素地形的管理方法的步骤。

为实现上述目的,本发明还提供一种游戏终端设备,包括存储器和处理器,所述存储器上储存有在所述处理器上运行的计算机指令,所述处理器运行所述计算机指令时执行上述的体素地形的管理方法的步骤。

本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。

附图说明

附图用来提供对本发明的进一步理解,并且构成说明书的一部分,并与本发明的实施例一起,用于解释本发明,并不构成对本发明的限制。在附图中:

图1为根据本发明的体素地形的管理方法流程图;

图2为根据本发明的实施方式的环境光遮蔽中3dtexture(3d纹理)吸附前后的俯视图以及使用双buffer(缓存)机制提高渲染效率的示意图;

图3为根据本发明的实施方式的对静态mesh(网格)的管理与实例化渲染示意图;

图4为根据本发明的实施方式的对静态网格进行实例化管理的流程图。

具体实施方式

以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。

图1为根据本发明的体素地形的管理方法流程图,下面将参考图1,对本发明的体素地形的管理方法进行详细描述。

首先,在步骤101,选择构建地形,并计算地形的环境光遮蔽信息,存储在3d纹理中进行环境光遮蔽的处理。

在该步骤中,通过使用3dtexture(3d纹理)来保存ao(环境光遮蔽)信息,保证了地形以及地形上其它mesh(网格)受环境光遮蔽的影响,使用简化的环境光遮蔽算法,保证了计算环境光遮蔽的执行效率。

由于基于体素的地形是动态创建的,并且需要实时的编辑地形,导致不能使用传统的离线生成地形环境光遮蔽的方式来处理地形的环境光遮蔽效果。并且由于体素地形的特殊性,比如洞穴等,需要对地形上的物体(玩家、npc、花草树木等)产生影响,这些都是需要实时计算的。如果直接使用射线追踪的方式进行计算,将会导致计算量非常大。所以本发明选择构建地形的时候,同时计算地形的环境光遮蔽信息,并存储在3d纹理中,在渲染地形和其它物体的时候使用该3d纹理。

在本实施方式中,为了简化计算,在计算体素所在位置的环境光遮蔽算法中,采用当前体素上方的并且是在一定范围内的实心体素才会对当前体素所在位置的环境光遮蔽产生影响的方法,来计算环境光遮蔽信息。当然,如果地形是悬浮在半空中的,比如浮空的岛屿等,就不仅要判断上方的遮挡,还要判断下方的遮挡信息,并且为了达到好的表现效果,可以通过使用权重值来增强效果,比如上方对环境光的遮挡比下方的遮挡更多等。还需要定义一个半径,只有在该指定的半径范围内的体素才会对当前体素所在位置产生遮挡。通过遍历所有的体素,计算出当前位置的环境光遮蔽信息。在本实施方式中,选择使用分辨率大小为256*256*256的3d纹理,来存储游戏世界中范围为256*256*256m的环境光遮蔽信息,由于可视范围比较大,而用来存储环境光遮蔽信息的3d纹理不能太大,否则占用内存太多,所以需要3d纹理对摄像机进行吸附,即当摄像机移动的时候,要保持摄像机一直在3d纹理的中心处所表示的位置上,让3d纹理尽可能完全覆盖摄像机的周围。

图2为根据本发明的实施方式的环境光遮蔽中3dtexture(3d纹理)吸附前后的俯视图以及使用双buffer(缓存)机制提高渲染效率的示意图,如图2所示,计算完成环境光遮蔽信息后,把环境光遮蔽信息存储在3d纹理上,在绘制地形或者其它的mesh(网格)时候使用该3d纹理。当摄像机移动的时候,需要对3d纹理进行吸附。由于吸附的过程中,需要对3d纹理上的环境光遮蔽信息进行更新,为了减少上传到gpu(图形处理单元)的资源大小以及出于对延迟的考虑,在本实施方式中,选择使用双buffer(缓存)的机制,即,使用两个3d纹理,一个作为写buffer(缓存),一个作为读buffer(缓存)。具体地,当将3d纹理进行吸附后,需要更新纹理上的内容,这个时候,可以将吸附前后重叠的区域直接进行memorycopy(内存拷贝),对于新流入的区域,需要使用updateresource来上传环境光遮蔽信息,更新3d纹理。如图2所示,在更新3d纹理的过程中,要从读buffer(缓存)上copy(拷贝)对应的信息到写buffer(缓存)上,新流入的区域直接对写buffer(缓存)进行填充,当更新完成后,要把读写buffer(缓存)进行交换,读buffer(缓存)变为写buffer(缓存),写buffer(缓存)变为读buffer(缓存)。进行渲染的过程中,从读buffer(缓存)中读取环境光遮蔽信息进行渲染。使用该办法,可以有效避免同时对同一个buffer(缓存)的读写,需要加锁而导致延迟的问题。对3dtexture(3d纹理)使用的过程中,可以通过实际的坐标位置,在3dtexture(3d纹理)中找到对应的环境光遮蔽信息进行渲染。超出边缘的就认为是没有被遮挡的,为了保证边缘的地方没有硬边的问题,需要使用smoothstep函数,根据距离摄像机的距离进行平滑处理,使用该方法后,能够保证靠近边缘处有较好的淡出效果。

在步骤102,使用立方体表面提取算法以及贪婪合并网格(greedymeshing)的算法进行碰撞网格的处理。

在该步骤中,对碰撞mesh(网格)进行处理。

由于基于体素的地形能够实时的进行编辑,所以物理碰撞所使用的mesh(网格)也不能离线生成,需要实时的生成碰撞mesh(网格)。对于碰撞检测,使用物理引擎来进行处理,只需要在游戏场景中需要的时候添加或者删除对应的碰撞mesh(网格),把要添加和删除的碰撞mesh(网格)传入物理引擎中即可。首先需要构建碰撞mesh(网格),碰撞mesh(网格)的构建和地形表面mesh(网格)的提取方法一致,可以使用简单立方体表面提取的方法,通过遍历所有的体素数据进行碰撞mesh(网格)的提取。在本实施方式中,以block(块)为单位对体素进行碰撞mesh(网格)的提取。每个block(块)的大小为16*16*256m,通过使用简单立方体表面提取的方法,可以获取到每个block(块)对应的碰撞mesh(网格)。由于每个chunk(地形块)的大小为256*256*256m,每个block(块)的大小为16*16*256m,所以每个chunk(地形块)中有16*16个block(块)。应用程序都有一定的同步范围,对于同步范围以外的地方,由于不会进行npc或者玩家的同步,创建碰撞mesh(网格)对整个游戏也没有太大意义,并且会降低游戏的性能,所以对于这些地方,碰撞mesh(网格)也没有具体的意义,所以对于同步范围以外的区域,可以不用创建碰撞mesh(网格)。

由于提取block(块)的碰撞mesh(网格)的时间消耗比较大,所以可以通过使用异步并行机制来解决。每个block(块)对应一个任务,所有block(块)的碰撞mesh(网格)的提取都可以并行执行。并且由于把提取出的网格cook(烘焙)成物理引擎所需要的数据,也是比较耗时的,所以把响应耗时的任务都放在异步线程中执行。首先在主线程中发起提取碰撞mesh(网格)的任务,在异步线程中首先提取物理碰撞所使用的mesh(网格),然后把碰撞mesh(网格)的数据cook为物理引擎所使用的数据。最终需要查看物理mesh(网格)是否在可视范围内,只有在可视范围内的碰撞mesh(网格)才会被传入物理引擎,进行碰撞检测的计算。对碰撞mesh(网格)的提取可以通过使用greedymeshing算法进行冗余三角形的删除,对删除后的mesh(网格)再进行cook,能够使得资源占用内存小,并且能够提升碰撞检测的效率。

该步骤通过使用简单的立方体表面提取算法,保证了提取mesh(网格)的高效性,使用贪婪合并mesh(网格)的算法,简化了碰撞mesh(网格),提高了cook以及碰撞检测的效率,只使用位置信息来提取碰撞mesh(网格),减少了cachemiss(缓存丢失)发生的概率以及最终确保碰撞mesh(网格)尽可能简单。

在步骤103,使用二叉树管理实例化的静态网格。

在该步骤中,对实例化静态mesh(网格)进行管理。对于地形上的其它静态mesh(网格),特别是树木、草以及其它的一些宝箱等,由于这些静态mesh(网格),种类并不是太多,但是数量又特别的庞大。对于这类的静态mesh(网格),使用实例化的方式进行绘制能够有效减少drawcall的数量,但是对于遮挡剔除和摄像机剔除,需要使用层级化的数据结构来进行管理,才能达到较高的效率。在本实施方式中,使用二叉树进行管理,把静态模型进行实例化,减少drawcall的数量。

每个静态mesh(网格)对应一个二叉树,主要分为以下步骤:1)对空间进行分割,构建二叉树。每帧首先把要更新(添加或者删除)的信息(包括朝向、缩放等)保存起来,用来构建二叉树。构建二叉树使用空间分割的方式,尽可能保证树的平衡性。首先计算所有的包围盒信息,比较x、y、z轴,按照长度最长的轴进行等分,在切割之前需要在该轴向上对所有要构建的mesh(网格)进行排序,按照尽可能两颗子树平衡的原则,构建二叉树。

按照轴向上长度最长的轴进行等分来进行空间切割并不是一种完美的解决方案,虽然该算法最快。在本实施方式中,希望构建的二叉树在空间上更加的平衡,所以最好可以使用surfaceareaheuristic(表面积启发算法)来进行空间的分割。并且还要考虑包围盒的overlap(重叠)问题,如果包围盒重叠率过高,就会导致视锥剔除的遍历效率变低。使用surfaceareaheuristic(表面积启发算法),首先在长度最长的轴向上选取候选点,选取候选点的方法是把该轴等分为若干份,这些分割点组成候选点,然后对每一个候选点分别进行测试,计算出测试点两侧包围盒表面积总和以及重叠率,选取使测试点两侧的包围盒表面积总和最接近以及重叠率最低的测试点作为分割点。通过使用surfaceareaheuristic(表面积启发算法),构建的二叉树在空间上更加的平衡,渲染效率更高效。其中叶节点对应的是每个要渲染的mesh(网格),存放着位置、朝向、缩放等信息,非叶节点记录孩子节点的数量,当前所表示的包围盒的大小等信息。

2)使用紧凑型的遮挡测试,渲染时候,减少提交的mesh(网格)的数量。当二叉树构建好以后,需要进行遮挡测试。把需要进行遮挡剔除检测的mesh(网格)对应的包围盒上传到gpu(图形处理单元),在gpu(图形处理单元)端进行遮挡剔除的检测,然后在下一帧把遮挡剔除的结果回读到cpu,在cpu端进行剔除的操作。通过使用紧凑型数据结构进行遮挡剔除,能够有效提高遮挡剔除的效率,减少drawcall的数量。

3)使用二叉树的深度优先遍历,提前检测出需要裁剪的节点,减少提交mesh(网格)的数量。如图3所示,按照深度优先的顺序对二叉树进行遍历,由于每个节点上存储着孩子节点的数量,所以在遍历到某个节点的时候,发现该节点不在视锥内,那么就可以直接跳过所有的子节点的检测,加快遍历的速度。

4)使用优先plainnode构建的方式,避免由于二叉树构建时间过长,引起表现效果不佳的问题。在游戏过程中,由于对树木等的编辑后,希望系统有快速的响应,但是构建二叉树的过程却需要耗费大量的计算,对时间开销有较高的要求。为了满足快速响应编辑的要求,使用plainnode来管理修改过的静态mesh(网格),并优先构建plainnode,保证能够快速响应编辑。首先,把编辑的静态网格(比如种树或者砍树)信息存储起来,使用plainnode管理编辑的mesh(网格)信息,构建完plainnode对应的信息后,要更新二叉树,把对应修改过的节点标记为不渲染的状态,可以通过修改实例化的数据,把模型的缩放改为零使其隐藏,plainnode管理的节点和二叉树同时渲染,保证编辑后能够得到快速的响应。然后通过最新的静态mesh(网格)信息重新构建二叉树,构建二叉树需要放在异步线程中执行,当构建完二叉树后,就可以取消plainnode的渲染,完全使用最新的二叉树进行渲染静态mesh(网格)。

该步骤对静态mesh(网格)进行实例化绘制。使用二叉树进行管理实例化的静态mesh(网格),提高了视锥剔除的效率,使用紧凑型数据结构的遮挡测试,减少提交mesh(网格)的数量,以及保证了遮挡测试的高效性,使用优先plainnode构建的方式,保证了系统能够快速的响应。

本发明还提供一种计算机可读存储介质,其上存储有计算机指令,所述计算机指令运行时执行上述的体素地形的管理方法的步骤,所述体素地形的管理方法参见前述部分的介绍,不再赘述。

本发明还提供一种游戏终端设备,包括存储器和处理器,所述存储器上储存有在所述处理器上运行的计算机指令,所述处理器运行所述计算机指令时执行上述的体素地形的管理方法的步骤,所述体素地形的管理方法参见前述部分的介绍,不再赘述。

本领域普通技术人员可以理解:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1