善用过程化技术,助力开放世界的场景制作

杨拓 腾讯互娱 高级技术美术师

 

以下为演讲实录:

 

善用过程化技术,助力开放世界的场景制作

开放世界的制作技术其实已经成型很久了,最近逐渐被人重视起来的原因,是近几年国外开放大世界游戏的不断推出,背后支撑这种游戏场景开发的过程化技术也被越来越多的国内开发者所了解,特别是Houdini技术逐渐被国内的各个工作室了解和接受。

腾讯互娱内部每个工作室都有自己的一套Houdini管线,并且大家都在推进过程化的方案。天美通过对产品线的需求分析,以及对分析结果得到的过程化技术的方法定义,很好的把Houdini管线技术落地到已有的各个项目里面,并快速发布到线上。

接下来通过几款天美重要IP游戏的管线分析及定位,来进行我们方案的描述。如果你要管理一个游戏的开发团队,或者作为场景主美,需要一个更强力的游戏场景制作管线,希望本文可以为你提供一些建议。如果你是Houdini工具的开发者或者过程化技术的开发者,希望本文可以帮助你去梳理管线的一些问题。

 

一、开放世界对游戏场景制作的要求

 

为什么要用过程化技术?是因为开放世界制作的要求,我们所定义的开放世界类别的场景要求,我分为两部分。

第一部分,关卡美术对场景的要求:如果大家对BR玩法熟悉,知道它的区域比较广阔,至少是4×4公里或者8×8公里,里面要有树木等障碍物,要有密集的草地,可以趴下躲藏,有道路,通过载具快速移动到不同的区域以躲避毒圈,而且要有丰富的建筑,建筑里面可以探索你要的武器、道具,可以进行一些躲避工作。

第二部分,关卡策划对场景的要求:传统的策划要求是在场景里面圈一块地方,在这里摆一些玩法内容。近期的一些新的BR或者开放世界的玩法,除了要摆放PVP相关的物件以外,还要加入新的场景互动,比如攀爬、跑酷和掩体躲避的玩法。

 

 

先从关卡美术这边来介绍,大家想到的开放世界,第一点是非常大的地图,有非常丰富的地形地貌,比如对应的不同季节的草地、雪地,包括丘陵、山地、雪地以及平原的效果。以往MMO里面也确实做了这些,腾讯互娱过去的游戏并没有做到完全无缝的游戏世界,有时候切换一张大地图的时候才会替换到新的地貌效果,而现在最新的开放世界要求是要把所有的地形地貌集中显示在几公里的范围内。比如《王者荣耀》的BR图,三种地貌显示在1x1公里的场景里,其他的BR游戏是在8x8公里或者4x4公里中,至少实现2-3种地貌的混合。因此,我们需要有一套比较好的过程化工具来对它进行管理。

 

第二点,地形做完以后并不代表场景有生机,给场景带来生机勃勃的感觉的要素是植被和生态系统。这要求植被需要对应到具体的地貌上去,比如绿地要长绿草,沙土上不能长草,像下图的湖面不能有树木生长,但湖边的地方却要长一些小草,而越靠近沙土的地方草的密度越小。美术对于植被的生长有严格的控制和规则。

如果用传统的笔刷工具,一次性可以用人力来完成,但是一旦你的水面有些变化或者场景有些改动,那么又要频繁根据你的地形地貌的改变去重新对植被进行修改。这对美术制作体验有非常大的影响,需要有工具解决。

 

 

有植被和生态环境以后,你想进一步增加活力,那就要有人群的概念,有人群必定要有人群所居住的环境,也就是城市规划。城市规划和自然环境最大的区别是,自然环境有自己的规则,受到环境的影响有一定的随机性,而城镇其实从最初的道路的规划到道路划分出的区块,以及区块中的房屋和房屋周围的花园、停车场等等。另外房屋之间有些要有通道,而且道路周围要做绿化,可能是按照一定的距离去摆放你的树木和路灯。一层一层的规则叠加下来,形成了一整套规则的树状结构。一旦处于规则顶层的道路发生了变化,同样也会引起道路周围每个要素的变化。一套城市建筑的制作方案,也应该有一套标准的流程对它进行管理。

第三点,细化到城市里的某栋建筑或者某个房间或者一栋楼的时候,这时候就关系到美术或者原画需要对这个建筑风格和效果做把控。通常来说这些都是通过外包来做,我们怎么用更好的方式让外包控制一个风格的同时,能够加快制作效率,能够快速的去铺量的制作一整个城镇,以及城镇的细节变化。这点也是需要有工具能够解决的。

以上这些就是过程化工具在美术方面的几个需求点。

 

 

除此之外,关卡策划除了把PVP、PVE玩法相关的,比如出生点、对战掩体的设计外,还要有跟场景的交互。

第一点是像跑酷,场景里面每个花坛、垃圾桶、障碍物,每个房顶以及房顶与房顶之间要能够跨越,实际上都是依赖于你的建筑之间的摆放的触发器来控制。当我的角色跑到绿框的时候,触发器才会触发按键提示,玩家确认后角色做出跨越动作,而物件上面的绿框用来辅助提示角色能跨多远,通过参数来控制动画蓝图做出。如果每个建筑物件都要人工配,一个大世界有上千的部件,而且会经常有调整,全靠人力是不可行的。我们需要把这些物件进行模块化,通过模块的方式来管理每个物件的触发器。另外一个是要有自动化的工具,根据建筑的形状来自动的把对应的触发器生成出来。

 

 

第二个玩法是攀爬,所有的攀爬都是要基于物理正确性,建筑哪里能爬、哪里不能爬,这并不是纯粹靠程序或者游戏玩法系统去控制的,而是要由美术在视觉上做提示或者策划在玩法上做限制,有统一的规划。这样才能确定一个人可以通过设置的攀爬线,它从房底爬到房顶。下面的图里,红线就是攀爬线,当有攀爬线的时候,角色才能趴在墙边上,程序根据攀爬线的位置信息,结合建筑的物理碰撞体,最后得到配合他的动画蓝图的系统,最后得到一个正确的攀爬动作。

 

 

第三点,掩体射击和掩体移动,如下图,角色是可以沿着隔离带进行横向移动的。那么角色在一个位置上可以如何移动,是根据绿框的信息来的确定,绿框首先会告诉角色的的控制系统,在这个位置我能做什么动作。而且这套掩体系统不光是玩家角色使用,AI也要依赖这套系统。这可以说是第三人称射击游戏核心支持的组件,如果不考虑程序和策划的诉求,直接生成或者人工摆放,也会非常大的影响制作效率。

 

 

总结起来,是这两款大世界游戏面临的几个综合问题:

  1. 巨大的美术工作量会导致大量外包的数量,以及有大量要在编辑器里面手工编辑的工作,这是需要解决的。
  2. 巨大的工作量会引起游戏包体的膨胀,移动端得出渲染、内存会有压力。你的硬件可能只有给你1G内存的使用量,这意味着不可能把非常丰富的资源直接全部加载到场景里,而是需要用模块化的方案解决。
  3. 一旦加入更多策划性的玩法,就需要在制作场景的时候由场景美术、场景策划,渲染人员以及玩法相关的开发人员一起讨论,沟通成本会很大。沟通并不仅是在上线前,而是在整个项目的生命周期内,因为上线后会不断开发新的关卡、开发新的玩法和PVP的地图,所以如果不解决的话,它会是长期的成本问题。

 

 

二、定义过程化场景开发管线

 

基于这些问题,我们定义了自己的场景开发管线方案。

我之前提到的过程化技术是什么呢?它是美术提供的一些元素,包括基础的图形或轮廓元件,以及提供的一些可以调整的数值,最后加上一个可以抽象出来的公式,就能够达到最后想要的结果。

 

 

以游戏贴图制作为例,很多美术同事都用过Substance Designer,下图左边是用SD生成的形状,可以理解为是你的过程化的输入项,中间是你过程化输入的参数,右边是你得到的最终结果。只要你修改你的输入项,修改参数就可以得到不同的结果。过程化贴图主要是用在地表贴图和一部分过程化生成的建筑里,比如墙砖和房顶的贴图,可以做四方连续的图,有些会用SD。

 

 

过程化建模技术,这个技术主要是依赖Houdini的软件。如下图,通过输入一些简单的线条,或是一些多边形,或是一些参数,就可以根据预先设定好的处理流程,得到最终的模型资源。不管岩石峭壁,还是房屋或道路,河流,甚至是一个关卡,都可以直接用Houdini生成,而且只要简单的调整,就可以得到,但这种方式也会带来一些负面效果。

1.以河流为例,河流横穿8×8公里的地图,意味着河流改变一点参数,河流横穿的8×8的地块都是需要重新构建的。开发手机游戏的话,如果你的地图所有地块每天做全量构建,对游戏场景开发迭代很不利。

2.每次修改资源后,都会变成一个新的资源,意味着要重新放到引擎里,Unity要重新映射,UE4则要把它导入引擎里面生成一个产品,这些资源的修改在引擎里面无法做增量判断,任何的修改都是一次新的改变。

 

 

最后一种就是基于实例化渲染技术的过程化技术,简单来讲就是同样拓扑结构,同样贴图材质的物体,可以通过渲染管线一个批次绘制,这样能节省大量的Draw Call时间。那么以一颗树为例,我们通过对树木的位置,大小和旋转信息作出变化。就可以用少量的树木模型做出丰富的丛林效果。而每颗树的变化信息的集合,我把它称为点云。

同样的建筑也是,通过一些预设的模板实例,生成出基于点云的楼体结构,在进行实例化渲染,这样可以使用很少的一部分美术资源就制作出变化丰富的建筑了。

 

 

总结,我们的过程化技术其实是以点云为驱动的过程化技术,正是因为有点云的组织结构,所有的操作、所有的变化是可以通过一个EXCEL表就知道我加了什么、减了什么,也可以通过分析EXCEL表或者数据表的格式,知道某个单位内我们的美术资源量到底消耗了多少。也是通过这种方式才有可能把非常大密度的建筑在手机平台上渲染出来。

 

 

接下来分享基于点云系统实现的游戏开发的可迭代性。什么是游戏开发的可迭代性?场景开发是从概念设计开始,做顶视图,关卡策划和关卡美术一起把灰盒搭建出来,当灰盒测试完成以后再发包把整个灰盒的场景真正做成有细节、有色彩、有美术艺术效果的场景,这个时候如果我们需要对场景做变化,可以通过SD的方式修改材质球和贴图,最后打光得到一个效果。这是瀑布式的流程,优秀的美术团队可以做到从第一步到最后一步,一次性不做任何修改。如果这个场景要加一个东西、减一个东西,做微小的修改就可以;大的变化是整体场景风格的变化,比如这是一个平原,要变成山地,这不是美术做简单修改的问题,而是重新考虑建筑和地形融合的问题。这时候用过程化技术,用Houdini生成地形,通过Houdini与这套地形和点云系统做融合,就可以很方便给予迭代性。

 

第二个影响的主要基点,比如整个建筑做完,发包放到手机上,这时候发现某个国家的手机跑不动,但要上线,那要削减每个美术资源,把面数、贴图做减法,全基于模块化组成。你只要改一个模块的面数,整个场景里面所有用到这个模块的地方都会削减。如果通过点云的方式去维护场景的细节,比如说一个建筑周围有些花草、有些小的摆放物,因为我的包体不允许把这些摆放物隐藏掉,只需要删除点云就可以。

这是模块化的例子,首先先做一些白模模块,把模块通过Houdini工具进行组合,然后通过修改不同贴图和材质的效果就可以做出风格的变化。这种模块的另外一个用途是,比如掩体系统可以直接把模块上制作出掩体信息、跑酷信息和攀爬信息做出来,点云组合的时候把所有玩法也通过点云组合,根据合并逻辑把信息再进行加减法,比如两个墙壁反过来叠加肯定是做不了掩体。这些我们在Houdini里面用算法进行了判断。

 

 

可迭代性的价值,我认为是把关卡美术、关卡策划和玩法程序之间的工作剥离开来。对于关卡美术来说,只需要前期把每个模块的基础单元提供给关卡策划和玩法程序就可以,所有的建筑构成是通过点云、通过Houdini的组建方式拼的,只要按照这种方式拼肯定可以达到最终的效果。这时候关卡策划可以通过简单的模型先搭建玩法、验证设计,而玩法程序也是一样,拿到最简单的模型和最简单的导航线和攀爬线各种数据,就可以自己组。等到美术回包以后,大家在一个阶段把所有资源全部替换成新的美术资源,这个阶段都是无缝的,不会影响到各部分的操作。如果到了某个程度,关卡策划要改规则,也一样,重新回到最原始的模块的规则修改,美术什么都不需要改,而关卡策划和关卡程序只需要修改模块的生成规则。所有的修改量是可控的,保证在非常小的范围内。

 

 

我们对整个过程化管线的定义:对美术要帮助美术提高效率,同时解决以往美术大场景开发时候的迭代问题;在玩法方面要支持玩法和关卡策划的各种需求,而且是需要能够配合关卡策划、关卡程序一起做事情;另外在渲染上是必须要保证渲染效率在手机上达到3A品质的同时,不影响帧率,同时你的包体不管是做更新还是做全量还是做日常迭代,这套流程不能影响到整个每天的生成的规则。也正是因为天美是以这套方案或者这个景愿在推进Houdini技术,它才能在短短一年内于3个线上项目里落地。

 

 

三、如何将过程化技术落实到项目

 

接下来,我会结合几个案例,介绍我们管线的具体运用情况。

 

 

UE4的地形,是有图层的概念的,因为渲染的采样数16次限制,导致一个地形,实际上一个地块上最多只能支持4个图层,包括现在很多线上项目,每个地块上只能有4个图层,这里面绿地、斜坡、沙土以及道路是四层。

这四层如何做迭代呢?每个层有自己的权重,通过权重值混合,得到最终的结果。这会有什么问题?首先,严格限制地形最基础的组件,只能使用4层图层,如果我想要用更多图层怎么办?有些项目是创建多个材质球,这边用这4种图层的材质球,那边用另外4种图层的材质球,这确实是一种办法,10层以内可以用。另外一种方法是说直接用Virtual Texture或者基于TexArray的虚拟贴图方式,确实也可以解决一部分采样数限制的问题,但是权重的总数还是会受到限制。

这是我们遇到过的问题,2公里范围内用50张贴图,这是UE4 连了50个Layer,首先它编辑Shader,如果不联机编译Shader的话,光编译就要等30分钟,我只要地形上刷一笔,它都要重新组织图层,肯定涉及重新编译shader,又是等待时间。这种方案美术根本没有办法使用。

现在的方案,首先我们把40-50张贴图Atlas到在一张图上,这是Fallback的方案,另外一个方案是用基于TexArray的Virtual Texture的方法,就是动态的来组合Altas,两个方法对美术的感官上是一样的。那每个图层是什么?以前一个层是0-255的值,是一个权重,可以是0~1之间,是根据除以255的值做权重,两个层之间会根据权重值做混合算法。如果一个像素上有4个层,就是4个层的权重一起混合。导致的是美术需要考虑控制权重总数,超过4层以后,权重总数怎么控制?或者地图编辑上刷一笔以后,这个层变成5层,导致shader变不过去怎么办?现在的新的方法是每个像素上只有一层Layer,没有混合,你可以看到这两张图的像素要么是0、要么是1,不可能出现0.1到0.5,或者一半这个元素、一半那个元素,好处是不会因为混合导致这个层的颜色会受到污染。我们以前做这种产品经常遇到的问题,比如有一张沙子图或者绿草图,把这两张图按0.5的比例混合,得到一张黄草图,得到黄草图之后,玩家观察的时候黄草图上长绿草,玩家会认为这个效果不对。这种方案除了短暂的过度,大部分地方都是保证贴图的唯一性,像素上肯定只用这一个层。

 

 

植被系统,我们读取地表的每层参数,比如坡度、地表的高度、AO信息,把所有的信息输出到一张表里,通过修改这张表,我们自己写了一套Houdini的插件,比原生插件的优势是不需要拖节点进去才能生成东西。我们把一组植被通过复杂的参数封装简化以后就是一组植被的节点,直接一个树、一个生成叠加起来,每个树的优先级和权重都不一样,叠出来就是比较丰富的植被效果,而这个效果直接调用Houdini引擎管线就可以实现。

 

 

第二个例子是建筑管线的制作实例。前面说到所有建筑都是全模块化设计,再通过一个工具对它进行点云的管理,这个点云分为两部分:

一是街区模块的点云,具体的位置应该放什么楼、放什么东西,并不是通过自己计算它的位置得到的,而是根据美术和策划提的要求,通过筛选生成的点得到这个位置能生成什么楼,需要有多少个高楼、平房,最后通过这些点得到了正好塞到这个区块里面的楼房。这就是简单街道的规划。

 

 

街道与街道之间,一个区块内部之间的规划,有一部分是需要我们用下一步过程化工具,我们会根据建筑周围的一些规则生成一些垃圾堆,在道路周围生成一些电灯泡、电线杆或者阻挡物,这些东西的生成是按层数走的,其实就是街道的分层到下面建筑的分层以及建筑掩体的分层,每套楼层之间独立,不会出现点一下以后整个场景都变了。因为每个阶段就是一套点云,一个楼是一个点云,对应的楼自己所有建筑组件又是一个点云。我们通过这个过程化生成一条街,然后生成一个城镇楼房的组合,下图是导到UE4里面的效果。

 

 

简单介绍我们现在建筑的结构,这其实是我们结合合作方的方案去制定的,这等于所有的楼房都是基于这套面板做的,这套面板的主要功能是什么呢?首先面板上描述的是整个轮廓的走向,当第一层轮廓确定以后,你可以调整它的层数,让它不断往上叠,中间部分可以增加拷贝的变化。另外当整个楼层确定以后,还有房顶部分,所有的部分的走势并不是通过曲线或者放几何体确定,我们的每个走向,包括房屋的拐角都是面板里面的节点确定的。好处是,我的节点可以覆盖所有的楼,包括高楼、矮楼和所有的房子,只要你有这种轮廓的现代建设方式制作的,你就是可以用这套节点涵盖。

如下图,红色部分是节点上面的一个建筑的标记,实际整个楼的每个部件都是对应有节点上的设置。当多个节点进行组合以后就可以做出各种丰富的建筑出来,而且所有的建筑、所有的楼都是通过一个节点制作。这样不会出现一个建筑是一个做法,另外一个建筑是另外一个人做的有另外一种做法,我们的建筑是统一的做法,任何人做的楼,其他人都可以维护,而且这些都是基于Vex语言制作,随时移植到UE4里面。

 

 

阅读与本文标签相同的文章