Skip to content

车辆 – 多通道发光

汉化标题:车辆 – 多通道发光 原文标题:Cars – Multichannel emissives 汉化更新时间:2025-01-14 00:00:00 +0800 英文原文最新更新时间:2022-06-13 01:18:53 +0300

这可能是一个特别长的解释,抱歉。我不擅长写这些,所以我会一步步解释,希望这样会有点帮助。

第一部分,它是什么?

首先,它是用来做什么的?最初,如果我们想为灯光、仪表板指示器、制动信号等制作发光网格,必须将单独的发光部分分离成单独的网格。当我们只使用前大灯、制动灯和几个仪表板灯时,这还不错,但现在有了自定义着色器补丁,还有转向灯、倒车灯、几十个新的仪表板指示器等等。分离所有这些网格变得很无聊,而且渲染成本很高,因为每个新网格都是一次新的绘制调用。

这就是多通道发光发挥作用的地方。不再是分离,现在单个网格可以拥有多达四个不同的发光区域,或者对称情况下多达七个(例如,允许将尾灯、制动灯、倒车灯和两个转向灯绑定到一个网格上)。或者对于仪表板网格的特殊情况,多达 25 个不同的区域,用于所有那些图标。

所有这些灯都是在没有任何网格分离的情况下设置的,使用简单的配置,通过这些多通道发光。

第二部分,新的 …_emissive 着色器:

这就是一切开始的地方:Stereo 有一个想法,添加新的 ksPerPixelMultiMap_emissive 着色器,类似于 ksPerPixelMultiMap,但有一个单独的 txEmissive 纹理槽,用作发光颜色的彩色遮罩。最初,发光颜色将是发光参数 ksEmissive 的颜色乘以给定点的漫反射颜色。现在,还有一个来自 txEmissive 的额外颜色层,允许创建 neat 的东西,比如只让建筑的窗户发光而不分离它们。

第三部分,该着色器的新 emChannelsMode 参数:

这个新参数是整个多通道发光事物的主要部分。现在,着色器 ksPerPixelMultiMap_emissive(和其他)有了额外的 ksEmissive1ksEmissive2ksEmissive3 通道。默认情况下它们不会改变任何东西,但将 emChannelsMode 设置为 1,然后:

  • txEmissive 的红色通道将用作 ksEmissive 的遮罩;
  • 绿色通道将用作 ksEmissive1 的遮罩;
  • 蓝色通道将用作 ksEmissive2 的遮罩;
  • Alpha 通道将用作 ksEmissive3 的遮罩。

所以,如果你正在制作比如说一辆新车,不再需要在几块中分离网格,你现在只需绘制一个自定义的 txEmissive,并在红色通道中制作遮罩制动灯,在绿色通道中制作尾灯,在蓝色通道中制作倒车灯,在 alpha 通道中制作转向灯,就是这样!当然,你也可以让它模糊或类似的东西,以向边界添加一些很好的衰减。

如何使用它

有两种通用的使用方法。

  • 如果你正在制作新车并为其创建新的 txEmissive,最简单的方法可能只是为 ksEditor 甚至原版 AC 安装这些新的着色器。你可以从这里(查看顶部的 X releases 链接)下载它们;
  • 或者,你可以使用配置来程序化地定义区域。不需要额外的纹理,并且包含 common/custom_emissive.ini 模板可以使工作更容易。但我认为如果你正在制作新车,创建一个小的 txEmissive 纹理可能更容易、更灵活,并且可能会产生更好的结果。

镜像

左右转向信号应该是独立的,如何将所有这些适应四个通道?嗯,这些网格通常是对称的,所以我们在这里可以做的就是,我们可以在纹理的 alpha 通道中高亮两个转向灯(用于 ksEmissive3),然后启用一个特殊参数 emMirrorChannel3As4,将其设置为 1。然后,着色器将对位于汽车右侧的网格部分使用 ksEmissive4 而不是 ksEmissive3

不过这里要考虑的另一件事:它可能在定位汽车右侧时出现问题。它将使用相对网格坐标,所以如果你的网格很好地对齐,X 轴指向应该指向的方向,枢轴在中间,它将毫无问题地工作。否则,你将不得不调整镜像参数。其中有两个:

  • emMirrorDir:镜像应该发生的方向。设置为 (1, 0, 0) 以进行默认的左右镜像。但同样,该方向是相对于网格方向的(第一个值是用于 X,第二个用于 Y,第三个用于 Z);
  • emMirrorOffset:镜像的偏移量。例如,那个带有左/右转向灯的仪表板部分在这里可能需要一个值,比如 0.5,所以镜像平面将在指示器之间。

其他参数

  • emSkipDiffuseMap:设置为 1 以在计算发光颜色时不考虑漫反射颜色。有了它,你可以让黑色表面发光!当然,你也可以将它与设置为 0 的 emChannelsMode 一起使用,所以 txEmissive 将设置颜色。
  • emAlphaFromDiffuse:默认情况下,着色器将从 txNormal 获取 alpha,其行为类似于 ksPerPixelNM。将此参数设置为 1,它将从 txDiffuse 获取 alpha。

如何在配置中使用这些通道

对于赛道,正如你可能想象的那样,它尽可能简单。只需在你的 MATERIAL_ADJUSTMENT 部分中使用不同的变量名称:

ini
[MATERIAL_ADJUSTMENT_...]
MESHES = windows
CONDITION = WINDOWS_GLOW_1
KEY_0 = ksEmissive1
VALUE_0 = 10, 10, 5, 1

[MATERIAL_ADJUSTMENT_...]
MESHES = windows
CONDITION = WINDOWS_GLOW_2
KEY_0 = ksEmissive2
VALUE_0 = 10, 10, 5, 1

; 如果条件不同,各种窗户将在不同时间亮起

汽车通常使用 [EMISSIVE_...] 部分,这些部分现在有一个用于这个事物的新参数:

ini
[EMISSIVE_HIGHBEAM_...]
NAME = GEO_Frontlight_Inner_Glass
COLOR = 400, 330, 280, 0.2
CHANNEL = 1  ; ksEmissive 的默认值为 0;这里 1 用于 ksEmissive1
LAG = 0.8
LOCATION = FRONT

至于汽车的 BOUND_TO 值,将灯连接到发光,你可以像这样连接到特定通道:

ini
[LIGHT_EXTRA_...]
BOUND_TO = GEO_Frontlight_Inner_Glass:1

间奏

就是这样!如果你正在制作自己的汽车,你可以在这里停下来,只需在不同通道中绘制带有遮罩的 txEmissive 并在 ksEditor 中设置它,它将很好地工作。很好很简单。

不过还有更多,这就是为什么我把它分成几部分。对于我们这些人中不想绘制纹理并且希望用几行配置设置所有内容的人,就像我一样。还有一个好处是能够更快地设置像转向灯这样的东西,或者使用每个网格最多 25 个发光的东西。

第四部分,用于遮罩的 custom_emissive.ini

有时绘制 txEmissive 并不是真的合适。例如,如果它是已经存在的汽车的配置。为此,着色器有一堆选项可以在没有该纹理的情况下操作,使用各种类型的区域作为遮罩。但为了更快地工作,着色器期望这些选项以某种预先计算的形式到达,手动预先计算它们将是浪费的。这就是 INIpp 派上用场的地方,有一堆模板准备做大部分工作。

要使用这些模板,首先开始包含它们的文件:

ini
[INCLUDE: common/custom_emissive.ini]

此文件可用于汽车和赛道,虽然从现在开始,我将主要描述汽车。赛道是一样的,但更简单。

然后,你可以像这样使用它:

ini
[CustomEmissive]
Meshes = turning_lights
Resolution = 1024, 1024
@ = CustomEmissive_Rect, Channel = 3, Mirror, Start = "10, 865", Size = "480, 165"
@ = TurningLightsFront, Channel = 3

这个特定部分就是为标致 504 设置前转向灯所需的全部(不太确切,这里为了举例简化了),包括发光部分和光源。现在,让我们逐行进行:

  • [CustomEmissive]:这就是使用 INIpp,模板被使用的方式。这个东西将自己展开到一个新的 [SHADER_REPLACEMENT_...] 部分,替换着色器,填充缺失的纹理并设置所有基本参数,例如,将 emMirrorDir 设置为默认 (1, 0, 0)

  • Meshes = turning_lights:设置要替换着色器的网格列表。如果需要,你可以使用多个网格。这里有一个技巧:为不同 LOD 中不同名称的网格设置它:

    ini
    Meshes = '{ lod:A & turning_lights_lodA, lod:B & turning_lights_lodB }
  • Resolution = 1024, 1024:纹理分辨率,以像素为单位,宽度和高度。可选参数。如果没有它,任何尺寸、坐标和维度都应该在相对坐标中设置,从 0 到 1。

  • @ = CustomEmissive_Rect, …:默认情况下使用 [CustomEmissive],什么都不会发光,就好像 txEmissive 完全是黑色一样。该行为第三通道定义一个新区域,从 (10, 865) px 开始,大小为 480×165 px。区域也被设置为镜像,所以汽车右侧该区域中的所有内容实际上将是第四通道。

    如果你对奇怪的语法感到困惑,这就是如何在 INIpp 中使用 mixins(@@MIXIN 的简短形式)。Mixings 只是一部分的额外值,所以它们可以被声明一次然后一次又一次地使用。在这种情况下,mixin 被称为"CustomEmissive_Rect":你可以打开"custom_emissive.ini"并在那里找到它。

  • @ = TurningLightsFront, …:这是所有转向灯的 [EMISSIVE_...][LIGHT_...] 的简短形式!这样写节省了很多时间。它将自动设置颜色、光源和其他所有内容。并且 Channel = 3 告诉它将那些转向灯绑定到第三和第四通道(转向灯 mixin 知道只在镜像通道中有意义,所以默认情况下它采用两个,主通道和镜像通道)。这种行为将在第 5 部分中更详细地描述。

在我们深入了解之前还有两件事:

  • 你可以在此存储库中搜索已经准备的配置并将它们用作示例。当然,也可以随时在 AC 中加载它们并弄乱参数。

  • 我建议使用比普通记事本更高级的东西来编辑配置。目前我个人最喜欢的是 Visual Studio Code,免费并有很多扩展。安装这个,将它绑定到某个热键,你将能够在这里直接计算选定的文本,而不需要将其复制到某个计算器。并不是经常需要它,但需要时,节省了很多时间。

基本 [CustomEmissive] 参数

  • Debug(默认值为 0.0):增加以向不同通道添加不同颜色的发光值,以查看什么是什么;
  • MirrorDir(默认值为 (1, 0, 0)):设置镜像的方向;
  • MirrorOffset(默认值为 0.0):设置镜像的偏移量;
  • CompatibleWithPBRGlass(默认值为 0):设置为 1 以使整个事物与 [Material_Glass] 兼容;

[CustomEmissive] 的额外有用的 mixins

  • @ = CustomEmissive_SkipDiffuseMap:跳过漫反射贴图,将 SkipDiffuseMap 设置为 1。

  • @ = CustomEmissive_UseDiffuseLuminocity:特别有用的 mixin,允许将漫反射纹理不作为颜色遮罩应用,而是作为黑白遮罩,并使用不同的逻辑,更像是阈值。例如,它可以允许如果纹理暗于 10%,则停止任何发光。

    参数:

    • SkipDiffuseMap(默认值为 1):如果为 1,将禁用来自漫反射贴图的常规着色贡献;
    • From(默认值为 0.0):最小漫反射亮度,低于该值的任何内容都不会发光,从 0 到 1;
    • To(默认值为 1.0):最大亮度,高于该值的任何内容都将是 100% 亮度,从 0 到 1;
    • Exponent(默认值为 1.0):gamma 以调整 FromTo 之间的梯度如何工作,从 0 到 ∞;
    • Opacity(默认值为 1.0):这个特定阶段的贡献,为 0 时就好像 mixin 不在这里,从 0 到 1;
    • Mask(默认值为 (1, 1, 1, 1)):它应该影响哪些通道;

    如果需要,From 当然可以大于 To,所以就好像漫反射纹理被反转了一样。此外,FromToExponentOpacity 可以不使用单个值,而是使用四个数字,以便对不同通道使用不同参数。

    几乎到处使用,帕加尼 Huayra 配置中的示例,其中它用于仪表板指示器:

    ini
    @ = CustomEmissive_UseDiffuseLuminocity, Mask = "0, 1, 1, 1", Exponent = 4, From = 0.1, To = 0.3
  • @ = CustomEmissive_UseDiffuseAlpha:与 CustomEmissive_UseDiffuseLuminocity 完全相同,但是用于漫反射 alpha 而不是亮度。

  • @ = CustomEmissive_MirrorUV:镜像 UV,如果它在错误的一侧,则将其跨对称线翻转(在某些非常棘手的情况下可能会有帮助)。

    参数:

    • Direction(默认值为 (1, 0)):镜像的方向,垂直于对称线;
    • Offset:以像素或坐标为单位的偏移量,取决于是否设置了 Resolution

    在帕加尼 Huayra 配置中使用:

    ini
    @ = CustomEmissive_MirrorUV, Offset = 612, Direction = "-1, 0" ; 这个技巧允许设置六个仪表板指示器
  • @ = AlphaFromTxDiffuse:将 emAlphaFromDiffuse 设置为 1,以使用来自 txDiffuse 的 alpha 通道。

程序化遮罩

有三种主要的遮罩类型。你可以为每个通道定义每种类型的一个区域。通道从 0 到 3,除了 0 之外的所有通道都可以标记为镜像。

类型有:

  • 颜色遮罩。

    如果纹理允许,这些是最容易使用的。例如,大多数转向灯的遮罩可以像这样设置:

    ini
    @ = CustomEmissive_Color, Channel = 3, Mirror, Color = "1, 0.5, 0"

    其中 (1, 0.5, 0),当然意味着橙色:100% 红色,50% 绿色,0% 蓝色。正如你可以想象的,Color 参数是必需的。其他可用参数:

    • ThresholdLevel(默认值为 0.95):参数越高,纹理颜色必须更接近匹配此遮罩中设置的 Color。从 0 到 1。

    • ThresholdSharpness(默认值为 20.0):降低以使遮罩更平滑,增加以使其更锐利。从 0 到 ∞,虽然我认为,合理的值应该在 1 到 50 之间。

    • ThresholdThresholdLevelThresholdSharpness 的简单别名,采用两个值,第一个是 ThresholdLevel

    • Normalization(默认值为 1.0):如果此值为 1,则不考虑亮度,只比较色调和饱和度。为 0 时,相反,颜色应该完美匹配,所有色调、饱和度和亮度。你可以设置介于两者之间的值。虽然它对转向灯效果很好 —— 有时橙色可能会变暗,但它仍然是转向灯橙色 —— 对于像倒车灯这样的东西,最好降低这个值,所以只有白色会匹配,但不是深灰色区域。

      这就是使用它为标致 504 设置倒车灯的方式:

      ini
      @ = CustomEmissive_Color, Channel = 0, Color = "1, 1, 1", Normalization = 0.5, Threshold = "0.8, 1"
    • Opacity:此值从 0 到 1,改变结果区域的强度乘数。

    还有一个全局参数 ColorInputBlur(默认值为 0.0)用于 [CustomEmissive],允许在通过颜色遮罩传递之前模糊漫反射纹理。它不会影响其他任何东西。

  • 可能带有圆角和模糊边缘的矩形区域。

    自定义着色器补丁在 AC 中添加了一个新应用程序,称为对象检查器。在其纹理选项卡中,它在纹理列表右侧有这些小复选框。点击一个以查看纹理,然后使用鼠标按钮快速高亮区域。这是获取这些坐标和大小的最简单方法。或者,你可以使用 Photoshop 或 XnView(免费图像查看器) 之类的东西来获取这些坐标。在其他一些情况下,当映射特别糟糕时,通过将值减半然后再减半等等,如果区域丢失则切换到另一半,简单地猜测正确的坐标会更容易。这个技巧有助于更快地缩小范围。

    **请注意:**如果你使用像素中的坐标,请设置 Resolution。如果你使用 0…1 坐标,请不要设置 Resolution。你也可以将 Resolution 用作 CustomEmissive_Rect 的参数,以定位其效果。

    这是 Abarth 595 的后转向灯:

    ini
    @ = CustomEmissive_Rect, Channel = 1, Mirror, Start = "0, 264", Size = "206, 142", CornerRadius = "0.25, 0.5"

    StartSize 是必需的,尽管你可以使用 Center 代替 Start 来设置中心点的坐标而不是左上角(使调整大小更容易)。其他可用参数:

    • CornerRadius(默认值为 0.0):一个或两个参数,如果是两个,第一个是用于水平部分,第二个是用于垂直部分。将其设置为 1.0,矩形将变成圆形。如果你有一个尺寸像 (400, 100) 的矩形,那么为了使圆角正确圆形而不是拉伸,水平值必须小四倍,比如 CornerRadius = "0.1, 0.4"。此值还允许设置模糊边缘:在这里获得模糊边缘的唯一方法是使用圆角。

    • Exponent(默认值为 1.0):调整模糊边缘和圆角的锐利度/模糊度的简单方法。从 0 到 ∞,合理的值应该是从 0.1 到,也许,10。值越小,边缘越锐利。

    • Opacity:此值从 0 到 1,改变结果区域的强度乘数。

    还有一些可用的别名,具有预定义的参数:

    • CustomEmissive_Area:完全相同的东西,为了向后兼容而保留;
    • CustomEmissive_Circle:圆形,相同,但具有 CornerRadius = 1Exponent = 0.1 作为默认值,可以重新定义 Exponent
    • CustomEmissive_CoverAll:覆盖整个纹理的区域,用于某些特殊情况。
  • 由四个角点定义的四边形区域。

    类似于矩形区域,要快速设置它们,你可以使用对象检查器。按住 Ctrl 并点击四次以标记区域。并且,关于分辨率的相同说明也适用于此。

    这些计算起来更昂贵,所以我认为只有在没有其他方法有帮助时才使用它们。

    这是标致 504 的后转向灯:

    ini
    @ = CustomEmissive_Poly, Channel = 3, P1 = "390, 500", P2 = "350, 840", P3 = "-20, 840", P4 = "-20, 500", Exponent = 3, Sharpness = 50

    所有四个点,P1P4,都是必需的。其他可用参数:

    • Sharpness(默认值为 1000.0):边缘有多锐利,从 0 到 ∞。

    • Exponent(默认值为 1.0):调整非锐利边缘梯度的简单方法。从 0 到 ∞,合理的值应该是从 0.1 到,也许,10。值越小,边缘越锐利。

    • Offset(默认值为 0.0):某种发光(或收缩)区域,允许添加圆角。你将不得不减小尺寸以使圆角工作。从 -1.0 到 1.0。

    • Opacity:此值从 0 到 1,改变结果区域的强度乘数。

附加顶点遮罩

对于一些额外的令人费解的情况,有第四个选项,顶点遮罩。有时,很少,可能会有一个特别讨厌的网格,没有唯一的 UV 映射。不能用它们做太多事情,但使用 CustomEmissive_VertexMask,可以定义多达四个点,每个通道一个。它的工作方式是,着色器将找到给定网格部分更接近的点并在那里使用相应的通道。你需要为此使用诸如 StartWithWhite = 1@ = CustomEmissive_CoverAll 之类的东西以覆盖所有内容,然后受到 CustomEmissive_VertexMask 的限制。如果未在 CustomEmissive_VertexMask 参数中定义通道的点,该通道将不受影响。野马 2015 后转向灯的示例:

ini
@ = CustomEmissive_VertexMask, Point2 = "0.52, 0, 0", Point3 = "0.8, 0, 0"

点在网格坐标中设置,我发现只是尝试和猜测这些值是最快的。

遮罩如何逐步应用,以及如何更改它

与其制作纹理,有多麻烦,嘿嘿。还有更多。不同类型的遮罩可以以不同方式组合。为了可视化它,请记住整个事情是如何逐步计算的:

  • 首先,着色器获取基本值,默认为 0:什么都不会发光。

    • 可以通过 StartWithWhite = 1 将其更改为 1:然后,一切都会发光。
  • 然后,它计算那些矩形区域。默认情况下它将它们添加到结果中,这意味着 StartWithWhite = 1 将使颜色遮罩无用。

    • 添加 AreasSubtractive = 1,它将从基本值中减去区域。我在宝马 E30 的表盘上使用了这个技巧,给它们这个很好的发光衰减到中间:这只是四个模糊的圆圈,此选项反转了它们:

  • 之后,它计算颜色遮罩。同样,默认情况下它将添加它们。

    • 添加 ColorMasksSubtractive = 1 以减去颜色遮罩;

    • 或者,添加 ColorMasksAsMultiplier = 1,颜色遮罩将作为乘数应用 —— 我经常使用这个,用矩形区域设置一般形状,然后在其上使用颜色遮罩以使其不那么纯色:

  • 下一步,它计算四边形遮罩。类似的事情。

    • 添加 PolysSubtractive = 1 以减去;

    • 或者,添加 PolysMasksAsMultiplier = 1 使其作为乘数。这就是此部分的设置方式,它使用颜色、矩形和四边形遮罩,因为这些灯不是常见的"这里是倒车灯的一块纹理"类型(原始 AC 外观在左侧):

  • 之后,顶点遮罩。默认情况下它们是乘法,其他选项可用:

    • 添加 VertexMaskAdditive = 1 将它们设置为加法模式;
    • 或者,添加 VertexMaskSubtractive = 1 将它们设置为减法模式;
  • 并且,对于最后一步,它将基于漫反射亮度或 alpha 应用遮罩,由 @ = CustomEmissive_UseDiffuseLuminocity@ = CustomEmissive_UseDiffuseAlpha 设置。

重叠或不重叠的遮罩

另一件事,你可以改变遮罩如何相互交互。默认情况下,所有遮罩分别起作用,意味着它们可以重叠,一个区域可以同时充当,比如说,转向灯和倒车灯。但在某些特定情况下,能够通过这些设置改变这种行为很方便:

  • AreasSubtractNext = 1
  • ColorSubtractNext = 1
  • PolySubtractNext = 1

它们几乎完全按照它们说的做:例如,使用 AreasSubtractNext = 1,第二通道中矩形遮罩覆盖的区域将不会受到第一通道中矩形遮罩的影响,即使它覆盖整个纹理。例如,我将其用于标致 504 的后转向灯:

ini
[CustomEmissive]
PolySubtractNext = 1
@ = CustomEmissive_Poly, Channel = 0, P1 = "0, 0", P2 = "1024, 0", P3 = "1024, 1024", P4 = "0, 1024" ; 覆盖所有内容的倒车灯
@ = CustomEmissive_Poly, Channel = 1, P1 = "133, -10", P2 = "178, 328", P3 = "600, 328", P4 = "600, -10" ; 除了带有转向灯的区域

矩形区域作为一个通用遮罩

你看到了那个 E30 仪表板,对吧?那个平滑的圆形背光,几段前?它不会真的那样工作:如果这些区域在减法模式下设置,它们只会减去某个通道的区域。嗯,还有另一种改变它的方法:UseAreasAsMask = 1。有了它,矩形区域将用作整个事物的简单遮罩。还有另一个 mixin 使使用它更简单,@ = CustomEmissive_AreaMask。你甚至不需要用此设置通道,只需使用它最多四次以遮罩整个发光事物。它自动设置 StartWithWhiteUseAreasAsMask。所以这是实际的 E30 配置:

ini
[CustomEmissive]
Meshes = INT_DIALS_SUB0
AreasSubtractive = 1
@ = CustomEmissive_AreaMask, Center = "0.723, 0.273", Size = 0.55, CornerRadius = 1, Exponent = 0.3
@ = CustomEmissive_AreaMask, Center = "0.275, 0.6", Size = 0.55, CornerRadius = 1, Exponent = 0.3
@ = CustomEmissive_AreaMask, Center = "0.116, 0.117", Size = 0.23, CornerRadius = 1, Exponent = 0.3
@ = CustomEmissive_AreaMask, Center = "0.361, 0.117", Size = 0.23, CornerRadius = 1, Exponent = 0.3

为了避免打开图像编辑器并绘制简单的纹理,我愿意深入的程度…… 😅

第五部分,用于行为的 custom_emissive.ini

我想首先说的是,我真正想看到更多的是一些标准化。让我们保持事情相似,我在这里谈论的是像转向灯的光源参数或倒车灯的发光强度之类的东西。如果你认为它们看起来不对,请告诉我,让我们讨论并更改自定义着色器补丁使用的默认设置。或者,也许你的后处理滤镜没有足够的光晕(如 Sol 滤镜) —— 我认为有时可能会发生这种情况,在这种情况下,如果没有标准化,你可能会意外地将其设置得太亮。

所以这就是 custom_emissive.ini 在这方面发挥作用的地方。它基本上有一堆快捷方式可以更容易地设置这些东西,具有现成的值。当然,你仍然可以调整它,包括强度,但我希望你考虑尽可能保持默认值。

所有行为都在 mixins 中定义。你可以将它们附加到 [CustomEmissive] 或不附加,我们稍后会谈到这一点。它们都有这些参数,正如我之前所说的,我希望你真的不需要更改其中的大多数:

  • Color:发光的颜色,最亮值大约 25 用于外部和 20 用于内部灯;
  • Channel(默认值为 0):要附加行为的通道;
  • Intensity(默认值为 1.0):亮度乘数;
  • Lag:平滑开关;
  • Location:灯光位置用于损坏工作,在几乎所有情况下都被正确猜测;

对于可以投射光的行为,如转向或倒车灯,或打开门灯:

  • NotCastingLight(默认值为 0):对于不应该投射光的发光设置为 1(主要用于你会在前部有辅助转向灯等情况);
  • Direction:光方向,三个数字用于向量;
  • Offset:猜测光源位置的偏移量,以米为单位;

转向灯

作为最棘手的,有几种方法可以设置它们:

  • @ = TurningLightsFront:前转向灯;
  • @ = TurningLightsFrontCorner:位于角落的前转向灯,更多向侧面发光;
  • @ = TurningLightsRear:后转向灯;
  • @ = TurningLightsRearCorner:位于角落的后转向灯,更多向侧面发光;
  • @ = TurningLightsRearCombined:对于那些所有东西都是单个网格的前后转向灯(不推荐,因为损坏无法正常工作,在大多数情况下,你仍然可以使用不同的通道将其分割);
  • @ = TurningLightsRearCornerCombined:位于角落的前后转向灯,更多向侧面发光;
  • @ = DashTurningLights:转向灯的仪表板指示器,当然,不投射光。

转向灯也有一些特殊参数:

  • ChannelAlt:右侧通道,默认从 Channel 猜测,但可以手动设置;
  • AnimatedDoors:对于车门后视镜上的转向灯,在此处设置左右门名称;
  • HeadlightsIntensity:转向灯关闭但前大灯打开时的发光强度;
  • BrakingLightsIntensity:转向灯关闭但制动器打开时的发光强度。

其他灯

  • @ = Headlights
  • @ = ParkingLights:后部与前大灯一起激活的那些;
  • @ = BrakingLights
  • @ = ReverseLights
  • @ = FogLights:绑定到额外 A 按钮的前灯;
  • @ = OpenDoorLight:门打开时的灯;
  • @ = LicensePlateLights:不产生任何光,用于那些发光的部分(车牌灯反正单独工作);

将添加更多类型和选项。

仪表板灯

所有仪表板灯 mixins 都基于 @ = DashIndicator mixin,具有这些参数:

  • Input:输入来自此列表
  • InputThreshold:如果输入是数字,这是指示器发光的阈值;
  • InputInverse:设置为 1 以反转阈值逻辑;
  • InputSelectorINPUT_SELECTOR 的别名;
  • OffColor:禁用指示器的颜色;
  • Invert:交换开和关状态;
  • DashHighlight:使用 DashHighlightColor(定义为主 [INCLUDE] 的参数)用于非活动指示器,但打开的灯。

你可以这样使用它:

ini
[CustomEmissive]
Meshes = polymsh118_SUB17
Resolution = 1024, 512
@ = CustomEmissive_Circle, Channel = 2, Mirror, Center = "811, 446.5", Size = 30, Exponent = 0.3
@ = DashIndicator, Input = HANDBRAKE, Channel = 2

默认情况下,颜色将根据输入自动猜测。其他仪表板灯 mixins 以加速设置:

  • @ = DashHighlight:简单的仪表板高亮;
  • @ = DashWarningABS:禁用 ABS 的警告;
  • @ = DashWarningTC:禁用牵引力控制的警告;
  • @ = DashWarningCollision:损坏汽车的警告;
  • @ = DashWarningAirbag:使用安全气囊的警告(由重大碰撞触发);
  • @ = DashWarningEngine:损坏引擎的警告;
  • @ = DashWarningTemperature:温度警告;
  • @ = DashWarningTyrePressure:轮胎压力警告(具有用于阈值的 Pressure 参数,默认为 20);
  • @ = DashWarningSeatbelt:安全带警告(由打开的门和隐藏的驾驶员触发);
  • @ = DashInteriorLight:内部灯的指示器(由打开的门触发);
  • @ = DashEmissiveDisplay:无论什么都总是打开;
  • @ = DashFogLights:雾灯指示器,由额外 A 按钮触发;
  • @ = DashWarningSteering:损坏的转向警告,目前不做任何事情,将在将来更改。

第六部分,单个网格中 25 个仪表板指示器的 custom_emissive.ini

[CustomEmissive] 的替代方案,[CustomEmissiveMulti]。它使用不同的着色器,选项更少。在所有事情中,它只有矩形区域,但它有 25 个!对仪表板非常有用。

以下是如何使用它的示例:

ini
[CustomEmissiveMulti]
Meshes = LIGHT_DASH         ; 目标网格
Resolution = 1024, 512      ; 纹理分辨率用于坐标工作
UseEmissive0AsFallback = 1  ; 使用 ksEmissive(也称为发光通道 #0)用于其他区域未触及的所有地方的发光
@ = DashHighlight           ; 将仪表板高亮绑定到发光通道 #0
@ = MultiItem, Role = TURNSIGNAL_LEFT, Center = "508, 246", Size = 30
@ = MultiItem, Role = TURNSIGNAL_RIGHT, Center = "1004, 246", Size = 30
@ = MultiItem, Role = LIGHT, Center = "504, 279", Size = 30
@ = MultiItem, Role = HIGHBEAM, Center = "508, 310", Size = 30
@ = MultiItem, Role = HANDBRAKE, Center = "1002, 313", Size = 30
@ = MultiItem, Role = ABS_INACTION, Center = "1006, 281", Size = 30
@ = MultiItem, Role = STALLED, Center = "582, 97", Size = 30
@ = MultiItem, Role = DashWarningABS, Center = "983, 377", Size = 30
@ = MultiItem, Role = DashWarningSeatbelt, Center = "559, 120", Size = 30
@ = MultiItem, Role = DashWarningTemperature, Center = "997, 208", Size = 30
@ = MultiItem, Role = DashWarningEngine, Center = "970, 150", Size = 32
@ = MultiItem, Role = DashWarningCollision, Center = "524, 178", Size = 32

注意现在不需要先定义一个区域然后为其附加行为,这一切都在一行中完成。另外,注意 Role:它可以是列表中的输入,或者是第 5 部分中的仪表板灯 mixin。

此外,不需要跟踪发光通道:mixin "MultiItem" 自动计算所有内容并设置它。你可以使用多达 24 个这些 "MultiItem" mixins,然后,如果需要,为通道 #0 设置形状,而不是使用 UseEmissive0AsFallback

提醒一下,你可以使用对象检查器快速找出这些区域的坐标。节省大量时间。

其他选项

  • UseEmissive0AsFallback(默认为 0):设置为 1 以使用其他项目未触及的所有内容作为通道 #0 的遮罩,或设置为 COVER_ALL 以使通道 #0 影响所有内容;
  • SkipEmissiveMap(默认为 1):完全跳过发光贴图;
  • Debug:用不同的颜色突出显示不同的区域。

最后一个提示:你也可以在这里使用 @ = CustomEmissive_UseDiffuseLuminocity@ = CustomEmissive_UseDiffuseAlpha,但与 [CustomEmissive] 不同,它可以为不同通道使用多达四个值,这里限制为两个值。第一个应用于用于指示器的最后 24 个通道,第二个值应用于通道 #0,通常用作背光。例如,这是 Abarth 500 的仪表板:

ini
[CustomEmissiveMulti]
Meshes = LIGHT_DASH
UseEmissive0AsFallback = 1
Resolution = 1024, 512
@ = CustomEmissive_UseDiffuseLuminocity, From = "0.0, 0.2", To = "0.1, 0.3", SkipDiffuseMap = 0
@ = DashHighlight
@ = MultiItem, Role = TURNSIGNAL_LEFT, Center = "508, 246", Size = 30
@ = MultiItem, Role = TURNSIGNAL_RIGHT, Center = "1004, 246", Size = 30
@ = MultiItem, Role = LIGHT, Center = "504, 279", Size = 30
@ = MultiItem, Role = HIGHBEAM, Center = "508, 310", Size = 30
@ = MultiItem, Role = HANDBRAKE, Center = "1002, 313", Size = 30
@ = MultiItem, Role = ABS_INACTION, Center = "1006, 281", Size = 30
@ = MultiItem, Role = STALLED, Center = "582, 97", Size = 30
@ = MultiItem, Role = DashWarningABS, Center = "983, 377", Size = 30
@ = MultiItem, Role = DashWarningSeatbelt, Center = "559, 120", Size = 30
@ = MultiItem, Role = DashWarningTemperature, Center = "997, 208", Size = 30
@ = MultiItem, Role = DashWarningEngine, Center = "970, 150", Size = 32
@ = MultiItem, Role = DashWarningCollision, Center = "524, 178", Size = 32

纹理上一些未被使用的指示器存在问题(有些我未知,有些尚未支持),它们在没有理由的情况下发光令人烦恼。通过将 0.2/0.3 用作仪表板高亮的阈值,我可以阻止它们在禁用状态下自行发光:

结论

如果你一路读到这里,我感到惊讶和印象深刻,如果没有,我完全理解。考虑到我在用英语写东西方面有多糟糕(写这个至少花了四个小时),我希望至少 1/3 有任何意义……如果你有任何关于如何重写它以使其更容易理解的建议,请告诉我。