不知不觉,我已经在游戏开发行业工作了十年。 从一个刚入行的技术新手,到一个还一无所知的技术瓦工,我见证了一个时代游戏技术的变迁。 先后从事过游戏开发SDK、端游MMO、休闲手游、重度手游、大世界手游、大世界端游等多个品类的产品。 现在我是天美F1工作室技术中置发动机项目组组长。
游戏产业正在快速发展。 玩家对游戏的要求越来越高,游戏的技术要求越来越高,开发量也越来越大。 我目前工作的天美F1工作室正在开发一款全平台的AAA级大世界游戏,这是一件非常具有挑战性的事情。
作为一名游戏引擎程序员,我知道技术更新很快,需要不断学习才能接受这一挑战。 庆幸的是,我们提前积累了对标国际AAA厂商的多方向技术能力,也从全球招募了众多具有AAA项目研发背景的人才。 通过不断夯实技术基础,我们有能力、有信心接受新的挑战。 在我们储备的技术中,PCG技术是当前大世界游戏不可或缺的技术。 现在我们就做一些简单的介绍。
PCG(Procedural Content Generation)技术是最近流行的一种提高游戏制作效率的技术。 这是什么意思?
互联网百科全书给出的答案:程序生成(英语:Procedural Generation)是计算机科学中的一种算法,可以让计算机自动创建一类数据。 在计算机图形学中,也称为随机生成,常用于制作材质图和三维模型资源,并用于视频游戏领域,自动创建大量游戏内容。 程序生成具有减小文件大小、扩展内容、增强游戏随机性等优点。
我个人的理解:如果应用在游戏中,简单来说,程序内容生成就是利用算法自动生成游戏内容。 原创游戏内容需要在美术和策划上付出大量的努力。 程序化的方法可以大大降低劳动力成本。 除了节省一些重复的手工劳动之外,一些新的设计内容甚至可以自动创建。 想象一下,如果有一个程序可以自动制作游戏,那该有多有趣。 也许当那一天到来时,游戏开发者都会被解雇。
地形是大世界的基础。 大世界没有地形,玩家就没有立足之地。 地形有多大,世界就有多大。 如果能够利用PCG技术加速大世界地形的制作,美术和策划的人力消耗就可以大大减少。
这里有两个困难。 一:如何生成真实自然的地形? 现实世界的地形并不是一些杂乱的形状,它是大自然的造化,往往具有令人赏心悦目的美感。 使用算法生成美观的地形是我们的第一个挑战。 二:世界巨大,内容复杂,制作人员众多。 如何让制作人员高效协作是我们面临的第二大挑战。
今天我简单讲一下如何在大世界游戏中利用PCG技术加速地形制作的一些基本思路。
1. 传统地形工作流程
每个人都应该熟悉传统的地形工作流程。 美术师首先找到一些参考高度图,将其导入到游戏引擎编辑器中,然后根据自己的需要通过地形编辑工具对地形进行编辑。 例如,UE的地形编辑器提供了多种画笔供艺术家手工绘制和雕刻地形。 显然,这种方法需要艺术家付出大量的工作。
2. 处理地形
一些可用的地形噪声
程序地形可以使用算法自动生成地形。 常用的是随机噪声地形。 该方法是一类构造性算法,通过设计一些噪声函数来随机生成地形高度信息,如常见的Perlin Noise、Worley Noise、Voronoi Noise、Flow Noise等。
另一类是侵蚀算法。 通常现实世界的地形是大自然多年来对地形影响的结果。 此类算法对侵蚀过程进行数学建模,然后对其进行模拟以获得逼真的自然地形效果。 如热侵蚀、水力侵蚀等...
让我们看一些程序地形的示例。 例如,如何用噪声来表达丘陵地形? 就像图中连绵起伏的山峦一样。 其实很简单。 我们只需要取噪声函数的绝对值即可。 这时,噪声的形状会有一个凸起,以表达丘陵的效果。
无人深空的丘陵地形
那么如何利用噪点来表现山脊线呢? 许多大山脉都有山脊线,就像图中的阿尔卑斯山一样。 我们可以先取噪声的绝对值,然后求逆、翻转,然后升高。
可以观察到,波形相交处形成了尖点。 图中的画面是二维的情况。 如果是三维的,就会形成一条局部最高点的线,这样就可以模拟这条山脊的形状。
阿尔卑斯山
那么如何用噪音来表达河流呢? 我们可以通过域扭曲来做到这一点。 这个方法非常简单。 就是对噪声函数的定义域进行变换。 例如,在此处的示例中,对变量进行了简单的位置偏移。 经过多次位置扭曲后,形成一些非常特殊的效果。 可以在图中看到高度数据的变化过程,最终形成河流般的效果。
刚才提到的例子都是用噪声表达地形的简单而有效的方法。 但真实的地形实际上有一些特殊的特征,比如自相似性。 这意味着什么?
当我们从不同层次的角度观察真实地形时数据报告,我们会发现一些相似的特征。 从大山到小山,小山上的每一块石头都连绵起伏。 也就是说,如果用噪声来表达这个特征,则噪声需要在多个尺度上具有自相似性。
山
山
岩石
为了达到这个效果,我们其实可以直接叠加多层噪声。 每层噪声都有自己的频率和幅度,当它们加在一起时会形成这种分形状的地形。 为了更好的控制分形效应游戏引擎编辑器,我们可以调整各层噪声之间的关系:有两种关系,一是各层频率之间的变化率,二是各层噪声幅值之间的变化率。每一层。
特别地,如果每一层幅度的变化是彼此的导数,则这种多层噪声被称为粉红噪声。 更具体地说,如果变化率是2的幂,并且我们将该噪声的每一层称为倍频程,则该噪声的每一层的频率加倍,并且幅度减半。 一般来说,八度以下就足够了。 如果太大,计算量会增加,效果不会明显增加。
这里是我们常见的分层Perlin噪声的效果,当Octave为8时。可以看出,这个分层地形在大的高度变化中有低频的变化,在小尺度的情况下有一些高频的变化。
分层柏林噪声
一些使用纯粹程序地形的更好游戏包括《无人深空》和《我的世界》。 《无人深空》的地形做得非常好。 有很多噪音技术可以用来创建一些非常好的风格化效果。
《无人的天空》
“我的世界”
现在总结一下纯程序地形的特点:
3.以艺术为主导的程序地形生成
既然纯程序化地形生成存在如此多的问题,那么如果我们想利用程序化技术来提高大世界地形制作的效率,我们该怎么办呢? 由于游戏场景的最终效果实际上是由美术控制的,所以整个场景实际上是非常复杂的。 不仅仅是地形存在,涉及到的很多东西都需要艺术来控制,所以我们需要的是艺术主导的流程生成。
这种工作流程需要更加注重用户友好性。 艺术家使用的工具必须是交互式且易于使用的。 你还需要有良好的艺术表现力,艺术可以很方便地用于艺术设计。 程序技术的作用主要是提高工作效率。 与纯程序地形生成一键生成地形不同,艺术家很难参与其中。
这样的工作流程的主要成员可以是一个相对较小的团队,TA和引擎工具根据美术要求设计和开发地形工具。 工具开发出来后,美术师就使用这些工具来设计地形。
具体来说,以艺术为主导的程序地形工作流程分为以下三个阶段:
1:原始地形生成。 这一阶段,LA和TA共同使用一些程序化地形工具,如UE4 Landmass、Houdini、World Machine、World Creator、Gaea等,根据世界的结构生成原始地形。
2:程序工具地形处理。 在这一阶段,美术会在原有地形的基础上创建场景,并添加场景的其他层次,如河流、道路、岩石等。这些场景元素的制作与程序流程中的元素相对应。 可能对地形产生影响的程序工具。
3:手动编辑。 当所有程序工具完成对地形的处理后,如果美术师对效果仍然不满意,则需要手动调整以形成最终的地形效果。
3.1 原始地形生成
我们首先看一下原始地形的生成。 现阶段的思路是,整个建模过程是从初始模型到高模型,高度图数据是从低分辨率到高分辨率。 那么侵蚀对于真实的地形来说是非常重要的。 步。
以Houdini为例,绘制大致有这些步骤。 整个过程可以完全在Houdini内部完成,也可以通过定制的Houdini Engine在引擎中产生。 他完全在Houdini中做起来更方便。 如果他在引擎编辑器中进行,对于美术人员来说会更方便。 每个都有优点和缺点。
Houdini地形工作流程
具体来说,我们来看看这个过程。 第一个是体量,可以通过手绘、投影几何图形或直接导入高度数据来创建最粗糙的形状。 接下来,为了获得更自然的效果,我们对粗糙模型进行一些细节扰动。 这个过程可以通过施加一些噪声来实现。 这也可以通过在特定区域添加一些障碍来实现。
播种后的地形有了一些细节,更加自然,这也有利于后续的侵蚀效果。 然后是裂片。 一般来说,真正的山脉会被河流或地壳运动切割。 我们可以使用侵蚀算法来增加侵蚀强度来获得这种切割效果。 最后,我们可以从高度水平进行重映射并重复塑造不同的区域。 例如,我们在第一遍中对地图的平原区域进行了建模,在第二遍中对高原区域进行了建模。
地形粗糙建模流程
模具粗建模精度较低,迭代效率相对较快。 大型造型设计应尽可能在毛坯模具阶段进行。 粗略模型完成后,对地形精度进行上采样。 更高的精度可以有更多的细节,然后继续整形,然后腐蚀。
为了获得更好的侵蚀效果游戏引擎编辑器,可以在侵蚀之前再进行一次扰动。 腐蚀是一个比较耗时的操作,更快的迭代效果需要TA熟悉。 如果对效果不满意,可以反复整形、侵蚀,得到最终的原始地形效果。
地形高聚工艺
3.2 工艺工具地形处理
获得原始地形后,进入程序工具地形处理阶段。 一般来说,PCG的工具管线是根据不同的工具类型进行分层的,比如湖泊、河流、道路、围栏、植被等。
这里需要注意的是,每个工具都有依赖关系。 前一个工具的输出数据会对后一个工具产生影响。 例如,我首先使用河流工具生成一条河流,然后在河流经过的区域使用道路。 工具生成道路,道路工具需要考虑河流工具。 比如我们可以通过输出Mask来标记河流区域,这样道路工具就知道这里有一条河流。
一般来说,需要提前指定此类工具的顺序并设计流程。
工艺工具流程图
这些程序工具可能会对地形产生影响,包括高度和材料。 关于地形的变化,有一个隐藏的含义,即后一个工具对前一个工具影响的地形进行操作。 比如刚才提到的道路工具是在河流之后,而河流工具本身就会使地形变形。 此时道路工具的地形输入是河流工具使地形变形的结果。
当然,有些工具可能不会对地形产生任何变形效果。 例如,栅栏工具一般对地形没有影响。 所以在这个工作流程中,我们需要存储每一层地形的变化。 如果没有这些中间结果,后续工具将没有地形输入。
3.3 手动编辑
由于程序化并不能解决所有问题,下一步就要进入手动编辑阶段。 问题又来了,什么阶段需要进行地形的手动编辑呢?
我们先回顾一下程序工具的地形处理过程。 如图所示,是一个链式结构。 可以看到我们可以在各个工具之间进行手动编辑。 例如,河流工具影响地形后美工不满意,可以进行编辑调整,然后使用道路工具根据调整后的地形铺设道路。 道路工具会影响地形,然后美术师可以在此基础上继续调整地形效果。
处理工具地形流程图
有了这样的流程,就存在一个问题,如何存储地形修改?
为了实现无损编辑,需要存储对每一层地形的修改。 建议不要将修改的数据存储在编辑器场景中,而是存储在外部文件中,这样对Houdini更加友好。
另一个值得思考的问题是,手动修改的部分数据是存储差异还是直接覆盖? 直观上,存储差异有一个优点。 当前一阶段工具输出的地形发生变化时,手动修改的数据可能会被继承。 例如,由于某些原因,道路工具抬高了整条道路,因为存储了差值。 ,之前的一些本地手动修改可以复用。
缺点是可复用数据的合理性其实很模糊。 很多情况下,差异数据是无法获得的,使用这些数据后也不容易发现错误。 使用叠加方法的优点和缺点都很明显。 直接叠加不会出错3D素材,但一旦前一层修改了地形,后续各层的所有手动修改都将作废,后续各层都需要修改。
基于正确性优先的原则,建议使用覆盖而不是差异。 手动修改一般只修改部分区域。 覆盖方法需要存储两类数据,一是标记哪些区域被修改的Mask信息,二是需要覆盖的高度图信息。
这样我们就拥有了一个完整的地形工作流程,但是美术人员使用的时候还是会遇到很多问题。
第一个是可以手动编辑的阶段太多。 一个大世界一般都有十几层甚至几十层。 工作流程可以调整的地方太多,逻辑和艺术都很难理解。 二是可控性差。 前面提到前面一层的修改会影响到后面的层,导致修改频繁,很容易出错。 第三个也是最直接的原因是美术反馈操作过于繁琐,不好用。
流程工具手动修改流程
转念一想,这个过程虽然比较完整,但很多阶段其实是不必要的。 由于程序工具经常影响地形,因此整个阶段不需要手动修改地形,因此最终的手动修改可以在整个程序过程之前和之后进行。 这将其简化为 4 个大型地形阶段。
原始地形:使用Houdini,世界机器输出。 手动修改1:美工可以在引擎编辑器中调整原始地形。 程序工具地形阶段:合并为一个大阶段,中间不允许手动调整。 手动修改2:手动调整最终地形。
整个过程可以一遍又一遍地迭代。
程序地形工作流程
3.4 一些经验总结
①可控性很重要
② 无损编辑
③ 数据存储
④ 依赖关系
⑤ 不要过于依赖程序化
⑥ 锁
4、PCG技术展望
PCG技术不仅可以用来生成地形,还可以用来生成大世界环境的方方面面,比如植被、道路、河流、湖泊、海洋、社区、建筑等。
如果这些问题在实际项目中得到解决,并产生符合美术要求的资产,那么制作大世界游戏的成本将大大降低。 当然,这并不是说艺术无所事事,而是说艺术可以专注于艺术创作,消除不需要关心的重复劳动。 这样,PCG技术可以加快设计和验证效果的迭代。
此外,PCG技术还可以与机器学习等其他技术结合,辅助美术设计。 这类技术通过学习现有的资产库数据,自动生成一些新的数字资产,然后艺术可以进行一些挑战,从而可以加快创作速度。 速度。
PCG技术甚至可以在一定程度上向玩家开放,用于UGC内容的制作。 玩家可以像游戏制作人一样创造游戏世界。 整个PCG技术的应用前景是巨大的。
目前天美F1技术平台在PCG管线上有很好的积累,在其他AAA游戏技术上我们也取得了一些成果。
F1技术积累图
在发动机技术、艺术等方面,我们目前预留并不断优化验证的方向包括:
最后,欢迎大家加入F1工作室,与天美共同成长,打造国内AAA级大作,实现个人技术突破。