本人是一名负责程序化生成方向的技术美术 TA,个人兴趣领域主要在大世界场景自动生成方向。
以往的场景生产基本都依赖于美术自由发挥,这样虽然可以更好地发挥美术的艺术创造力,但需要大量的人工来堆砌资源,而且一旦场景设计做了修改,整个场景的美术资源基本都需要推倒重做,因此传统场景生产的开发效率和修改成本都比较高。
为了能够加速场景的生产效率,程序化生成技术就成了不二的选择,这也是我目前最关注的新兴技术之一。
在程序化生成的流程搭建中,程序化 TA 主要负责模块拆分的设计,生成规则的抽样,生成算法的实现,以及程序化生成工具流的搭建。
基于数据源,很多东西都可以通过程序化生成来制作,如地形地貌的生成,河流的生成,植被的生成,基建的生成(道路,桥梁,建筑,街区),氛围的生成(如材质受酸雨的腐蚀,建筑从上自下的脏迹)等。
简而言之,程序化生成技术可以在仅需提供少量曲线数据,以及模块资源的情况下,自动化地将整个场景生成出来。
程序化生成具体是如何实现的?主要分为几个步骤。
第一步是获取数据源,如河流的分布,湖泊的范围轮廓,道路的分布信息,建筑的轮廓信息等,这部分一般可以使用曲线 + 属性的方式来表述。
地形一般是用均匀的网格 + 高度图来描述,网格一般是由引擎运行时生成的,因此如何生成地形实际就是如何生成这张高度图。
如果是基于真实的地图数据,可以在网上下载对应区域的 DEM 数据(数字高程模型),或者可以通过算法进行迭代生成,比如使用噪声图叠加,热力侵蚀,水侵蚀等算法进行拟合。
道路,河流可以由曲线表示它的长度和走向,通过每一段标识的属性可以获取名称,宽度等数据,以及地形的高低走势,程序化生成出道路的模型,河流模型。生成时还要考虑一些约束对地形的影响,比如在起伏的山林中,道路始终是平整的,并且坡度不能超过一定的阈值。
建筑,湖泊部分则可以通过封闭的曲线来获取其在场景中的位置,通过类型属性,来确定建筑的生成风格,通过高度属性来获取建筑有多少层等。
曲线数据的来源一般有两种,一种是基于真实地图数据的游戏场景(比如可以通过 OpenStreetMap 下载地图数据)。另一种方式是通过自己手动编辑曲线的方式来布置路网。
第二步是对数据的补齐。除了通过手动编辑补齐外,还有一些自动补齐数据的方法。
比如通过路网数据,我们可以将地图划分为多个街区,可以自己设计算法,对每个街区进行建筑的填充,算法除了可以考虑建筑的分布方式外(如写字楼,可以采取沿街分布,独栋建筑可以采取中心分布),还可以根据街区的类型,去匹配不同类型,不同高度的建筑群(如商业区,住宅区),最后由建筑间形成的“缝隙”可以获取到小路的数据信息。
又比如,可以结合地形的高程信息,水域的分布信息,地貌信息,城镇分布信息等,生成植被分布的点云数据。如果对生成的结果不满意,也可以手动通过刷范围的方式,人为地控制植被的分布区域及种类。
第三步是将数据通过算法转化为 3D 模型。生成方法分为两种,一种是通过算法生成独立的模型,这种方法比较适用于游戏中特殊模型的生成,如不规则的交汇路口,弧度比较大的护栏等。
另一种是使用预先准备好的资产,根据一定的规则,将模型分布在对应的点云数据上。比如草,树木,路灯这种一个点云代表一个物体的。又或者是类似于建筑模块这种,一组点云数据代表一个物体的,如图:
大型建筑立面的墙可以用几种模块拼接生成。这种拼接方式的好处是能够节省模型、贴图的资源量,并且在游戏中可以使用 Instance Draw 的方式进行绘制,从而降低实时渲染的开销。
第四步则是场景装饰物的填充,以及环境氛围的填充,比如建筑的挂件,街道上的路灯,护栏等。这些都可以通过抽样一些分布规则,通过自动撒点的方式进行生成。
比如如果设计师希望表达一种偏末世的场景,可以根据地势的走向,对场景生成一些环境氛围元素,例如:被水淹过的道路上可以生成一些青苔,建筑上可以生成藤蔓,根据不同季节,植被颜色,茂密程度可以有所调整,被海啸袭击过的区域植被,地形损毁程度的模拟等。
在大世界的程序化生成方向,最近令我印象比较深刻的内容是由 Epic Games 推出的《黑客帝国觉醒:虚幻引擎 5 体验》。
这款技术 Demo 介绍了一套完善的、基于 Houdini 的现代城市的程序化生成方案,它不仅考虑了如何对真实物件效果的还原,还考虑到了如何使用更省的方式实现效果,从而减少性能及资源量方面的压力。
比如,在建筑生成上,介绍了一套如何生成现代建筑的完备方案,包括如何对建筑模块进行合理地拆块儿,如何对建筑进行拼接,如何使用 Instance Draw 来降低渲染压力,以及一些制作时防止模块穿插的小技巧,如对锐角,钝角类建筑转角模块的处理,通过一个通用的链接角来杜绝模型拼合可能引起的穿帮现象。
比如,在材质制作上,介绍了如何实现基于深度的 3D 假室内的效果,不但表现效果可以模拟真实的室内场景,而且从性能方面考虑,用单个材质渲染代替了真实的 3D 室内场的模型渲染,有效降低了性能开销。
虚幻商店也给到了这个项目的资源包,可以直接查看该工程的所有资源和程序化生成制作的相关插件。通过对这个工程进行深度分析,可以帮助我们零距离地了解如何用工业化的方式去生产 3A 品质的游戏,同时也可以自己去实践如何去生成新的世界。
最后畅想一下这项技术的未来。现在的工业化生产,主要还停留在开发者应用的阶段,未来如果把 Houdini 的这一套生成算法搬到游戏引擎中,结合实时光照,GI 的特性,可以使这个编辑器功能转变为玩家 DIY 的游戏功能,比如实现自由度更大的建造系统,自定义关卡设计等。让玩家能够体会到生产高质量场景的快感。
对于 TA 来说个人觉得有几个方向可以去深入研究:
1. 如何对算法进行加速,使平常要花费几分钟的生成工作,可以在几秒钟甚至毫秒时间内完成。比如可以考虑把算法搬到 ComputeShader 中,利用 GPU 的并行度进行加速,也可以考虑采用多线程,分块等方式将需要计算的超大任务,拆分成更小的任务块分多次处理。
2. 如何将枯燥的编辑工具,变得好玩。一方面在编辑方式上考虑更加贴合玩家的使用习惯,一方面可以增加一些编辑时的动效,比如画线时带上一些拖尾效果,生成物件时增加一些有趣的出场方式等。