ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

游戏程序化内容生成 (PCG) 管线全景总结与数学美感

游戏程序化内容生成 (PCG) 管线全景总结与数学美感 游戏程序化内容生成 (PCG) 管线全景总结与数学美感程序化内容生成PCG的迷人之处在于它用纯粹的数学规则在虚空中编织出具有无限可能的世界。从《Minecraft》的地形体素到《No Mans Sky》的星系生态PCG 绝非无序的伪随机数堆砌而是在严密的数学约束与自然物理自相似性之间寻找平衡的算法艺术。在现代游戏工业管线中单纯依靠美术手工铺设数千平方公里的开放世界地貌与植被早已不可持续。我们在自研 PCG 地形与地块生成器中将多频分形噪声Fractal Noise、波函数坍缩Wave Function Collapse, WFC、泊松圆盘采样Poisson Disk Sampling与图论约束求解熔炼为一体构建了工业级程序化生成矩阵。[种子 Seed] ── [多层分形噪声 / 沃罗诺伊划分] ── 宏观大陆架与群系分布 (Biome Map) │ ▼ [水力侵蚀与热力侵蚀模拟] ── 高度图与地表法线冲刷 (Erosion Pass) │ ▼ [泊松圆盘采样 (Blue Noise)] ── 植被/碎石生态密度分布 │ ▼ [波函数坍缩 (WFC) 规则解算] ── 建筑遗迹与地下城拓扑生成 │ ▼ [GPU Compute / Indirect Draw] ── 0 开销百万级实体批次呈现1. 连续地貌的骨架分形布朗运动 (fBm) 与水力侵蚀算法自然界的山脉山峦具有分形自相似特征。简单的单频 Perlin 噪声过于平滑呆板必须通过分形布朗运动Fractional Brownian Motion, fBm叠加多个不同频率与振幅的倍频程Octaves。随后必须通过物理水力侵蚀Hydraulic Erosion模拟雨水对土壤的冲刷与沉积才能生成具有逼真山脊与冲积扇的地貌。以下是在 GPU Compute Shader 中执行的大规模水力侵蚀模拟核心片段// HydraulicErosion.compute #define THREADS_PER_GROUP 16 RWTexture2Dfloat _HeightMap; RWTexture2Dfloat2 _WaterSedimentMap; // r: 水量, g: 泥沙沉积量 cbuffer ErosionParams { float _Dt; float _RainRate; float _EvaporationRate; float _Solubility; // 土壤溶解系数 float _DepositionRate; // 沉积系数 }; [numthreads(THREADS_PER_GROUP, THREADS_PER_GROUP, 1)] void CSErodeMain(uint3 id : SV_DispatchThreadID) { int2 uv int2(id.xy); float h _HeightMap[uv]; float2 ws _WaterSedimentMap[uv]; // 1. 降雨增加地表水量 ws.x _RainRate * _Dt; // 2. 计算与四周 4 邻域的局部高程梯度 float hL _HeightMap[uv int2(-1, 0)]; float hR _HeightMap[uv int2(1, 0)]; float hD _HeightMap[uv int2(0, -1)]; float hU _HeightMap[uv int2(0, 1)]; float3 normal normalize(float3(hL - hR, 2.0f, hD - hU)); float slope 1.0f - normal.y; // 坡度越大冲刷力越强 // 3. 计算最大泥沙携带容量 float sedimentCapacity max(slope * ws.x * _Solubility, 0.001f); // 4. 溶蚀或沉积解算 if (ws.y sedimentCapacity) { // 泥沙过饱和发生沉积抬升地形 float depositAmount (ws.y - sedimentCapacity) * _DepositionRate * _Dt; h depositAmount; ws.y - depositAmount; } else { // 泥沙未饱和冲刷地表下切侵蚀 float erodeAmount min((sedimentCapacity - ws.y) * _Solubility * _Dt, h); h - erodeAmount; ws.y erodeAmount; } // 5. 水分蒸发 ws.x * (1.0f - _EvaporationRate * _Dt); _HeightMap[uv] h; _WaterSedimentMap[uv] ws; }2. 离散结构的因果演进波函数坍缩 (WFC) 的确定性收敛在生成地下城迷宫、村庄建筑群或拼接式关卡时波函数坍缩WFC算法通过量子力学概念引入了精妙的约束传播Constraint Propagation。每个网格槽位初始处于所有可能图块Tiles的叠加态当选定熵最小的单元格坍缩后邻接相容性规则Adjacency Compatibility会像多米诺骨牌一样扩散。以下是 C# 实现的重力型 WFC 传播核心逻辑using System; using System.Collections.Generic; public class WFCCore { private readonly int _width; private readonly int _height; private readonly int _numTilePrototypes; // 叠加态位掩码第 i 位为 1 表示允许第 i 种图块存在 private ulong[,] _waveState; // 邻接规则表Direction - (TileA - TileB Mask) private ulong[,,] _compatibilityTable; public WFCCore(int width, int height, int prototypes) { _width width; _height height; _numTilePrototypes prototypes; _waveState new ulong[width, height]; } public bool Propagate(int startX, int startY) { var queue new Queue(int x, int y)(); queue.Enqueue((startX, startY)); while (queue.Count 0) { var (cx, cy) queue.Dequeue(); ulong currentPossibilities _waveState[cx, cy]; // 遍历 4 个正交方向 for (int dir 0; dir 4; dir) { int nx cx GetOffsetX(dir); int ny cy GetOffsetY(dir); if (nx 0 || nx _width || ny 0 || ny _height) continue; ulong neighborState _waveState[nx, ny]; ulong allowedNeighbors 0; // 累加当前槽位所有可能候选对邻居的约束并集 for (int t 0; t _numTilePrototypes; t) { if ((currentPossibilities (1UL t)) ! 0) { allowedNeighbors | _compatibilityTable[dir, t, 0]; } } // 计算裁剪后的新叠加态 ulong constrained neighborState allowedNeighbors; if (constrained 0) return false; // 规则冲突波函数矛盾爆炸 if (constrained ! neighborState) { _waveState[nx, ny] constrained; queue.Enqueue((nx, ny)); // 约束改变继续向外波浪式级联传播 } } } return true; } private int GetOffsetX(int dir) dir 0 ? 1 : (dir 1 ? -1 : 0); private int GetOffsetY(int dir) dir 2 ? 1 : (dir 3 ? -1 : 0); }3. 自然生态分布的蓝噪声泊松圆盘采样 (Poisson Disk Sampling)在植被、碎石与野外资源的自然生成中均匀伪随机数会导致令人难受的“聚集团块”或“过于稀疏的空白”而规则网格排列又显得极其机械刻板。泊松圆盘采样Poisson Disk Sampling具有蓝噪声Blue Noise的高频分布特性保证了采样点之间拥有严格的最小距离约束 $r$同时具备高度随机的自然离散美感。4. 数学规则与游戏设计的共生PCG 不是为了取代关卡设计师而是充当设计创意的“空间放大器”。用数学算法铺设宏观的自然山川、重力水系与地块布局把宝贵的人力精力释放给微观处具有温度的剧情据点与关卡节奏编排。代码生成的每一座山谷与每一处废墟都在数学公式的绝对秩序中绽放着游戏独有的生机。
返回列表