Skip to content

通用 - 过滤

汉化标题:通用 - 过滤
原文标题:General - Filtering
汉化更新时间:2026-01-14 13:34:25 +0800
英文原文最新更新时间:2022-06-13 01:18:53 +0300

若要定义光序列、材质调整,或例如发光物体,配置需要指定一个要使用的实体。在大多数这些情况下,您也可以设置一个对象列表:

ini
[EMISSIVE_LIGHT_0]
MESHES = mesh0, mesh1, mesh2
...

Masking

为简化操作,您还可以使用简单的掩码。您可能注意到 Windows 如何使用"*"表示"任意数量的任意符号"?出于兼容性原因,Patch 使用"?"达到同样的目的。

ini
[EMISSIVE_LIGHT_0]
MESHES = mesh?  ; 也将包括任何其他以"mesh"开头的网格,如 mesh_99
...

Properties

也支持按属性过滤,并在需要时使用掩码:

ini
[SHADER_REPLACEMENT_0]
MESHES = texture:cobbles_?.dds
SHADER = nePerPixelMultiMap_parallax
...

请不要在":"前后添加空格,它的灵活性不如 CM 的过滤。

已知的属性和例子

  • Meshes:
    • material:Material #91: 材质名称;
    • renderable:yes: 网格是否可渲染;
    • transparent:yes: 网格是否标记为透明;
    • hasLodDistance:yes: 对于赛道,是否设置了任何 LOD 距离;
    • mirror:yes: 网格是否分配给后视镜(在 0.1.62 中添加)。
  • Nodes and meshes:
    • parent:COCKPIT_?R: 父节点名称;
    • child:some_mesh: 子节点之一的名称;
    • lod:A: 对于车辆,指定 LOD(用于扩展过滤;参见示例);
    • active:yes: 节点是否处于活动状态(在 0.1.62 中添加);
    • insideInterior:yes: 节点是否在内部(在 0.1.62 中添加);
    • insideSteeringWheel:yes: 节点是否在方向盘内(在 0.1.62 中添加);
    • first:yes: 网格是否为第一个子节点(在 0.1.62 中添加);
    • last:yes: 网格是否为最后一个子节点(在 0.1.62 中添加)。
    • modelRoot:yes: 网格是否为最后一个子节点(在 0.1.62 中添加)。
  • Meshes and materials:
    • shader:ksPerPixel?: 着色器名称;
    • texture:NULL.dds: 如果至少有任何使用的纹理匹配该名称则为真(不区分大小写);
    • materialProperty:dirtyLevel: 检查着色器是否具有特定属性;
    • materialResource:txBlur: 检查着色器是否具有特定资源;
    • supportsDamage:yes: 检查着色器是否支持损坏;
    • alphaBlend:yes: 材质是否启用 Alpha 混合(在 0.1.62 中添加);
    • alphaTest:yes: 材质是否启用 Alpha 测试(在 0.1.62 中添加);
    • vegetation:yes: 植被着色器,如树或草(在 0.1.62 中添加);
    • dynamic:yes:"移动"着色器,如树、草或旗帜(在 0.1.62 中添加)。

自 0.1.62 起,对于像 parent:… 这样的内容,您也可以在其中使用属性,而不仅仅是名称。例如,如果您要移动赛道网格使其最后渲染,这里有一段 Hong 配置:

ini
[SHADER_REPLACEMENT_...]
MATERIALS = decal_01, decal_02, decal_solids
MOVE_MESH_BEHIND = parent:modelRoot:y

(只是为了澄清,MOVE_MESH_BEHIND 的工作方式是,它会找到所有具有给定过滤器的节点和网格,然后移动原始网格,使其在找到的网格之后渲染。过滤器 parent:modelRoot:y 找到赛道根节点中的所有子节点,因此 MOVE_MESH_BEHIND 将贴花移动到最后一个赛道网格之后。添加它更多是作为给自己的注释,因为我刚刚被它搞混了。)

Extended filtering

v0.1.25-preview183 起,现在支持扩展过滤,具有逻辑表达式、分组等。为此,首先用大括号将查询括起来,以指出它是扩展过滤器。其他一切与 CM 中的过滤非常相似:

ini
[REFLECTIONS_FX]
MASK_CUBEMAP_SKIP = MIRROR_GEO, { GEO_INT? & parent:COCKPIT_HR }  ; 您可以像以前一样在同一位置列出常规查询

我建议使用引号来分隔扩展查询,如果想要使用任何特殊符号,请在其中将单独的关键字用不同的引号括起来:

ini
[MESH_ADJUSTMENT_...]
MESHES = '{ "some mesh^4" & !shader:ksPerPixel }'  ; 空格是可选的,但它们有帮助
...

支持的表达式按优先级从高到低排列(当然,您可以使用括号"("和")"来更改顺序):

  • ! A: 表示 NOT,如果 A 不匹配则匹配;
  • A & B: 表示 AND,如果两边都匹配则匹配;
  • A ^ B: 表示 NOR,如果 A 或 B 匹配但不同时匹配则匹配;
  • A | B: 表示 OR,如果至少 A 或 B 匹配,或两者都匹配则匹配。

我认为在超过 99% 的情况下,不需要这个东西,但有时它真的可以有所帮助。例如,让我们看看 Highlands 配置,通过 165 MB 的替换 KN5 添加发光窗口。有时它可能会损坏或加载失败,没有它,更改"ksEmissive"会使整个建筑物发光,而不仅仅是窗口。但扩展过滤允许重写它:

ini
[MATERIAL_ADJUSTMENT_2]
MATERIALS = '{ ( buildings_ext2, Gazebo_Tent ) & shader:ksPerPixelMultiMap_emissive }'
KEY_0 = ksEmissive
...

不再有发光的建筑物,因为它只在着色器更改为"ksPerPixelMultiMap_emissive"时才起作用。

Examples

  • 从 LOD A 中获取 mesh1,从 LOD B 中获取 mesh2(以防 LOD B 中有错误的 mesh1,LOD A 中有错误的 mesh2),对于车辆:

    ini
    MESHES = '{ lod:A & mesh1 }', '{ lod:B & mesh2 }'

Features to add later

  • 更多用于过滤的属性。