发光贴图

本节的大部分内容由社区成员 DaddelZeit 撰写。感谢您的协作!♡

发光贴图(glowMaps)允许你根据一个数值在多个材质 之间切换。

发光贴图最常见的用途就是车辆灯光,也因此得名。这包括前照灯、尾灯、仪表灯等。在这些情况下,发光贴图用于将灯光材质切换为自身对应的发光材质。关于灯光材质的更多信息请参见此页面。 然而,发光贴图也可以应用在任何需要动态更换材质的场景中。

语法

与大多数其它 Jbeam 部分不同,glowMap 部分不是一个表,而是一个字典。键(key)为建模软件中设置的相关材质名称,值(value)为另一个字典。该字典中可以包含多个不同的字典(后文会进行说明),并有三个被称为“材质槽”的值,分别以"off"、“on"和"on_intense"为键。它们的值分别是在 simpleFunction 或 advancedFunction 计算结果基础上,部件将使用的不同材质。

"glowMap":{
  "taillights":{
    "simpleFunction":{"lowhighbeam":0.49,"brake":0.49}, "off":"lights", "on":"lights_on", "on_intense":"lights_on_intense"
  },
}

虽然 glowMaps 支持使用与其自身键名相同名称的材质,但建议避免这样做,以防游戏后续更新导致意外行为。作为 glowMap 键定义的材质通常不需要在车辆的 materials.json 文件中手动添加,因为它会为每辆车自动生成。不过,对于位于 “common” 文件夹下的材质,由于它们不是专属单个车辆,而是被所有车辆共享,因此仍然需要在 materials.json 中定义。为此,可以使用虚拟材质

可用材质槽

每个 glowMap 支持 3 个可切换的材质槽,分别为 “off”、“on” 和 “on_intense”。模式切换原理是将多个输入值乘以各自的系数后相加。如果总值小于 0.0001,则 glowMap 处于 “off” 状态;在 0.0001 到 0.5 之间则为 “on” 状态;大于等于 0.5 时为 “on_intense”。函数结果可以大于 1。

状态
要求
状态
off
要求
数值小于等于 0.0001
状态
on
要求
数值大于 0.0001 且小于 0.5
状态
on_intense
要求
数值大于等于 0.5
仅当指定了 “on_intense” 时才会启用该状态,否则会使用 “on” 状态。

GlowMap 数值计算

一个典型的车辆 glowMap 配置如下所示:

"glowMap":{
  //外部灯光
  "signal_L": {"simpleFunction":{"signal_L":0.49},             "off":"light","on":"light_on","on_intense":"light_on_intense"},
  "signal_R": {"simpleFunction":{"signal_R":0.49},             "off":"light","on":"light_on","on_intense":"light_on_intense"},
  "taillight":{"simpleFunction":{"lowhighbeam":0.49,"brake":1},"off":"light","on":"light_on","on_intense":"light_on_intense"},
  "chmsl":    {"simpleFunction":{"brake":100},                 "off":"light","on":"light_on","on_intense":"light_on_intense"},
  "foglight": {"simpleFunction":{"fog":1},                     "off":"light","on":"light_on","on_intense":"light_on_intense"},
  "headlight":{"simpleFunction":{"lowbeam":0.49,"highbeam":1}, "off":"light","on":"light_on","on_intense":"light_on_intense"},
  "reverse":  {"simpleFunction":{"reverse":0.49},              "off":"light","on":"light_on","on_intense":"light_on_intense"},
  //表盘表面和指针
  "gauges": {"simpleFunction":{"lowhighbeam":0.6}, "off":"gauges","on":"gauges_on"},
  //gauge lights
  "signal_L":    {"simpleFunction":"signal_L",     "off":"invis", "on":"decals_gauges"},
  "signal_R":    {"simpleFunction":"signal_R",     "off":"invis", "on":"decals_gauges"},
  "checkengine": {"simpleFunction":"checkengine",  "off":"invis", "on":"decals_gauges"},
  "hazard":      {"simpleFunction":"hazard",       "off":"invis", "on":"decals_gauges"},
  "battery":     {"simpleFunction":"battery",      "off":"invis", "on":"decals_gauges"},
  "highbeam":    {"simpleFunction":"highbeam",     "off":"invis", "on":"decals_gauges"},
  "parkingbrake":{"simpleFunction":"parkingbrake", "off":"invis", "on":"decals_gauges"},
  "lowfuel":     {"simpleFunction":"lowfuel",      "off":"invis", "on":"decals_gauges"},
  "abs":         {"simpleFunction":"abs",          "off":"invis", "on":"decals_gauges"},
}

整个 glowMap 功能都依赖于车辆 Lua 电气数值。可参考这里 获取可用的默认数值列表。需要注意的是,大多数这些数值通常仅为 0 或 1,但部分数值可能会取 0 到 1 之间的任意值。例如 “brake” 等于制动输入,也就是说其数值可以是 0 到 1 之间的任意数值。在设置各函数的权重时请注意,以确保其行为符合预期。

glowMap 的数值可以通过以下三种方式进行计算:

  • 通过 simpleFunction 的二元形式,直接取单个电气数值
  • 通过 simpleFunction 的复合形式,将多个电气数值乘以权重后相加
  • 通过 advancedFunction,直接使用一段 Lua 代码片段进行计算

simpleFunction(二元)

如果 “simpleFunction” 参数被设为字符串,则该字符串应是某个电气数值的名称。此时 glowmap 数值会直接赋值为此电气数值本身,无需任何修改或计算。例如,下方 glowMap 在未踩制动时会使用 “off” 材质,一旦踩下制动则会切换到 “on” 状态。

"glowMap":{
  "brakelights":{"simpleFunction":"brake", "off":"lights", "on":"lights_on"},
}

复杂 simpleFunction

“simpleFunction”参数也可以是一个字典,其中包含电气数值的名称,每个名称对应一个系数,代表它们对 glowmap 数值的加成。支持负数修正,结果也可以大于 1。这种方法是 glowmap 数值计算中最常见的一种。例如,下面的 glowmap 配置将在关闭灯光且未踩刹车时使用“off”材质,只要灯光或刹车其中之一被激活,则切换为“on”状态;两者都激活时,则切换为“on_intense”状态。若未定义“on_intense”,则会继续使用“on”状态。

"glowMap":{
  "taillights":{
    "simpleFunction":{"lowhighbeam":0.49,"brake":0.49}, "off":"lights", "on":"lights_on", "on_intense":"lights_on_intense"
  },
}

需要注意的是,在此特定情况下,lowhighbeam 一直是 0 或 1,而 brake 等于刹车输入值,这意味着该数值可以是 0 到 1 之间的任意值。

进阶示例

下面这个 simpleFunction 实现了 DRL 与转向灯的联合 glowmap 效果。

当发动机启动时,“running” 设为 true,会向 glowmap 数值加 0.49,并切换至 “on” 状态。
当右转向灯被激活时,“signal_right_input” 设为 true,会从 glowmap 数值中减去 1,即使 “running” 为 true,此时也会强制采用 “off” 材质。
“signal_R” 根据定时器周期性开启与关闭,从而实现闪烁效果。当其激活时,会向 glowMap 数值加 2,使其数值超过 0.5。

"glowMap":{
  "running_signal_R":{
    "simpleFunction": {
      "signal_right_input": -1,
      "running": 0.49,
      "signal_R": 2
    },
    "off":"lights", "on":"lights_on", "on_intense":"lights_on_intense"
  },
}

advancedFunction(高级函数)

advancedFunction 支持直接使用一段 Lua 代码片段来计算其值。这使你可以无需外部 Lua 模块,直接控制 glowmap。这一功能不常用,最简单的用途就是实现档位显示。此方法需要一个包含以下键的字典:

table/dictionary
type
在以下 Lua 函数中使用到的所有 electrics 数值的列表

如果只使用一个数值,可以用表(数组)语法:

"triggers":["gear"],

如果有多个数值,则使用字典(对象)语法。每个数值都需要在 advancedFunction 中有唯一的键,但这些键的名称不会被处理环节读取,因此随意取即可:

"triggers":{"1":"gear","2":"gearIndex"},

如果只有一个数值,也可以将键设置为空字符串来省略键名:

"triggers":{"":"gear"},
string
type
要使用上述数值执行的 Lua 代码

这段 Lua 代码将被包裹在一个 return 语句里,并且最终必须返回一个数字。你可能需要用 Lua 的 三元运算符 来将布尔值转为数字。

需要注意,语法页面 有关于允许使用的运算符内建函数 的详细说明,具体可查阅。

例如,下面这个 advancedFunction 就会在选中停车档(P 档)时切换为“on”状态。

"glowMap":{
  "citybus_transmission_DSP_P": {
    "advancedFunction":{
      "triggers":{"":"gear"}, "cmd":"gear=='P' and 1 or 0"
    },
    "off":"invis""on":"citybus_transmission_DSP"
  },
}

这个例子会在变速箱处于 2 挡时切换为 “on” 状态。

"glowMap":{
  "citybus_transmission_DSP_2": {
    "advancedFunction":{
      "triggers":{"":"gearIndex"}, "cmd":"gearIndex==2 and 1 or 0"
    },
    "off":"invis", "on":"citybus_transmission_DSP",
  },
}
进阶示例

这个 advancedFunction 仿真了上面高级示例中 DRL/转向灯 simpleFunction 的行为。

"glowMap":{
  "running_signal_R":{
    "advancedFunction":{
      "triggers": {
        "1": "signal_right_input",
        "2": "engineRunning",
        "3": "signal_R"
      },
      "cmd": "engineRunning*0.49 + signal_R*2 - signal_right_input"
    }
  }
}

材质渐变(Material transitions)

为了实现更逼真的卤素灯和密封光束灯效果,可以定义灯光状态之间的渐变过渡。

其原理是通过smoother (平滑函数)动态改变发光材质的emissiveFactor (发光系数)。在 glowMap 部分,这可以通过调用电气 模块中定义的特殊电气值 来实现,并指定 “on” 状态下材质 emissiveFactor 达到最大值时的阈值(通过 “materialEmissiveScaling” 参数设定)。

"glowMap":{
  "sealedbeam_auxlight": {
    "simpleFunction":{
      "foglight_filament":0.49
    }, 
    "off":"sealedbeam", "on":"sealedbeam_on", "materialEmissiveScaling":{"on_max":0.49}
  },
  "sealedbeam_auxlightglass": {
    "simpleFunction":{
      "foglight_filament":0.49
    }, 
    "off":"sealedbeam_glass", "on":"sealedbeam_glass_on", "materialEmissiveScaling":{"on_max":0.49}
  },
}

也可以像标准电气函数一样配置多个输入值。由于材质 emissiveFactor 可动态变化,这里无需单独设立 “on_intense”(高亮)状态——“on” 就可作为最大值状态,中间的渐变则对应灯光由 “off” 到 “on” 的过渡。

"glowMap":{
  "sealedbeam_headlight": {
    "simpleFunction":{
      "lowbeam_filament":0.49,"highbeam_filament":1
    }, 
    "off":"sealedbeam", "on":"sealedbeam_on_intense", "materialEmissiveScaling":{"on_max":1}
  },
  "sealedbeam_headlightglass": {
    "simpleFunction":{
      "lowbeam_filament":0.49,"highbeam_filament":1
    }, 
    "off":"sealedbeam_glass", "on":"sealedbeam_glass_on_intense", "materialEmissiveScaling":{"on_max":1}
  },
}
上一次修订: 五月 20, 2026

还有其他问题?

加入我们的 Discord 服务器
Our documentation is currently incomplete and undergoing active development. If you have any questions or feedback, please visit this forum thread.