以下文章来源NExT Studios ,作者的动机全开
在最后一篇文章中,我们从地形、悬崖、植被、河流和道路五个方面介绍了NExT Studios 在使用虚幻引擎4开发重生边缘的过程中,尝试生成过程内容。
本文将如何为工具添加场景制作?解决新工具在实际工作中遇到的各种问题,分享一些实验性工作。
我是进度条
在生成过程内容时容易遇到哪些过程问题?
例如,生成的效果不能满足艺术的要求;工具的使用门槛太高,他们不想使用;工具不够稳定,他们觉得成本太高;或者涉及多人合作,程序员做,TA做,还是做关卡艺术?如何解决多关卡艺术的合作需求?只有解决了这些问题,才能算是合格可用的工具链。
基于之前的分享,相信大家也能看出我们的目的是:不追求全地图自动化生成,而是根据需要定制,提高生产效率。
过程内容生成管道
如何解决自动生成内容与人工编辑内容之间的冲突?如何考虑生成内容之间的关卡划分?如何保证不同子关卡的稳定性?
我们总结了两个原则,一是生成的内容不能覆盖人工编辑的内容。二是尽可能独立地编辑和生成各个子级别。就像 Unreal 世界上的地图通常被编辑成多个子层次,以促进多种艺术合作。然而,也需要这样的支持来生成过程的内容。例如,它可以world composite支持地形自动切割到子关卡。
子关卡自动切割
生成的内容(大量贴花、悬崖、河流等)之间也需要切入子关卡。只有分割子关卡,才能独立去除和 level streaming,它还支持不同的人编辑和生成不同的子关卡。
对于不同的子关卡,我们生成的限制是必要的确保结果的稳定性:无论是多块计算的结果,还是单块计算的结果,都应该是一致的。只有这样,我们才能确保按照子级别工作。
如何解决地形和建筑的稳定性?
我们不能很好地解决地形问题。因为关卡和关卡之间会有一个不可避免的交界处,如果只更新一个,另一个就不能连接。
虽然可以对整个地形进行整体侵蚀或美化,并进行全面更新,但这对整个开发来说是一种非常不友好的行为,因为所有的关卡文件都需要协调解锁。更实用的方法是局部更新,比如只更新刷mask的区域。
局部更新mask
对于一些建筑区域,比如在某个地方盖房子,要求基础是平的。当地形形成时,我们不想改变地表,房子很可能会悬挂。我们可以用volume将区域框起来,跳过该区域的侵蚀。
volume排除侵蚀区
如何解决与艺术编辑的冲突?
有时过程化生成的内容与艺术编辑的内容在同一数据集中发生冲突。谁用的?Unreal提供了Edit Layer的功能,它跟Photoshop同样的层,生成的层可以单独放置,人工编辑层,甚至打开更多的层,以便混合人工编辑和我们生成的数据,以获得预期的效果。但有时你可能不想混合效果,而是想替换效果(例如,河流可以替换原始地形)。我们又开发了一个Edit Layer覆盖混合模式,同时用来支持这样的需求,也扩展了Unreal绘制权重的工具,用来绘制mask,支持这种覆盖混合和多层表现。
Edit Layer覆盖混合模式
还有一种常见的冲突,比如艺术把树放在某个地方,只只是用来装饰的,但当我们产生植被时,我们可能会产生这棵树,这不是他们想看到的。我们将标记生成的树木,每个instance会有一个特殊的属性,这样我们就可以区分哪些树是我们生成的,哪些树是艺术编辑的。当它再次生成时,你可以删除所有原始的树并进行全面更新,但艺术树不会被删除,你也可以选择避免它们。
树很容易消失
如何处理数据导入导出的问题?
我们沿用了Unreal Landscape Spline曲线这些数据需要导出Houdini其实这也是对编辑操作习惯的妥协,也避免了新一套曲线编辑工具的开发。
我们把Unreal Landscape Spline算法重新量化,导出成 JSON,然后在Houdini提取这些关键点进行重建,以便基于此曲线实现算法。我们也加了各种各样的自定义属性,比如说曲线的类型,因为它会有不同的内容(路、护栏、河等),他们是属于不同曲线的。曲线的宽度还有优先级也都是通过这种方式添加到 JSON 文件里。
对于生成的内容。我们也做了一个简单的热图扫描工具,任何一个都可以选择Unreal当中的某个stat,比如统计面数,生成可视化表现,方便艺术在生成或关卡编辑后进行性能自查。
热图性能分析面板
一些实验性的探索
如果只针对前提下的功能,整个工作流可能是相似的,但每个项目实际上都有不同的需求。例如,有些项目根本不需要Houdini,全部生成算法Unreal里程序员自己实现了这一点。其他项目可能会选择整个关卡布局,因为他们不喜欢数据相互引导。Houdini当中进行制作,然后再导入Unreal,这个时候就不能改了。像我们一样,频繁导入导出需要大量的数据交换,所以我们需要程序员不断处理这些特殊需求。
所以我们在把这种工具推广到不同项目的时候,就需要重构整个管线。我们支持了编辑蓝图节点,让原来的Houdini的HDA生成蓝图异步节点的文件,所需的数据准备是通过蓝图(包括数据输出的后处理)进行的,这样就有了灵活性很高,能满足很多奇怪的需求。
可定制的生成流程
生成后,我们可以给它一个 tag或者设置一些类似 的设置virtual texture然后生成一个属性actor,甚至改变它的材料。在这种机制下,解放了程序员的生产力,他们不需要专门开发特征。因为有时候我发现这些功能是无法实现的,但是艺术等不及了,或者用户等不及了。当他们反复折腾时,他们不想使用它们。
另外,我们抽象数据输入输出,比如抽象成图,或者曲线,或者一些点,然后抽象这些数据。这些数据可以通过网络传输,把生成的服务放在更强的位置GPU工作站上。而且数据抽象后,不限于只用Houdini为此,你可以建立自己的服务,使用 Maya或Blender也可以,因为数据交换变得非常简单。
生成服务器
我们也尝试了一些机器学习,比如基于GAN算法的现实世界诞生了成,或者是风格化迁移地表地形等等。另一个常见的问题是使用它Houdini在做这些工作时,数据的导入、导出和计算需要很长时间。一些团队倾向于在引擎中实现生成算法,我们在这方面也做了一些简单的尝试,参考了地平线:零黎明(Horizon Zero Dawn)的做法,使用GPU加速地表地形的产生和植被的分布。
应用探索
过程化内容生成的技术除了应用在游戏开发中,还有其他应用场景。例如NExT在与新华社合作的数字航天员小郑的火星视频中,我们使用过程内容生成的技术来模拟火星的地貌。UE5的Nanite在不限制三角形数量的情况下,可以做大量的几何细节,这也应该是后续游戏制作的趋势之一。