一种虚拟人物半透明分层排序方法及系统与流程

文档序号:12551968阅读:462来源:国知局
一种虚拟人物半透明分层排序方法及系统与流程

本发明涉及一种虚拟人物半透明分层排序方法及系统,属于计算机三维动画、游戏领域。



背景技术:

随着游戏品质要求越来越高,在突出人物角色渲染的游戏中往往为了表现更好地效果,需要人物的衣服有多层半透明,从而让人物栩栩如生,才能够更加吸引住玩家。

多层半透明衣服渲染容易导致衣服渲染出现穿插的问题,即有些三角形面渲染先后出现了问题。尤其在手游领域没有很好有效的处理多层半透明排序导致穿插的好方案。很多现有的方案要么是通过规避多层半透明衣服的方式,要么是将衣服网格拆分出更多细化的网格来处理。然而这些方案都并没有能够真正解决多层半透明排序导致穿插的问题,而且还具有很大地使用局限性。下面主要列出两套旧方案及其局限性。

一,如图1所示的采用分割网格加实时动态修改渲染顺序方案,基本步骤包括如下(1)~(3):

(1)先将有多层半透明有穿插的大网格根据实际需求分割成多个子网格;

(2)在游戏运行时动态加载所有的子网格,并每帧计算子网格到摄像机的距离,存储起来;

(3)根据存储的距离,从近到远渲染每个子网格即可。

通过上面的流程图可以看出分割网格加实时动态修改渲染顺序方案存在以下缺陷:

a.分割网格需要占据美术一定的时间,由于通过分割网格导致了生成更多的模型,更多的模型将导致需要渲染更多的顶点和三角形面,渲染将耗用更多的drawcall和GPU的时间。所以分割网格不仅仅在制作流程上更加地繁琐,而且在游戏性能上CPU和GPU都会有更加多地消耗;

b.分割网格的方式不适合用在多层半透明环状闭合的方式,因为这种方式由于人物的动画和旋转等变动还是会导致穿插问题,所以很难用于多层半透明衣服上的处理。这种方式更加适合没有环状闭合的多层半透明模型处理上,比如说人物的头发可以以身体中心前后分割网格,人物袖子可以根据左右手分割网格。

二,如图2所示的采用三角形中心深度排序加网格编辑工具方案,通过流程图可以看出三角形中心深度排序加网格编辑工具方案存在以下2点缺陷:

1.三角形按深度来进行排序,取点的位置不管是三角形的中心或者是三角形内部的任意一个点,在距离非常靠近的两层网格中,总会存在靠后的一层的三角形深度要比靠前的一层的三角形深度要小,导致用基于三角形深度排序算法总会出现部分三角形面有穿插的问题,该问题在有非常靠近的前后两个三角形会出现,没法避免。

2.为了避免经过三角形深度排序后的部分三角形渲染穿插问题,需要在游戏引擎中制作多边形网格编辑工具(可以在游戏运行中编辑网格并保存网格)。通过在运行时网格编辑工具把有问题的三角形面距离拉远可以避免穿插问题,但是仅仅适用于人物静止时候地调整。该方案在人物有骨骼动画的时候很难调整,只有不断地在静止状态下去拉远距离看效果,持续调整才能有好的效果,而这非常地耗时,而且还是通过修改网格的方式间接规避部分穿插问题。



技术实现要素:

针对现有技术的不足,本发明的技术方案提供了一种虚拟人物半透明分层排序方法及系统,用于解决现有技术的不足,包括以达到合并网格材质后CPU和GPU性能上的提高,多层半透明渲染穿插问题的解决。

本发明的技术方案包括一种虚拟人物半透明分层排序方法,其特征在于,该方法包括:A.使用编辑器对人物衣服模型中需要处理半透明穿插的子网格进行顶点颜色属性标识;B.将人物衣服模型中半透明子网格合并为一个整体网格,以及对半透明子网格的材质进行对应的合并;C.对整体网格进行三角形分层排序处理。

根据所述的虚拟人物半透明分层排序方法,所述的步骤A还包括:其中顶点颜色属性为四维向量,所述四维向量前两位分别为顶点的层次标识及法线是否取反标识,其中的层次标识表示该顶点的层次序号,序号从里到外依次开始递增,其中法线是否取反标识表示含该顶点的所有三角形面中如果存在有个中心法向满足特殊情况则需要取反则标识。

根据权虚拟人物半透明分层排序方法,其特征在于,所述的步骤A还包括:在编辑器对人物衣服模型进行顶点标识时是通过手动进行的。

根据虚拟人物半透明分层排序方法,所述的步骤B还包括:S41,使用接口将人物模型的子网格进行合并一个整体网格;S42,对所述步骤S41进行合并的子网格对应的材质进行合并。

根据所得虚拟人物半透明分层排序方法,所述的步骤S42还包括:还可以人物衣服模型的着色器进行比较,若存在超过一定比例的相似度时,则将人物衣服模型的着色器进行合并,进一步,还包括将衣服模型里不同模型的贴图合成一张贴图。

根据所述的虚拟人物半透明分层排序方法,进行了进一步的扩展,所述的步骤S42还包括:

对人物衣服模型是否带有骨骼动画进行识别,若人物衣服模型带有骨骼动画,半透明子网格执行完骨骼动画实时地合并网格,进一步,如果人物衣服模型发生替换,则将半透明子网格替换成新网格的时候,同时还需要刷新新网格的骨骼数组。

根据权虚拟人物半透明分层排序方法,所述的步骤C还包括:S71,使用三角形分层排序算法人物衣服分为多个渲染层次;S72,对每个层次进行三角形深度排序;S73,最后将渲染层次从小到大的列表里的所有三角形序号添加到新的三角形数组中去,进而把新的三角形数组赋值给合并网格的三角形数;S74,对赋予三角数的的网格执行渲染操作。

本发明的技术方案还包括根据上述任意方法的虚拟人物半透明分层排序系统,该系统包括:顶点标识模块,提供编辑器对人物衣服模型中需要处理半透明穿插的子网格进行顶点颜色属性标识;合并模块,用于将将人物衣服模型中半透明子网格合并为一个整体网格,以及对半透明子网格的材质进行对应的合并;排序模块,对整体网格进行三角形分层排序处理。

本发明的有益效果为:

1.合并网格材质后CPU和GPU性能上的提高。半透明分层排序需要将存在交叉半透明的子网格合并成一个网格来进行三角形排序处理,合成一个网格来渲染GPU消耗要比渲染各个子网格要更少。衣服(包括衣服装饰)通过合并成一个网格,多个材质合并成一个材质来进行绘制,drawcall(CPU提交数据给GPU的次数,是性能很重要的衡量指标)数有效地降低到1个。

2.多层半透明渲染穿插问题的解决。衣服先通过分层,然后再根据每层来进行三角形的排序这个方式,有效地处理了层与层之间的半透明渲染穿插问题。

附图说明

图1所示为现有技术的分割网格加实时动态修改渲染顺序方案流程图;

图2所示为现有技术的采用三角形中心深度排序加网格编辑工具方案流程图;

图3所示为根据本发明实施方式的总体流程图;

图4所示为根据本发明实施方式的含有三层半透明的衣服俯视图。

具体实施方式

为了使本发明的目的、技术方案和优点更加清楚,下面结合附图和具体实施例对本发明进行详细描述。本发明的虚拟人物半透明分层排序方法及系统适用于三维游戏动画的开发。

图3所示为根据本发明实施方式的总体流程图。分三步,其中只有第一步需要在编辑模式下标识网格顶点的颜色值,需要手动。之后的第二步和第三步都是在游戏的运行状态下处理。

第一步,标识顶点颜色属性的过程。确定好哪些半透明的子网格需要处理半透明穿插的,在游戏引擎中的场景编辑器里,使用编写的工具来修改半透明子网格中顶点的颜色值。这个修改半透明网格顶点的颜色值也可以在3dmax或者maya里修改。之所以拿顶点的颜色值来标识是因为该值在游戏中并没有特别实际用处。

顶点的颜色值是一个4维向量,标识的格式为(层次标识,法线是否取反标识,0,0)。其中层次标识表示该顶点的层次序号,序号从里到外依次从1开始递增。比如衣服有三层闭环的半透明,那么最里层的所有顶点层次标识为1,中间层的所有顶点层次标识为2,最外层的所有顶点层次标识为3。法线是否取反标识表示含该顶点的所有三角形面中如果存在有个中心法向(三角形中三个顶点法向量的均值)满足特殊情况需要取反则标识为1,否则标识为0。满足特殊情况比如说衣服的后面网格正常法线要朝后,但是因为部分地方卷起来导致法线朝前,那么这类就属于特殊情况。顶点颜色里后两个值暂时没有用到,设置为0。

第二步,合并网格和合并材质。这一步主要是将半透明的子网格合并成一个网格,合成成一个整体的网格后面才可以用来进行三角形排序处理解决穿插问题。合并网格可以使用引擎自带的接口来进行合并,比如Unity中可以通过创建接口实例后来进行网格合并操作。

合并材质不一定是必需的,如果衣服不同模型中shader比较类似可以将其写入一个整合的shader中,同时还可以对衣服里不同模型的贴图合成一张大的贴图来处理。

这里需要注意的是人物往往是带有骨骼动画的,如果是带有骨骼动画,那么在一帧中各个半透明子网格运动完后需要实时地合并网格。这样子即便带有骨骼动画,合并后的网格也能够正常地播放。如果涉及到换装,那么将半透明子网格替换成新网格的时候,同时还需要刷新新网格的骨骼数组。

第三步,三角形分层排序算法处理。其详细操作步骤请参考图4及后续说明。

图4所示为人物第三步是三角形分层排序算法处理。为了让算法描述地更加易懂和形象化些,这里建立一个简单含有三层半透明的衣服俯视图,每一层衣服都是圆柱形状,摄像机摆在衣服正前方位置,如图4所示。

由建立的模型可知,C1代表最里层衣服,层次标识为C1,C2代表中间层衣服,层次标识为C2,C3代表外层衣服,层次标识为C3。中间线垂直于摄像机的照射方向(设为L),中间线以上的衣服所包含的任意一个三角形面的中心法向与L的点积为正数(因为两个向量的角度小于90度而大于0度),而中间线以下的衣服所包含的任意一个三角形面的中心法向与L的点积为负数(因为两个向量的角度大于90而小于180度)。

本发明的技术方案进一步详细讲三角形分层排序算法,如下1-3:

1.三角形分层排序算法首先要分层。假设有N层衣服,那么需要创建2N个列表存放三角形序号,每个列表里的三角形序号的渲染层次一致,分别存放了渲染层次从-N到N,这里3层衣服需要创建6个列表。先遍历合并网格的每个三角形,该三角形中顶点的层次标识为k,计算该三角形的中心法向,接着计算该中心法向与摄像机照射方向L的点积,如果点积为正数,则把该三角形序号存放到渲染层次为-k的列表中,否则点积为负则将其存放到渲染层次为k的列表中。这个计算点积过程中,如果三角形的三个顶点的“法线是否取反标识”都1的话,则需要对该三角形的中心法向取反后再去计算点积。

2.其次要每层三角形深度排序。对6个分层后的列表分别遍历其中的三角形,根据三角形中心点距离摄像机的长度做为深度,将深度按从大到小对三角形进行排序。

3.最后将渲染层次从小到大(从-N到N)的列表里的所有三角形序号添加到新的三角形数组中去,再把新的三角形数组赋值给合并网格的三角形数组即可。

该三角形分层排序算法第一步时间复杂度为O(N),其中N为三角形数。第二步也为O(N),第三步为1。故总的时间复杂度是线性的。

本发明的技术方案进一步提供了如何实现的,如下所示:

在unity游戏引擎中实践。为了适应不断调整顶点颜色值的方便,再unity中编写一个网格编辑工具。网格编辑工具可以显示所有的顶点,并修改其顶点的颜色值(主要是层次标识和法线是否取反标识)并保存到网格中。这一个过程是需要程序来手动处理顶点数据的,为了使用更加方便可以在网格编辑工具中提供类似格式刷的工具,把当前的顶点颜色值刷到其他顶点上。合并网格和半透明分层排序则根据上面的算法编码好,就可以在游戏中实时处理好多层半透明排序导致的穿插问题。

以上所述,只是本发明的较佳实施例而已,本发明并不局限于上述实施方式,只要其以相同的手段达到本发明的技术效果,都应属于本发明的保护范围。在本发明的保护范围内其技术方案和/或实施方式可以有各种不同的修改和变化。

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