说明

本文为对GDC2023上寒霜引擎地形程序化工具分享的记录与分析

GDC 2023: From Battlegrounds to Fairways: Terrain Procedural Tools in Frostbite

概述

寒霜引擎将其中的地形相关的 Texture 都与对应的 Mask(类似权重图)组合来进行地形混合,他们将这些 Texture 和 Mask 都称为 Raster。
Raster 被划分进多个 Overlays(类似 Layers 的概念),在其中进行 Blend 并输出混合后的 Raster,而最终混合地形效果所用的各个 Mask 都是由 Overlays 组合得到的。

高度图、纹理贴图等都可以作为 Raster 输入 Overlays,而其输出也可以作为其他 Overlays 的输入。因此寒霜引擎对 Overlays 的操作非常灵活,这个 Feature 使得地形的高度图也可以受材质混合以及地形上的其他 Object 的影响而发生改变,并且高度图的输出也可以反过来影响地形效果,对程序化地形生成也比较有利。

1

2

寒霜引擎的地形程序工具使得原本需要依赖 Houdini 完成的工作在一定程度上移至 Editor 中,极大简化了工作流,且方便对效果进行迅速的测试。

3

Overlays

Overlays Composition

Overlays 首尾相接,每一个 Overlay 的输出都可以作为后续某个 Overlay 的输入,并在其中完成混合(寒霜引擎支持12种混合模式)

寒霜引擎中的 Raster,是一个通用 Texture 的概念(无论是高度图还是纹理贴图等,其区别只有存储的数据格式不同),这给 Overlays 增加了更多的灵活性。比如,某一个 Overlay 进行默认的高度图混合,而其输出的 Raster 可以作为其他 Overlays 中的 Mask 进行混合;反过来,某个 Overlay 进行地形材质的混合,而其输出也同样可以作为高度图 Overlay 的 Mask 来影响地形高度。

4

Types of overlays

Paintable overlays

由 Brushes 进行编辑或导入静态数据而成的 Overlay
(猜测类似 UE 中 EditLayers 拥有各自的 Textures,而其在 Tick 中的 Merge 操作,在寒霜引擎中由 Overlays 的混合操作完成)

Autopaint overlays

由 Objects 自动在 Raster 上进行绘制的 Overlay

5

Autopaint Behaviours

Autopaint Behaviours 赋予 Assets 像 Brushes 一样编辑地形的能力。它可以看作是 Mesh, Transform, Shader 的组合。

因为最后需要输出的是 Raster,因此相当于用一个正交相机从顶部观察

6

Sand 和 Rock 的混合
7
8

Road 材质贴图影响高度图
9
10

Effect overlays

在其他 Overlays 基础上,使用 Generator 或 Filter 程序化生成地形效果的 Overlays(类似后处理,在其之前的 Overlays 的基础上加上某些全局的效果)

加噪
11

Filter
12

Examples

PGA Tour
13

战地2042
14

程序化生成

前述 Overlays 组合的概念,实际上是为地形程序化数据流构建了类似依赖图的机制
某个 Overlays 的更改可以自动传播至有依赖关系的其他 Overlays

15

Example

SnowGrass Mask Generation
16
17

AO Generator
18

ColorRange Selection(叠加积雪覆盖区域)
19

Height Selection(移除河床)
20

Flowmap
21

Roads & Trees Autopaint
22

Artist Touchups
23

Terrain Update

寒霜引擎的地形更新也是由任务队列进行管理。

地形工具的使用会生成新的 Update Request,以创建更新输出的 Raster Mask 的任务

从 Paintable overlay 出发,可以沿着依赖关系找到其影响的所有 Overlays 以及最终的 Mask。其中,与当前修改直接相关的 Raster Mask 的更新为 Primary job(修改的 Overlay 属于该 Mask),因依赖关系传播的受到边缘影响的 Mask 的更新为 Secondary job

24

像 Blur 之类的效果会对 Brush 覆盖范围周边的一小部分也产生影响,因此在依赖传播的过程中,遇到此类 Overlay 时,就对 Coverage 进行一定程度的增加

Primary jobs 会在 Brush 绘制时立即执行,而 Secondary jobs 会在队列中等待,在期间可以对任务进行合并简化,在释放鼠标时统一执行

25

根据视锥、任务类型、相机距离等因素对任务队列进行排序

26