PCG 程序化内容生成框架
PCG Framework
PCG 框架把程序化内容表达为「点流」:PCG 组件/体积从关卡采样空间数据,图中的 Sampler 生成带变换、密度、种子与自定义属性的点,经过滤与变换后由 Spawner 生成网格或 Actor,编辑器中实时更新,也可运行时生成。属性分为 $ 静态属性和元数据动态属性,按 @Data/@Points/@Elements 域组织;图参数与图实例的用法类似材质参数与材质实例;与世界分区集成,生成物继承数据层与 HLOD 层。
是什么
官方:程序化内容生成框架 (Procedural Content Generation Framework, PCG) 是在 UE 内创建程序化内容与工具的工具集,面向技术美术、设计师和程序员,规模从资产工具(建筑、生物群落)到整个世界。需启用 PCG 插件;在静态网格上采样点还需 Geometry Script Interop 插件。(Procedural Content Generation Overview)
核心模型:点流
flowchart LR C["PCG 组件 / PCG Volume 采样关卡空间数据"] --> G["PCG 图"] G --> S["Sampler 采样: 生成点"] --> F[Filter / Density / Point Ops] --> SP["Spawner: 生成网格/Actor"]
- 点 (Points):3D 位置,带变换、包围盒、颜色、密度、陡度 (steepness)、种子 (seed),可附加用户属性。
- 点密度 (Point Density):点存在于该位置的概率,调试视图中 0 黑 1 白。
- 程序化节点图:格式类似材质编辑器;空间数据从关卡中的 PCG 组件流入图,生成点,经一系列节点过滤和修改,结果实时更新,最后用点生成资产。(Procedural Content Generation Overview)
节点分类包括 Sampler(从体积、表面、网格采样生成点)、Filter、Density、Point Ops、Metadata、Spatial、Spawner、Control Flow、Subgraph、Hierarchical Generation、Blueprint(执行派生自 PCGBlueprintElement 的蓝图)等。(Procedural Content Generation Overview)
属性与元数据
| 概念 | 规则 |
|---|---|
| 静态属性 | 固定存在,以 $ 开头,如 $Position |
| 动态属性 | 运行时创建,存在图数据的元数据中 |
| 域 (Domain) | @Data(数据本身,单值,空间数据的默认域)、@Points、@Elements(属性集) |
| 属性选择器 | @Last 表示上一节点最后修改的动态属性;可取分量,如 $Position.ZYX、Length |
| 覆盖 | C++ 中标 PCG_Overridable 的设置(蓝图中实例可编辑变量)可通过覆盖引脚由属性驱动 |
样条数据可直接读写控制点属性($Position、$ArriveTangent、$LeaveTangent 等),控制点上的元数据在采样时插值。(Procedural Content Generation Overview)样条本身的数学见 埃尔米特与 Kochanek-Bartels 样条 和 贝塞尔曲线。
复用:参数、实例、模板
图参数 (Graph Parameters) 与材质参数类似;图实例 (Graph Instances) 类似材质实例,可作为子图并通过覆盖引脚改参数;图还可标为模板。(Procedural Content Generation Overview)概念对照见 材质系统。
运行时与世界分区
PCG 组件既能在编辑器中也能在运行时管理生成。当 PCG 资产被分配到某个世界分区数据层 (Data Layer) 和 HLOD 层时,生成的 Actor 会被分配到同一数据层和 HLOD 层。(Procedural Content Generation Overview)见 世界分区。
例子:森林体积
Get Landscape Data → Surface Sampler(Points Per Square Meter 0.15、Point Extents 50、Looseness 1.0)→ Transform Points(Z 旋转 0–360、Absolute Rotation、缩放 0.5–1.2)→ Static Mesh Spawner(多个网格条目按权重随机:概率为条目权重占总权重的比例)。(Procedural Content Generation Overview)
官方原文描述为「把所有权重相加再除以各自权重」,按字面应为 ,这里按概率含义改写。
调试:选中节点按 D 切换调试渲染、E 启用/禁用、A 检查 (Inspect) 在属性列表中查看点。(Procedural Content Generation Overview)
取舍
| 方面 | 说明 |
|---|---|
| 收益 | 规则化摆放、快速迭代、改参数全局重生成 |
| 运行时生成 | 灵活但占用运行时资源;官方建议配合分层生成,只在需要的地方生成高细节(见上文);编辑期生成后烘焙更可控 |
| 大量实例 | Static Mesh Spawner 生成实例化网格,配合 Nanite 虚拟化几何体 处理高密度植被几何(关联为通识) |
| 确定性 | 点带种子,可复现(种子字段见官方点定义) |
生成模式:分区、分层与运行时生成
(UE 5.8「Using PCG Generation Modes」,Using PCG Generation Modes)生成模式会把 PCG 组件的生成范围切成网格,每个格子有自己的本地 PCG 组件。共四种:不分区(默认)、分区 (Partitioned)、分层 (Hierarchical Generation, HiGen) 和运行时生成 (Runtime Generation)。
| 模式 | 做法 | 用途/坑 |
|---|---|---|
| 分区 | 按 PCGWorldActor 上的 Partition Grid Size 把结果分到各格 | 结果按格分开,便于配合 世界分区 流送;不分区时大范围生成会有性能问题 |
| 分层 | 图设置里打开 Use Hierarchical Generation,在采样节点前放 Grid Size 节点,指定下游数据用哪个网格 | 必须先开分区;大而少的网格体(树、巨石)放大网格,小而多的(草、石子)放小网格 |
| 运行时生成 | Generation Trigger 设为 Generate at Runtime,在生成源附近生成、远离时清理 | 和分层配合效果最好;可在编辑器、PIE 和独立运行中使用 |
分层的数据流规则:大网格生成的数据会作为缓存供小网格使用,只能从大到小传递,不能反过来;一个节点的输入来自多个网格时,输出用最小的那个网格。很贵的操作(如对整个体积做 Mesh Sampler)应放在 Unbounded 网格上只执行一次,而不是每格执行一次。坑:数据从大网格传到小网格时,每个小格都会复制一份大网格的点,导致重复点、严重拖慢性能,可用 Cull Points Outside Actor Bounds 节点去掉格外的点。
flowchart LR U["Unbounded:只执行一次<br/>(昂贵的采样)"] --> L["大网格:树、巨石"] L -->|"缓存数据向下传递"| S["小网格:草、石子"] G["生成源<br/>玩家/视口/流送源"] -."按各级生成半径调度".-> L G -.-> S
图中数据只从 Unbounded 流向大网格再流向小网格;生成源按每一级网格的生成半径,决定哪些格子需要生成或清理。
运行时生成调度:生成源包括编辑器视口(需在 PCGWorldActor 上打开)、玩家控制器、世界分区流送源和 PCG Generation Source 组件。每级网格各有生成半径 (Generation Radii),超出半径乘以 Cleanup Radius Multiplier 后的范围就会清理。官方建议半径随网格变大而递增,不要让小网格的半径比大网格还大。默认调度策略按距离和视线方向确定优先级;可开启视锥剔除,并用 Bounds Modifier 让组件在进入视野前提前生成,避免对着镜头突然冒出来。调试命令:pcg.RuntimeGeneration.Enable、pcg.RuntimeGeneration.EnableDebugging。
GPU 执行(Beta)
(UE 5.8「Using PCG with GPU Processing」,Using PCG with GPU Processing)部分节点(Copy Points、Static Mesh Spawner、Custom HLSL)可以在 GPU 上执行,相连的 GPU 节点会合并成一个计算图 (Compute Graph),按 计算着色器 派发。取舍:CPU 与 GPU 之间传数据、准备计算图都有 CPU 开销,只有点数足够多、能用满 GPU 时才划算。所以官方建议把 GPU 节点放在一起,尽量减少上传/下载(节点上的黄色上下箭头标记),并用分层生成把共享工作放在大网格或 Unbounded 上。GPU 节点接 GPU 版 Static Mesh Spawner 是生成网格体的快速路径。
出处
- Procedural Content Generation Overview UE 5.8 文档
- Using PCG Generation Modes UE 5.8 文档
- Using PCG with GPU Processing UE 5.8 文档(Beta 功能)