汉化标题:车辆 – LED 面板
原文页面:Cars-–-LED-panels
原文锚点:dce83dd
汉化时间:2026-09-12T00:00:00+08:00
译注:mask 译作「蒙版」;原文TEXT角色的示例代码块缺少闭合围栏,译文已补全
LED 面板可用于制作那些显示比赛名次和车手姓名、并不时闪烁的部件。
与原版的 “digital_panels.ini” 不同,该选项在回放中也能工作(此外,它还支持任何其他输入类型)。但最主要的区别在于它使用动态纹理而非悬浮数字,因此能更好地贴合弯曲表面,也不需要为数字摆放设置专门的父级节点。
重要说明
在继续之前,我想先深入讲讲它的工作原理和用法。它的原理是动态纹理:背景透明,数字或字母使用指定的颜色。这意味着有两种实现方式:
可以复制底层网格,把新网格稍微移开一点,将动态纹理指定到它的
txDiffuse槽位,设为自发光并将混合模式设为 alpha test。这是最简单的做法,但会增加一次绘制调用,需要修改模型,而且总体上显得相当凑合。不过还有另一种办法。或者,可以使用
ksPerPixelMultiMap_emissive着色器,并将动态纹理指定到txEmissive槽位!替换着色器不需要改动模型,一个简单的[SHADER_REPLACEMENT_...]调整就能很好地完成。这样就完全不用编辑任何模型了。你可能会疑惑:txDiffuse叠加到最终自发光上、破坏 LED 的形状,这怎么行——好消息是,有一个参数可以禁用这种txDiffuse的干扰!
语法
[LED_PANEL_...]
MESHES = RSS_EXT_LED_Panel ; 目标网格
TEXTURE_SLOT = txEmissive ; 目标纹理槽位
RESOLUTION = 1024, 512 ; 新生成纹理的分辨率
MASKS_PACK = lumirank_font.zip ; LED 蒙版包的名称
DIGIT_0 = 22, 47, 312, 455 ; 第一个数字的 X、Y、宽度和高度
DIGIT_1 = 353, 47, 312, 455 ; 第二个数字的 X、Y、宽度和高度
DIGIT_2 = 692, 47, 312, 455 ; 第三个数字的 X、Y、宽度和高度
; 可以按需设置任意多个数字
BASE_COLOR = '#ffffff', 0.5 ; 基础颜色(未闪烁时)
FLASHING_COLOR = '#ffffff', 1 ; 闪烁时使用的颜色
FLASHING_APPLY_MASK = 1 ; 闪烁时是否应用蒙版
BLANCPAIN_FLASHING_PERIOD = 1 ; Blancpain 闪烁:周期,单位为秒
BLANCPAIN_FLASHING_DURATION = 0.2 ; 熄灭持续的时间,单位为秒
BLANCPAIN_FLASHING_RACE_CLASS = AM ; 比赛组别(仅对该组别的领跑者闪烁)
N24_FLASHING_PERIOD = 3.5 ; N24 闪烁:周期,单位为秒
N24_FLASHING_TIME = 1.2 ; 闪烁持续的时间,单位为秒
N24_FLASHING_FREQUENCY = 6 ; 闪烁频率,单位为 Hz
N24_FLASHING_ACTIVE_SHARE = 0.7 ; 闪烁期间处于点亮阶段的时间占比
ROLE_0 = DRIVER_NAME ; 第一个角色
ROLE_1 = POSITION ; 第二个角色
; 可以按需设置任意多个角色
ROLE_DURATION = 3 ; 每个角色持续的时间,单位为秒关于 LED 蒙版与 MASKS_PACK
蒙版是黑白纹理,用白色区域标记需要发光的地方。它们与 texture\display_panel 中使用的纹理非常相似(只不过它们会被绘制到动态纹理上,而不是出现在 3D 空间中)。不过,由于现在还可以使用字母,它们多了一项额外的特性,以便在比赛期间节省磁盘空间和显存。你可以准备一张包含所有 LED 的高分辨率蒙版,然后为字母和数字制作分辨率低得多的蒙版,只需大致覆盖目标 LED 所在的区域即可。这能在不牺牲任何质量的情况下节省大量字节,甚至可能让蒙版的制作变得更简单。这里有一个示例蒙版包,来自 RSS GT-M Bayro 6(感谢 Scott Shaw 允许将其用作示例)。
那么,换句话说,它的工作方式如下:
- 要渲染字母 “A”,CSP 会打开
MASKS_PACK中指定的 ZIP 压缩包并查找 “base/a.dds”; - 它还会查找 “mask.dds”;
- 若找到蒙版,则以正片叠底(multiply)模式渲染二者;
- 否则,只使用 “base/a.dds”。
闪烁阶段的做法类似:
- 要渲染字母 “A”,CSP 会查找 “flashing/a.dds”;
- 若该处不存在任何文件,则使用 “flashing_fallback.dds”;
- 若
FLASHING_APPLY_MASK设为 1,则会像非闪烁阶段一样使用蒙版; - 否则,直接使用纹理,如同蒙版不存在一般。
关于角色
目前有三种类型的角色:
DRIVER_NAME:打印车手姓名(与名牌等处显示的相同),必要时缩写:iniROLE_0 = DRIVER_NAMETEXT:打印在对应参数中设置的静态文本:iniROLE_0 = TEXT ROLE_0_TEXT = HELLO WORLD其他任何内容都会被当作输入处理,与 CSP 数字仪表等类似:
iniROLE_0 = GAS ROLE_0_INPUT_MULT = 999注意,常规的 “INPUT_…” 参数在这里都带有对应的 “ROLE_N_” 前缀。除此之外,用法与平时完全一样,支持 LUT、延迟等。
另一个重要细节:默认情况下,数字格式会带前导零,可以用下面这个来改变:
iniROLE_0_NUMBER_FORMAT = 3.0
关于 ksPerPixelMultiMap_emissive 与着色器替换
下面是用配置更换着色器并让其发光的一个示例:
[SHADER_REPLACEMENT_...]
MATERIALS = LED_Panel
SHADER = ksPerPixelMultiMap_emissive
FILL_MISSING_TEXTURES = 1
PROP_... = emSkipDiffuseMap, 1
PROP_... = ksEmissive, 100, 100, 100有关这套机制的更多信息,请看这里。
一些技巧
- 如果想让闪烁颜色更亮,只需降低基础颜色的亮度并提高自发光强度;
- 如果纹理槽位中原有旧纹理,数字会绘制在其上;
- 如果使用
txEmissive方案,将分辨率设置得比 txDiffuse 的分辨率低一些也许是合理的,可以稍微节省显存和性能。