← ALL ARTICLES

程序化资产生成

全库目录221
本文目录7

道路参数改了一点,如果整张地图的树都重新随机,人工调整就失去了依据。程序化资产用规则和种子建立可重复数据流,再把局部覆盖作为独立层保留。生成、验证与发布围绕稳定ID工作。

SOP、HDA 与 PDG

SOP 负责单份几何的数据处理;HDA 把节点网络封装成带输入、参数和输出契约的数字资产;PDG/TOPs 负责任务依赖、参数 Wedge、批处理和并行调度。

例如程序化树管线可以:

  1. HDA 根据曲线、种子和生长参数生成树干与枝叶;
  2. 不同 Wedge 产生树种、年龄和随机变体;
  3. 为每个变体生成 LOD0/1/2 和碰撞;
  4. 用图元组命名 LOD0、LOD1、LOD2;
  5. 用 unity_material 等约定传递目标材质;
  6. PDG 调度导出,并记录输入参数、工具版本和结果路径。

并行数不是越高越好。Houdini Session、贴图烘焙和几何生成都可能占用大量内存。Scheduler 应限制并发,并让单个失败项可以重试,而不是整批重跑。

自动生成与局部控制

适合自动化的是规则明确、重复量大、结果可验证的部分,例如:

  • 道路贴地、护栏和管线沿曲线生成;
  • 岩石、树木和建筑变体;
  • LOD、碰撞、命名和目录输出;
  • 地形切块、遮罩打包和批量导出。

艺术方向、关键轮廓和 Hero 资产往往需要人工控制。工具应暴露有意义的美术参数,并允许局部覆盖配置。过多底层节点参数会把工具变成难用的节点面板。

程序化内容生成(Procedural Content Generation,PCG)把规则、种子和输入数据转换为关卡、散布或资产结果。相同版本、参数和种子应生成相同输出,便于复现、版本比较和网络同步。随机数流要按区域或规则分组,避免新增一个节点后让整个世界随机结果全部变化。

分块散布与稳定重建

开放场景常把树木、岩石和小物件按 Terrain 分块生成。每次改一个参数都重新随机整张地图,会让人工调整全部失效,也会产生难以审查的巨大版本差异。

生成器应让结果具有确定性:

  • 用世界分块坐标和资产类型派生随机种子;
  • 为生成实例保存稳定 ID,不依赖当前数组下标;
  • 将手工删除、移动和替换记录为覆盖配置,而不是直接改生成缓存;
  • 参数变化后只标记受影响的分块为待更新;
  • 输出 manifest 记录规则版本、输入哈希和实例数量。

分块边界还需要邻域信息。道路避让、Poisson Disk 散布和坡度过滤如果只看本块,会在边缘形成断层或重复。可以在计算时读取一圈扩展边界,最后只提交本分块范围内的结果。

实例进入引擎后,还要接入空间分区、LOD、GPU Instancing 和流送。程序化工具产出十万棵树并不等于它们能直接运行;输出预算和运行时表示应当在 HDA 设计阶段就确定。

PCG 的验收还包括密度、可达性、穿插、性能预算和重复模式。设计师的覆盖配置应作为独立层保存,在局部重建后重新应用;无法应用的覆盖要报告冲突,不能静默丢失。

独立随机流与稳定身份

每个候选位置先从稳定输入派生随机流,再决定是否保留。下方为平台中立伪代码,Hash 使用项目固定的算法和字段编码,候选序号来自固定采样格,不能使用筛选后的数组下标。

text
for cell in affectedCells in stableOrder:
    for candidateIndex in fixedCandidateDomain(cell):
        id = Hash(ruleVersion, cell.coordinate, assetType, candidateIndex)
        random = RandomStream(Hash(worldSeed, id))
        candidate = GenerateCandidate(cell, candidateIndex, random)
        if Accept(candidate, neighborInputs):
            emit(id, ApplyOverride(id, candidate))

例如固定候选ID为A、B、C。若共享随机流只在Accept以后继续消耗,B被删除后C就可能拿到原本分给B的随机数,位置随之变化。分别用Hash(worldSeed,A/B/C)初始化流后,删除B不影响C;过滤后的数组只决定输出顺序,不再决定身份。人工移动C的覆盖因而仍能匹配。

某棵树被坡度规则剔除时,不会消耗后续树共用的随机流,所以其他候选保持位置。规则版本变化可能使稳定身份失效,应先尝试可解释的身份映射,并把无法应用的人工覆盖列为冲突。并行输出按 ID 排序后序列化,避免完成顺序改变文件哈希。

验证方法

固定工具版本和种子重复生成,比较实例ID和输出哈希。只修改一个分块参数时检查失效范围,重新应用手工覆盖配置并报告冲突。把输出导入引擎,核对LOD、碰撞、单位与资源预算。

相关主题

参考资料

  • SideFX:PDG and TOPs:Work items 与依赖图;正文随机流、稳定候选身份和覆盖配置是项目侧设计。