天美F1引擎专家:如何利用PCG技术加速大世界地形生产?

文/ 秋秋 2021-12-09 14:39:27
天美十三周年,天美联合知乎游戏,举办“游戏未来十三问”主题圆桌,邀请游戏从业者、玩家和广大朋友们,一同探讨和展望游戏的未来。


本文为圆桌议题“2021年,游戏行业有哪些能提升开发效率的“黑科技”,前景如何?”下的回答,希望对大家有所帮助。
答者:潜龙旭,天美 F1 工作室技术中台引擎程序团队负责人

不知不觉在游戏开发行业已过十年,从刚入行的技术小白,到现在依然什么都不懂的技术搬砖工,见证了一个时代的游戏技术变革。
我本人先后做过游戏开发 SDK,端游 MMO,休闲手游,重度手游,大世界手游,大世界端游等各品类产品,现在是天美 F1 工作室技术中台引擎程序团队负责人。
游戏行业发展很快,玩家对游戏的要求越来越高,游戏对技术的要求也越来越高,开发量也越来越大。我现在所在的天美 F1 工作室正在开发 AAA 级全平台的大世界游戏,这是一件非常具有挑战的事情。
本人作为游戏引擎程序,深知技术更新之快,需要不断的学习才能接受这个挑战。所幸我们已经提前在多个方向积累了对标国际 AAA 大厂的技术能力,并且还在全球招募了不少具有 AAA 项目研发背景的各方面人才。通过不断的夯实技术基础,我们有能力也有信心接受新的挑战。在我们储备的技术中,PCG 的技术是目前大世界游戏必不可少的一种技术,现在做一些简单介绍。
PCG(Procedural Content Generation,过程化内容生成)技术是最近比较热的提升游戏生产效率的一类技术。它是什么意思呢?
网络百科给出的答案:过程生成(英语:Procedural Generation)是计算机科学中一种使计算机自动制造一类数据的算法。在计算机图形学中,它也被称为随机生成,常用于制作材质贴图和三维模型资源,并在电子游戏领域中用于自动制造大量游戏内容。过程化生成有着减小文件体积、扩大内容量、增强游戏随机性等优点。
我个人的理解:如果在游戏中应用,简单说,过程化内容生成就是利用算法来自动生成游戏内容。原有的游戏内容需要美术和策划花费大量的精力制作,过程化的方式可以大大降低人工成本,除了可以节省一些重复的人工劳动之外,甚至可以自动创作出一些新的设计内容。试想如果有一个程序可以自动生产游戏,那是多么有意思的一件事情,也许那天到来,游戏开发者都下岗了。
地形是大世界的基础,大世界没有地形,就没有玩家可立足之地。大世界有多大,地形就有多大,如果能用 PCG 技术加速大世界地形生产,就可以大大减少美术和策划的人力消耗。
这里有两个难点,一:如何生成真实自然的地形?真实世界的地形并不是一些杂乱无章的形状,他是自然的造化,往往具有赏心悦目的美感。利用算法来生成具有美感的地形是我们面临的第一大挑战。二:大世界巨大,内容繁杂,涉及制作人员众多,如何让制作人员高效的协作是我们面临的第二大挑战。
今天简单谈一谈如何利用 PCG 技术加速大世界游戏里的地形生产的一些基本思路。

01  传统的地形工作流

传统的地形工作流,大家应该很熟悉,美术先找到一些参考的高度图,导入到游戏引擎编辑器中,随后根据自己的需求,通过地形编辑工具来编辑地形。
比如 UE 的地形编辑器提供了各种各样的刷子来给美术去手刷和雕刻地形。显而易见,这种方式对美术来说工作量是巨大的。

02  过程化地形

1639118409605397.jpeg一些可用的地形噪声
过程化地形可以利用算法自动地生成地形。常用的有随机噪声地形,这类方法是一类构造式的算法,通过设计一些噪声函数来随机生成地形高度信息,比如常见的 Perlin Noise,Worley Noise,Voronoi Noise,Flow Noise等等。
另外还有一类是侵蚀算法。通常真实世界的地形,是大自然常年累月对地形进行影响的结果。这类算法会通过对侵蚀过程进行数学建模,然后仿真得到一个拟真的自然的地形效果。比如热侵蚀,水力侵蚀等 ......
我们来看几个过程化地形的例子。比如如何用噪声表达丘陵地形?就像图中连绵起伏的小山包。其实很简单,我们对噪声函数取一个绝对值就好了,这时噪声的形状会发生一个凸起达到表达丘陵的效果。
1639118409845424.jpeg无人深空中的丘陵地形
1639118409381771.jpeg
那如何利用噪声表达山脊线呢?很多大的山脉会有一条条山脊线,就像图中的阿尔卑斯山。我们可以把噪声先取绝对值再取反,翻转后抬高。
可以观察到在波形相交的地方形成了一个尖点,图里的是二维的情况,如果在三维中就会形成一条条局部最高点的线,这样就可以模拟这种山脊的形状。
1639118410635574.jpeg阿尔卑斯山脉
1639118410854083.jpeg
那如何用噪声表达河流呢?我们可以通过域扭曲的方法来做。这种方法很简单,就是对噪声函数的定义域做一次变换,比如这里的例子,简单的对变量做一个位置的偏移,经过多次的位置扭曲,形成一些很特别的效果。可以看到图中高度数据的变化过程,最后形成像河流一样的效果。
1639118410725570.jpeg1639118410812477.jpeg1639118411885145.jpeg
刚才的讲的几个例子都是一些简单有效的噪声表达地形的方法。但真实的地形其实有一些特别的地方,比如自相似性。什么意思呢?
我们从不同层次的视角去观察真实地形的时候,会有一些相似的特征。大到山脉,小到山体,更小的山上的每个石头都在起伏。也就是说如果用噪声表达这个特点,需要噪声在多个尺度具有自相似性。

1639118411139398.jpeg

山脉

1639118411655899.jpeg

山体

1639118411352504.jpeg

山石

为了实现这个效果,我们其实可以直接把多层噪声叠加起来实现。每一层噪声有自己的频率和振幅,叠加在一起就会形成这种具有分形效果的地形。
为了更好的控制分形的效果,我们可以调整每层噪声之间的关系:关系有两种,一种是每层频率之间的变化率,另一种是每层振幅之间的变化率。
特别的,如果每层振幅的变化跟频率的变化互为导数,这种多层噪声叫做粉红噪声。更特别的,如果变化率是 2 的幂次,我们把这种噪声的每层成为一个倍频(Octave),那这种噪声每层频率翻倍,振幅就减半。一般来说,Octave 小于 8 就够用了,太大了计算量增加,效果不会有大的增幅。
这里是我们常见的分层 Perlin 噪声的效果,在 Octave 为 8 的情况下。可以看到这个分层地形,在大的高度变化上是一个低频的变化,在小的尺度上会有一些高频的变化。
1639118412578703.jpegLayered Perlin Noise
纯过程化地形做的比较好的游戏,有《无人深空》,Minecraft。《无人深空》的地形是做的很不错的,有很多关于噪声的技巧应用,做出来一些挺不错的风格化的效果。
1639118412173310.jpeg《无人深空》
1639118412494632.jpeg《我的世界》
现在总结一下纯过程化地形的特点:

  • 基于随机的算法;

  • 技术性是比较强的,美术不易理解;

  • 容易重复;

  • 可控性比较差,美术难以调效果


03  美术主导的过程化地形生成

既然纯过程化地形生成有这么多问题,那大世界地形制作又想利用过程化技术来提升效率,怎么办?
由于游戏场景的最终效果其实是美术来把控的,其实整个场景很复杂,不仅仅只有地形存在,涉及到的东西很多都需要美术来把关,所以我们需要的是美术主导的过程化生成。
这种工作流需要更多的考量用户友好性,美术使用的工具是交互要人性化,要足够易用的。还需要有良好的艺术性表达性,美术可以很方便的做艺术设计。
过程化技术在其中的作用主要是用来提升工作效率,并不像纯粹的过程化地形生成,一键生成地形,美术很难参与其中。
这样的一个工作流,它的主体成员可以是一个比较小的团队组成,由 TA 和引擎工具根据美术需求设计开发地形工具,工具开发完后,美术使用工具设计地形。
具体来说美术主导的过程化地形工作流分为以下三个阶段:
1:原始地形生成,这个阶段 LA 和 TA 一起配合,利用一些过程化地形工具,比如 UE4 Landmass,Houdini,World Machine,World Creator,Gaea 之类的,根据世界的结构生成一份原始地形。
2:过程化工具地形加工,这个阶段美术会在原始地形的基础上进行场景制作,会添加场景的其他层,比如河流,道路,岩石等等,这些场景元素的制作在过程化管线中对应一个个的过程化工具,这些工具可能会对地形产生影响。
3:人工编辑,所有的过程化工具对地形作用完毕后,如果美术还不满意效果,这时需要进行人工调整,调整后形成最终的地形效果。
01 原始地形生成
我们先看原始地形生成,这个阶段的思路是,整个造型过程是从初模到高模,高度图数据从低分辨率到高分辨率的一个过程,然后对真实地形来说侵蚀是很重要的一步。
以 Houdini 来举例,大概有图例画的这些步骤。整个过程可以完全在 Houdini 内部做,也可以通过自定义的 Houdini Engine 在引擎中制作。完全在 Houdini 里做,对TA来说比较方便,在引擎编辑器内做的话,美术会比较方便。各有优缺点。
1639118412278522.jpegHoudini 地形工作流

具体的,我们来看下这个流程。首先是 Massing,可以通过手绘,投射几何体或者直接导入高度数据进行一个最粗糙的造型,接下来,为了获得更自然的效果,我们对粗模进行一些细节的扰动,这个过程可以通过应用一些噪声来实现,还可以通过在特定区域添加一些障碍物。
Seeding 后的地形有了一些细节,更自然,也有利于后面的侵蚀效果。再就是裂片,一般真实的山体会被河流或地壳运动切割开来,我们可以通过侵蚀算法加大侵蚀力度来获取这种切割效果。最后我们可以从高度这个层次进行 Remapping,对不同区域进行反复的造型。比如我们在第一遍的时候对地图的平原区域进行造型,第二遍对高原区域进行造型。
1639118413480371.jpeg地形粗模过程
粗模造型在低精度下进行,迭代效率是比较快的,大的造型设计尽量在粗模阶段进行。粗模完成后对地形精度进行上采样,更高的精度可以拥有更多的细节,之后继续进行 Shaping,再之后就是侵蚀了。
为了获得比较好的侵蚀效果,可以在侵蚀前再进行一次扰动。侵蚀是个比较耗时的操作,要比较快的迭代效果需要 TA 对此很熟悉。如果不满意效果,可以反复的造型和侵蚀,得到最终的原始地形效果。
1639118413320873.jpeg地形高模过程
02 过程化工具地形加工
原始地形有了后,就进入到了过程化工具地形加工阶段。一般 PCG 的工具管线会按不同的工具种类进行分层,比如按照湖泊,河流,道路,栅栏,植被这样的层次进行划分。
这里需要注意的是,每个工具之间具有依赖关系,前个工具的输出数据对后个工具会产生影响,比如我先用河流工具生成了一条河流,接着在河流经过的一个区域又用道路工具生成了一条路,那道路工具就需要考虑河流工具。比如我们可以通过输出 Mask 来标记河流的区域,这样道路工具就知道这里有一条河了。
一般来说,这样的工具顺序需要事先规定好,做好流程的设计。
1639118415854273.jpeg过程化工具流程图
这些过程化的工具都可能对地形产生影响,包括高度和材质,那关于地形的变化,这里有个隐藏的含义是后个工具是在上个工具影响后的地形上进行操作的,比如刚才提到的道路工具在河流之后,那河流工具本身会对地形进行形变,道路工具此时地形的输入就是河流工具对地形形变后的结果。
当然有些工具可能对地形不会有形变作用,比如栅栏工具一般不会对地形有影响。所以在这个工作流中,我们需要把每层地形的变化都存储下来,如果没有这些中间结果,后面的工具便没有了地形的输入。
03 人工编辑
既然过程化解决不了所有问题,那接下来进入到人工编辑阶段。问题又来了,哪些阶段需要进行地形的人工编辑呢?
先回顾一下过程化工具的地形流程,如图,是一个链式的结构,可以看到我们可以在每个工具之间都可以进行人工编辑,比如河流工具对地形影响后,美术不满意,可以进行编辑调整,在调整后的地形基础上,再使用道路工具铺设道路,道路工具又会对地形进行影响,之后美术又可以继续在此基础上进行地形效果的调整。

1639118415417294.jpeg

过程化工具地形流程图

有了这样的流程,就存在地形的修改如何存储的问题?
为了实现非破坏性编辑,每层地形的修改都需要存储,推荐不要把修改数据存储到编辑器场景中,而是存到外部文件,这样对 Houdini 比较友好。
另外一个值得思考的问题是人工修改的这部分数据是存储差异还是直接覆盖?存储差异直观上来看,有个优点,前阶段的工具地形输出有变化的时候,人工修改的数据可能可以继承,比如由于某些原因,道路工具把路整体抬高了,由于存储的是差异值,之前对一些局部的人工修改就可以复用。
缺点是,可复用的数据的合理性其实是很模糊的,很多时候差异数据不可用,这种数据应用后出错了也不易发觉。采用覆盖的方式,优缺点是显而易见的,直接覆盖不会出错,但一旦前面的层对地形有修改,后续的每一层的手工修改就全部报废了,后续每一层都需要修改。
基于正确性第一的原则,推荐使用覆盖而非差异的方式。人工修改一般只是修改局部,覆盖的方式就需要存两种数据,一种是标记哪些区域修改了的 Mask 信息,一种是需要覆盖的高度图信息。
这样我们就有了一套完备的地形工作流程,但给美术实际使用时仍然遇到了不少问题。
第一个是可手动编辑的阶段过多,大世界一般都会有十几层甚至几十层,工作流可调整的地方太多,其中的逻辑美术不易理解,第二个可控性差,之前也提到,前面层的修改会影响后面,导致频繁修改,非常容易出错,第三个最直接的就是美术反馈操作太繁琐,不好用。
1639118415584504.jpeg过程化工具人工修改流程
重新考量了下,这个流程虽说比较完整,但很多阶段其实没必要,由于过程化工具对地形影响频繁,整个阶段可以不需要人工修改地形,所以最终人工修改可以在整个过程化之前和之后进行,这样就可以简化为 4 个大的地形阶段。

  1. 原始地形:采用 Houdini,world Machine 输出。

  2. 人工修改 1:美术可以在引擎编辑器中对原始地形进行调整。

  3. 过程化工具地形阶段:合并为一个大的阶段,中间不允许人工调整。

  4. 人工修改 2:对最终地形进行人工调整。


整个过程可以循环重复迭代。
1639118415591644.jpeg过程化地形工作流
04 一些经验小结
① 可控性很重要

  • 完全的随机地形生成不可用

  • 美术导向,而非技术导向

② 非破坏性编辑

  • 原始地形不可丢

  • 可反复快速迭代

③ 数据存储

  • 便于导入导出

  • 使用覆盖,不要使用差异

④ 依赖关系

  • 后阶段依赖前阶段地形

  • 杜绝循环依赖

  • 编辑前及时锁定,避免冲突

  • 编辑前及时更新,避免错误修改

⑤ 不要过度依赖过程化
⑥ 锁定

  • 阶段越前,越需要更早确定

  • 地形修改工作量非常大


04  PCG 技术的前景

PCG 技术不仅仅用来生成地形,还可以用于生成大世界环境中的方方面面,比如植被,道路,河流,湖泊,海洋,街区,建筑等等。
如果把这些问题在实际项目中全部解决,生成符合美术需求的资产,那制作大世界游戏的成本会大大降低。当然并不是说美术没有事情可以做了,而是美术可以专注于艺术创作,去除不需要关心的重复劳动。这样 PCG 技术可以起到加快设计和验证效果的迭代速度。
另外 PCG 技术还可以和机器学习等其他技术融合,来辅助美术设计,这类技术通过对已有的资产库数据进行学习,自动生成一些新的数字资产,美术再进行一些挑战,这样可以加快创作速度。
PCG 技术甚至可以在一定程度上开放给玩家,用于制作 UGC 内容,玩家可以像游戏制作者一样创造游戏世界。整个 PCG 技术的应用前景空间巨大。
目前天美 F1 技术中台除了在 PCG 管线上有不错的积累,其他 AAA 游戏技术我们也取得了一些成绩。
1639118415803624.jpegF1 技术积累图

引擎技术、美术等方面,目前我们已经储备并在不断优化验证的方向包括:
  • 对标顶级 AAA 公司的,支持 AAA 品质开放大世界的 PCG 工业化游戏内容生产管线

  • 次世代主机级渲染技术及美术制作工艺

  • GTA 级的大都市模拟游戏 AI 技术

  • 超拟真载具物理仿真技术

  • 基于光学动捕和 MotionMatching 的角色动画技术及制作管线

  • 基于 FACS 系统的写实面部表情绑定和动画管线

  • 基于 AI 学习的人物动画生产技术

  • ...


最后欢迎大家加入 F1 工作室,和天美共同成长,做成国产 AAA 大作,实现个人技术突破。

消息来源: