首发于第九艺术
用UE4做大世界1-一种原生UE的程序化植被生成方案

用UE4做大世界1-一种原生UE的程序化植被生成方案

这部分是我在今年的UOD2021上的介绍的一些内容,限于时长,当时有些没有能介绍得比较详细,因此重新整理一下并且再额外补充一些内容放在这里,整体会比较长,分几个部分发出来

用UE4做大世界1-一种原生UE的程序化植被生成方案
用UE4做大世界2-无缝过渡的动态天气和UE4的体积云
用UE4做大世界3-雨天,闪电,水体的效果实现

首先是游戏里的花草树木,所有植被的程序化生成是如何做的,这部分涉及的代码修改其实在很久之前的文章里都有列出来,但是没有统一整理起来,趁这次机会会在每个步骤里加上具体代码修改的文章引用。

先看一下最终的效果

在原生UE上的程序化植被生成方案https://www.zhihu.com/video/1457779321586413568

只要点一下生成按钮,就会一键生成好所有关卡的植被,这里有剪去一段等待的时间,实际生成时间没有这么快,但因为是离线的,所以整体还可以接受

游戏里目前实现了8种植被生态,比如有这样的有平原,沼泽,雨林,沙漠等等

平原
沼泽
雨林
沙漠

实现方案是基于原生UE自带的ProceduraLFoliageSpawner 实现的,进行了一些改造,相比目前比较流行的 Houdini 等方案,整体比较简单,它的优点在于

  • 基于原生 UE,改动不多
  • 植被的生成规则很容易定制和拓展
  • 可以流式加载,适合开放世界
  • 另外我们还给美术开发了一些工具,在配置完成后可以一键生成,可以比较快速的迭代

下面是我们的流程,

借助外部 DCC 生成植被 Mask 分布图

首先美术会借助外部DCC生成各个植被的 Mask 分布图,比如这样

然后配置好Mask 对应的世界空间的生成范围

然后在生成一个 instance 的时候,把世界空间的生成位置换算成mask贴图的uv坐标,采样权重值,决定是否生成,可以看到像图里这样,效果还是比较精确的,而且比默认的 landscape layer weight的功能更加灵活

具体实现:

繁弱:Foliage篇-UE4笔刷功能拓展

配置 ProceduralFoliageSpawner 依赖关系

自定义 Foliage 之间的亲疏关系

下一步是配置 FoliageSpawner 的依赖关系,上一步的生成的每个foliage 只考虑自己想生成的位置,现在我们需要让每个foliage同时能考虑一下它周围别的foliage,因此我们定制了一些生成规则,让他们结合起来的时候能够变得更加错落有致比如这里的草和灌木,草的foliageType 里配置了它想靠近这颗灌木2.5m范围内,同时又想远离这颗灌木1.5m,这表示这棵草想生长在这颗灌木 1.5m 到 2.5m 之间

同时支持笔刷模式和程序生成

这个生成规则同时支持 笔刷模式和程序化生成,像这里,笔刷蓝色区域超出刚刚限定范围的区域的是无法生成的

听起来这个功能和原本的 foliage type的碰撞半径有点像,但那个是针对所有 foliage 的,而这种做法可以是 一对一的,更加灵活,最后效果会像图里这样,我们配置好所有foliageType 的依赖关系,然后会把他们配到 spawn volume里面去

具体实现:

繁弱:Foliage篇-ProceduralFoliageSpawner 源码分析拓展-允许亲疏关系

繁弱:Foliage篇-笔刷工具源码分析拓展-允许亲疏关系

SpawnerManager 一键生成到子关卡

上一步所有foliage按我们设定好的生成规则,都有了合适的生成位置,但有个问题是默认的话, 笔刷模式默认是支持放到子关卡的,但是ProcuduralSpawner 都是生成到永久关卡的,这不太符合大世界的需求,我们需要把程序化生成的植被放到子关卡来动态流入流出

根据 LevelName,查找和设置为CurrentLevel

具体做法是,美术会配置好每个spawner想生成的关卡名字,在生成的时候,会根据配置的名字,找到对应关卡,并设置为 CurrentLevel ,然后把instance 加入进去就可以了

额外处理预览窗口的数量显示和植被选择工具

另外,为了方便美术编辑,需要额外一下处理预览窗口的数量显示和植被选择工具,分开处理当前关卡的instance和整个世界的所有instance

具体实现:

繁弱:Foliage篇-UE4 ProceduralFoliageSpawner 拓展

微调不满意的细节,反复迭代

最后效果就是一开始视频里的效果,剩下的就是美术同事反复的迭代和修改,去调整不满意的细节就可以了

编辑于 2022-08-08 21:48