赛道-–-草地特效(Grass FX)
汉化标题:赛道-–-草地特效(Grass FX)
原文标题:Tracks-–-Grass-FX
汉化更新时间:2026-01-14 16:56:41 +0800
英文原文最新更新时间:2025-10-19 16:48:38 -0300
Grass FX 会用在摄像机周围程序生成的草来替换原始的 AC 草,具有更高的密度和一些诸如形变等特性。为了使其正常工作,需要列出应生成草地的网格。
生成语法
对于任意 …_MATERIALS,也存在 …MESHES,例如 GRASS_MESHES;两者可以同时使用。
[GRASS_FX]
; 生成区域
GRASS_MATERIALS = ; 要在其上方生成草地的材质列表
GRASS_MESHES = ; 网格同样适用
OCCLUDING_MATERIALS = ; 遮挡材质列表:例如覆盖草地网格的道路网格,将道路材质加入此处可阻止草从道路缝隙中穿出
OCCLUDING_MESHES = ; 网格同样适用
OCCLUDING_MATERIALS_ALPHA = ; 平滑遮挡材质列表:比如一块草地下面有一块沙地,平滑过渡草地显示,加入沙材质能使过渡更自然
OCCLUDING_MESHES_ALPHA = ; 网格同样适用
ORIGINAL_GRASS_MATERIALS = ; 如果 Grass FX 激活,列出要隐藏的原始草地材质
; 注意:如果你想保留原始的 3D 草(使用 ksGrass 着色器),那么在上面使用一个
; 在 "=" 后不带名称的空行!!!默认情况下,只有当表面颜色合适时才会生成草。它期望是偏绿色的颜色,不要太亮也不要太暗。如有需要,你可以重新调整阈值。提高阈值会使草更加斑块化和不均匀,降低阈值会让各种颜色的草都能生成。
[GRASS_FX]
; 生成遮罩设置
MASK_MAIN_THRESHOLD = 0.5 ; 表面应有多绿色(不是实际饱和度,可能大于 1)
MASK_RED_THRESHOLD = 0.05 ; 将目标颜色从绿色偏移到黄色和红色的阈值,如果设置得足够高则会生效
MASK_MIN_LUMINANCE = 0.02 ; 生成草地所需的最小亮度
MASK_MAX_LUMINANCE = 0.35 ; 最大亮度下面是一个让草在任何地方都生成的示例设置:
[GRASS_FX]
MASK_MAIN_THRESHOLD = -1
MASK_RED_THRESHOLD = 0
MASK_MIN_LUMINANCE = -1
MASK_MAX_LUMINANCE = 1形状设置与修剪
基本的形状设置很简单:
[GRASS_FX]
SHAPE_SIZE = 1.0 ; 一般尺寸
SHAPE_TIDY = 0.0 ; 草的整洁程度(不整齐的草会更不均匀、更倾斜)
SHAPE_CUT = 0.0 ; 草的修剪程度
SHAPE_WIDTH = 1.0 ; 草的宽度相对于高度的比例更高的尺寸值会降低密度。默认值 1.0 对应于相当稀疏的赛道草。
为了使草随时间变化,你可以设置修剪周期和双值。第一个值表示修剪周期开始时的数值,第二个值表示修剪周期结束时的数值。修剪周期可以是每周的某一天,或以天为单位的持续时间(可选偏移)。
下面是一个示例:草在周四被修剪,然后变得不那么整齐:
[GRASS_FX]
TRIM_PERIOD = THURSDAY ; 草会在每个星期四被修剪
SHAPE_SIZE = 0.5, 1.0 ; 在周四为 0.5,周三为 1
SHAPE_CUT = 1.0, 0.5 ; 周四非常修剪,随后变少
SHAPE_TIDY = 1.0, 0.5 ; 周四非常整齐另一个示例,草在一年中逐渐生长:
[GRASS_FX]
TRIM_PERIOD = 365
SHAPE_SIZE = 4, 8
SHAPE_TIDY = 0此外,这些 SHAPE_… 数值中的每个也可以是一个赛道条件(track condition),因此你可以将草高度绑定到一天中的时间或其他参数。更合理的示例是将其绑定到一年进度的自定义 LUT。
局部调整
为了改变不同区域草的外观,你可以定义最多四个额外配置,然后将这些配置分配给不同的网格。如果你疑惑为什么只有四个,这是因为四个配置可以完美映射到局部调整纹理(带有四个通道)以便更优化的处理,同时也允许手工绘制调整贴图。另一种方法是将参数分配给通道,但那将需要至少三个大型纹理,或者我们只能有四个参数。
草地配置具有与 [GRASS_FX] 相同的参数:形状和颜色遮罩。下面是我在 Brands Hatch 上的设置示例:
; 配置 A:每周修剪的整齐草地
[GRASS_FX_CONFIGURATION_A]
TRIM_PERIOD = THURSDAY ; 草将在每周四被修剪
SHAPE_SIZE = 0.5, 1
SHAPE_CUT = 1, 0.5
SHAPE_TIDY = 1, 0.5
; 配置 B:观众下踩踏后的草地
[GRASS_FX_CONFIGURATION_B]
MASK_MAIN_THRESHOLD = 1.1 ; 更高的阈值意味着草会更稀疏,以斑块形式出现
SHAPE_SIZE = 2
SHAPE_TIDY = 0
; 配置 C:野生草地
[GRASS_FX_CONFIGURATION_C]
MASK_MAIN_THRESHOLD = 0.3 ; 稍低的阈值让草生长更多
TRIM_PERIOD = 365 ; 草在一年中慢慢生长
SHAPE_SIZE = 4, 8
SHAPE_TIDY = 0
; 目前最多到 D 配置
[GRASS_FX_CONFIGURATION_D]
...然后,可以这样将其分配给不同的网格:
[GRASS_FX_ADJUSTMENT_...]
MATERIALS = ; 列出要用于该配置的材质
MESHES = ; 列出要用于该配置的网格
MAP = A, 1 ; 配置名及其强度。强度为 0 时将使用基本的 [GRASS_FX] 配置。介于两者之间的值会混合数值
; 调整也可以同时使用多个配置,并使用自定义混合
MAP = 0.8, 0.5, 0.2, 0.0 ; 80% 的 A 配置,接着 50% 的 B,随后 20% 的 C使用自定义混合值还有一个可能性:如果你需要 10 个不同的草高,只需创建一个非常高的草配置,然后对不同网格分配该配置的 10%、20% 等强度。
调整将根据此参数进行模糊处理:
[GRASS_FX]
MASK_BLUR = 1 ; 值从 0 到 3,0 禁用模糊GRASS_FX_ADJUSTMENT 部分最多可以有 8 个局部区域,形状为圆或椭圆,允许更细粒度地微调草或创建渐变。使用 Grass FX 调试应用查看调整会大大帮助设置。
[GRASS_FX_ADJUSTMENT_...]
MESHES = …
MAP = A ; 如果未设置权重,默认值为 1
EXTRA_0 = B, 0.5 ; 与调整的 MAP 值相同的规则
EXTRA_0_CENTER = X, Z ; X 和 Z 为世界坐标(米);也可以使用 X, Y, Z,此时会跳过 Y
EXTRA_0_RANGE = FROM, TO ; FROM 和 TO 为距离(米);FROM 为内半径(最强烈)而 TO 为外半径(强度为 0)。如果 FROM 大于 TO,区域将被反转,覆盖除圆内的所有区域
EXTRA_0_ASPECT_RATIO = 1 ; 将 1 改为其他值以把圆变为椭圆
EXTRA_0_ANGLE = 0 ; 以度为单位旋转椭圆的角度
EXTRA_0_OPACITY = 1 ; 局部区域的不透明度更简单的方式是包含 common/grass_fx.ini 并使用其中的 GrassFX_ExtraArea mixin。主要优点:无需担心索引(“_0” 部分),并且该 mixin 提供了一个更友好的 Fade 变量来替代 FROM 和 TO。例如在 Brands Hatch,我用它将草从野生状态切换为观众下踩踏和停车场周围的样式:
[INCLUDE: common/grass_fx.ini] ; 用于 GrassFX_ExtraArea mixin
[GRASS_FX_ADJUSTMENT_...]
MATERIALS = grass_ext
MAP = C, 0.5 ; 半数为野生草
; 被踩踏的草区域,每个 GRASS_FX_ADJUSTMENT 部分最多 8 个
@ = GrassFX_ExtraArea, Map = B, Center = "-350, 0, -300", Range = 140, Fade = 20, Aspect = 3.5, Angle = 40 ; 观众和起始位置旁的停车区
@ = GrassFX_ExtraArea, Map = B, Center = "-459.04, 4.57, -192.12", Range = 30, Fade = 10 ; 直升机周围
@ = GrassFX_ExtraArea, Map = B, Center = "-76.31, 12.47, -441.7", Range = 100, Fade = 20, Aspect = 2.5, Angle = 20 ; 主要看台
@ = GrassFX_ExtraArea, Map = B, Center = "-171.61, 1.86, -461.88", Range = 60, Fade = 20, Aspect = 2, Angle = 20 ; 后方停车区你也可以在没有任何网格的情况下使用 GRASS_FX_ADJUSTMENT,通过中心、大小和角度绘制矩形:
[GRASS_FX_ADJUSTMENT_...]
CENTER = X, Y, Z ; 或者仅 X 和 Z,世界坐标(米)
SIZE = X, Y, Z ; 或者仅 X 和 Z,米为单位
ANGLE = 0
MAP = A将其 MAP 设置为全零并用额外区域覆盖,或为其附加自定义调整贴图,都是有意义的做法:
[GRASS_FX_ADJUSTMENT_...]
CENTER = X, Y, Z
SIZE = X, Y, Z
ANGLE = 0
TEXTURE = texture_name.dds ; 位于配置文件旁
TEXTURE_OFFSET = 0, 0 ; 纹理在 UV 坐标中的偏移
TEXTURE_SCALE = 1, 1 ; 纹理缩放红色通道将设置 A 配置的份额,绿色通道为 B,以此类推。
多层局部调整(新)
对于具有 txMask 纹理的多层着色器,你可以将不同的 Grass FX 调整绑定到该遮罩的不同通道:
[GRASS_FX_ADJUSTMENT_...]
MATERIALS = grass, top2
USE_MULTILAYER_MASK = 1 ; 使用多层遮罩进行调整
MASK_R = A, 3 ; 红色通道用于更野的草
MASK_G = -10 ; 强制绿色通道使用基础配置
MASK_B = B, 3 ; 蓝色通道用于最野的草
MASK_A = C ; alpha 通道用于稀有草此段摘自 Silverstone 的配置。简而言之,与你可以设置单一 MASK 值不同,你可以为完全黑色区域设置 MASK_BASE,为红色通道设置 MASK_R,依此类推。
哦,还有一个 USE_MULTIMAP_DETAIL_MASK 选项可以将其绑定到 txDiffuse 的 alpha 通道,以用于 ksMultiMap… 着色器。数值相同,尽管我认为你通常只需要 MASK_BASE 和 MASK_A。
自定义纹理
Grass FX 为整个赛道使用单一纹理图集(texture atlas)。它的工作原理是将纹理划分为网格,默认大小:16 列 1 行。然后在生成过程中,第一行用于常规基础且处处生成的草。你可以使用此工具生成纹理:https://github.com/ac-custom-shaders-patch/ac-grass-gen。其它行可映射到不同的草片段。

如你所见,一个草片段可能占据不止一个单元格。下面是如何在配置中加载新纹理:
[GRASS_FX]
TEXTURE = grass_fx/highlands.dds ; 位于配置文件旁;若未找到,补丁会在其纹理文件夹中查找
TEXTURE_GRID = 8, 3 ; 列数和行数注意有些草叶是明亮的绿色。这是告诉 CSP 使用表面颜色的方式:将红色和蓝色通道设为黑色,使用表面颜色和绿色通道作为亮度/AO 值。如果你不想让草取表面颜色,请使用常规颜色而非明亮绿色。另外,确保颜色通道在透明区域之外继续存在:将 alpha 分离到自己的通道,切换到 RGB 通道并确保颜色延续,否则 MIP 层会出问题。
加载自定义纹理后,你可以定义最多四个自定义纹理组。每个组最多包含八个自定义草片段,而那些 A/B/C/D 草配置以及基础 [GRASS_FX] 配置都可以为不同的草纹理组设置各自的生成几率。
下面是一个组的示例:
[GRASS_FX_TEXTURE_GROUP_0]
; 列索引从 1 开始,但行索引从 0 开始!
PIECE_0 = 1, 1 ; 第一个片段从单元 (1, 1) 开始,该片段有一朵黄色小花
PIECE_1 = 2, 1 ; 第二个片段,也占单元格
PIECE_2 = 1, 2, 2, 1 ; 第三个片段,有黄白两朵花,占 2×1 格
PIECE_2_CHANCE = 0.1 ; 出现概率为前两个片段的十分之一
PIECE_3 = 3, 1, 1, 2 ; 占 1×2 格的片段,带紫色花
PIECE_3_CHANCE = 0.01 ; 出现概率为 100 分之一
PIECE_3_SIZE_MULT = 1.2, 2 ; 默认大小乘数基于单元格大小,覆盖此值
PIECE_3_WIND = 0.5 ; 更少受风影响(默认值为 1)并使用如下方式将纹理组赋给配置:
[GRASS_FX_CONFIGURATION_A]
TEXTURE_BASE_CHANCE = 1 ; 常规草生成的概率
TEXTURE_GROUP_0_CHANCE = 0.2 ; 第一个纹理组的生成概率
TEXTURE_GROUP_1_CHANCE = 0.1 ; 第二个纹理组的生成概率
; 然后这样使用它:
[GRASS_FX_ADJUSTMENT_...]
MATERIALS = grass, top2
MAP=A重要提示:自定义类型的草只影响第三代及以后的生成通道,因此用户仍会在附近看到大量常规草。这样,一些复杂的高草或灌木不会在几米外就消失。
关于半透明草
默认情况下,Grass FX 的程序化草不会在 G-buffer 中渲染,从而几乎将时间减少一半。在大多数草矮且表面为漫反射的赛道上,这没问题,但在一些有高草或其后面有反射表面(如水面)的赛道上,草可能会显得有瑕疵和透明。要修复此问题,请使用:
[EXTRA_FX]
FORCE_GRASSFX_GBUFFER_PASS = 1在 Extra FX 设置中也有一个选项可以为所有赛道启用该通道。