Skip to content

赛道 – 树木

汉化标题:赛道 – 树木
原文标题:Tracks-–-Trees
汉化更新时间:2026-01-14 17:38:44 +08:00
英文原文最新更新时间:2022-10-25 15:15:21 +0300

CSP 0.1.79 新功能:通过简单配置在赛道上添加成千上万棵树。借助 LOD、远处的 billboard(告示牌)以及大量 instancing,CSP 应该能够轻松处理数十万棵树(若不能,请告知,我会继续优化)。该系统也可用于灌木——目前灌木不会发生形变,但以后可以加入该功能。

树模型

首先你需要一个树模型。未来希望能加入程序化树生成,但目前仍需手动准备。

模型要求:

  • LOD A:约 10K 三角形,LOD B:约 6K,LOD C:约 3K(仅建议,可更大或更小);
  • 每个 LOD 使用单个网格(如需对树干和树枝使用不同纹理,可使用多材质);
  • 每个模型的枢轴点应位于其基底中心(可视为树在表面上的定位点);
  • 材质应包含漫反射(albedo)与法线贴图(在 3DS Max 中使用 bump 贴图);
  • 法线贴图的 alpha 通道可用于局部AO(Ambient Occlusion);
  • 漫反射贴图的 alpha 用于透明度:确保树干贴图为不透明。

准备好符合要求的几个 LOD 模型后(不一定要三个 LOD,必要时可更少),将它们放在同一场景并导出为 FBX。

现在你可以使用 AC Content Manager 快速将 FBX 转换为可用的树模型。转到 “Content/Tools/Creator tools” 并选择 tree converter。

在工具中选择 FBX 文件并指定输出 BIN 文件路径(例如放在 content/tracks/<yourtrack>/extension/trees),工具会完成其余工作。视需要会有若干可调参数(例如针叶树可能需要更少的次表面散射和反射率)。工具在运行时也会监视 FBX 变化,以便在你修改模型后自动刷新树模型。

树列表

准备好树模型后即可将其添加到赛道。最简单的配置如下:

ini
[TREES]
LIST_0 = trees/trees.txt

按此配置,CSP 会在 content/tracks/<yourtrack>/extension/trees/trees.txt 中查找树列表。列表内可按坐标列出树(“my_tree.bin” 是之前由 Tree Model Converter 导出的文件,与 trees.txt 在同一目录):

tree: my_tree.bin; 208.4, -1, -53
tree: my_tree.bin; 207.9, -1, -29
tree: my_tree.bin; 207.1, -1, -19
tree: my_tree.bin; 138.5, -1, -12
关于树列表格式的更多信息

每行要么是注释,要么是树行,或是配置行。配置行由键和值组成,会覆盖该键之后直到下一个相同键的配置行。两个示例配置行:

configure: size variance = 0.8, 1.2  ; 尺寸倍数将在 80…120% 范围内随机选择
configure: angle variance = 0, 360   ; 角度将在 0…360° 范围内随机选择

所有参数:

  • size variance: 设置随机尺寸范围;
  • width variance: 设置随机宽度倍数范围;
  • angle variance: 设置随机角度范围;
  • color variance: 设置随机 RGB 颜色偏移范围;
  • brightness variance: 设置随机亮度偏移范围;
  • fake shadow: 需要单个值,用作后续所有树的伪影子不透明度;
  • seed: 为后续所有树替换随机种子为该单一值。

注意:所有随机值即便未显式设置种子也会使用固定种子进行预定(deterministic)。

每棵树的行也可以覆盖任意这些值来针对单棵树定制:

tree: tree0.bin; pos=-83.3, -0.99, -74.14; angle = 180; size = 1; width = 1; color = 2, 2, 2

为方便编辑,可在同一配置中使用多个列表,这样更新某一列表时不必重新加载所有列表。

其他参数

表面对齐

若要自动将树贴合到基础表面并使树的光照与表面对齐(在倾斜表面上效果极好),使用 SURFACE_MESHESSURFACE_MATERIALS 参数,例如:

ini
[TREES]
LIST_0 = trees.txt
SURFACE_MATERIALS = tarmac, Concrete2Mat

季节条件

你可以将季节变化绑定到条件,使树在秋季变黄、冬季变白。也可以为不同类型的树重新定义季节调整(比如让针叶树在秋季不变黄):

ini
[CONDITION_...]
NAME = SEASON_WINTER
INPUT = YEAR_PROGRESS
LUT = (|-1=0|0=0.25|0.05=0.35|0.075=2|0.12=0.3|0.2=0|0.45=0|0.6=0.00|0.7=0|0.85=0|0.95=0.2|1=0.25|)

[CONDITION_...]
NAME = SEASON_AUTUMN
INPUT = YEAR_PROGRESS
LUT = (|-1=0|0=0.75|0.2=0|0.45=0|0.6=0.05|0.7=0|0.75=0|0.8=0.75|1=0.75|)

[TREES]
LIST_0 = trees.txt
SEASON_AUTUMN_0 = SEASON_AUTUMN
SEASON_WINTER_0 = SEASON_WINTER
SEASON_AUTUMN_1 = tree_pine?, tree_big_pine.bin, 0

注意:目前树木不会在冬季落叶。若希望未来 CSP 能移除树叶,请在生成的树的 tree.ini(这些 bin 文件本质上是归档文件,可用 7Zip 或 WinRAR 打开)中加入 [BASIC] LEAFLESS_WINTER=1 参数,以便将来实现更高效的落叶处理。

烘焙与编译

一切准备好后,你可以使用 vertex ambient occlusion bakery(https://github.com/ac-custom-shaders-patch/acc-bakeryoptix)将树列表编译为单一二进制文件,这能显著加快加载速度。它还会将树对赛道产生的环境阴影烘焙进去,并为树计算方向性环境阴影,有助于为浓密树林添加纵深感。要配置它,请用新的 VAO bakery(v17+)烘焙赛道。确保赛道文件夹位于 AC 根目录并已安装 CSP 0.1.79:bakery 会以 headless 模式运行 Assetto Corsa 几次以协助数据处理。

编译后会在赛道目录生成 compiled_trees.bin 文件。将其移动到你希望的位置(例如 content/tracks/<yourtrack>/extension 文件夹),并将配置改为:

ini
[TREES]
COMPILED_LIST = compiled_trees.bin

设置该值后,AC 会自动加载已编译列表而不是配置中指定的 LIST_... 值,从而加快读取与初始化。发布版本中可删除原来的列表文件。

更多细节:

  • 若设置了 COMPILED_LIST,则 AC 会在常规运行时忽略所有 LIST_... 值,但在烘焙过程中不会忽略。这意味着你不必在发布或测试时移除 LIST... 来强制使用编译数据,也不必移除 COMPILED_LIST 来恢复使用文本列表以更新烘焙数据;
  • 表面对齐(通过 SURFACE_... 值配置)也会存储在已编译列表中。如果地形几何或法线贴图发生变化,请确保重新编译;
  • VAO bakery 并不总是需要编译二进制列表。查看 baked_shadow_params.ini:其中 EXT_PROCEDURAL_TREES_... 值设置了树的处理方式,如果 EXT_PROCEDURAL_TREES_FINALIZE 未设为 1,则树的遮挡信息会存储在赛道的 .vao-patch 文件中。