赛道-–-灯光
汉化标题:赛道-–-灯光
原文标题:Tracks-–-Lights
汉化更新时间:2026-01-14 16:56:42 +0800
英文原文最新更新时间:2022-06-13 01:18:53 +0300
有两种向赛道添加光源的方法:简单地指定带有位置和方向的单个光源([LIGHT_...]),或者使用 [LIGHT_SERIES_...] 基于几何体自动生成一系列灯(例如为每根路灯柱生成一个)。
单个光源的语法
设置单个光源有三种方式。第一种,使用位置和方向(你可以使用 Object Inspector 快速获取位置,只需在任意位置点击并复制坐标):
[LIGHT_...]
POSITION = X, Y, Z第二种是使用网格(mesh),可选地指定以米为单位的偏移。网格会被拆分为若干组,最大的组将作为光源的位置:
[LIGHT_...]
MESH = mesh_name
OFFSET = X, Y, Z ; 可选,位置偏移,单位为米第三种是设置线性光(line light)。它需要起始点和结束点。可选地,你也可以为渐变设置两个颜色:
[LIGHT_...]
LINE_FROM = X, Y, Z
LINE_TO = X, Y, Z
COLOR_FROM = '#ff0000', 2
COLOR_TO = '#00ff00', 3需要说明的是,线性光(尤其是不同颜色的线性光)与真实的面光(area light)行为并不完全相同,请谨慎设置。
三种方式的默认方向均为向下:
DIRECTION = 0, -1, 0灯光序列的语法
使用灯光序列(light series)方法时,光可以从网格生成,或者你可以一次列出一堆位置。下面是直接列出位置的例子,所有灯都将指向下方:
[LIGHT_SERIES_...]
POSITION_0 = X, Y, Z
POSITION_1 = X, Y, Z
POSITION_2 = X, Y, Z
; 以此类推下面是带自定义方向的版本:
[LIGHT_SERIES_...]
POSITION_0 = X, Y, Z
DIRECTION_0 = 1, 0, 0
POSITION_1 = X, Y, Z
DIRECTION_1 = 1, 0, 0
POSITION_2 = X, Y, Z
DIRECTION_2 = 1, 0, 0
; 以此类推要从网格生成灯光,可以列出网格名称或材质(materials)。所有网格会被拆分成若干组,并为每个组创建一个光源。此处也支持可选偏移。下面示例中,灯光默认朝下:
[LIGHT_SERIES_...]
MESHES = lamppost?, glowing_window?
MATERIALS = glowing_material? ; 或者你也可以使用 "MESHES = material:glowing_material?"
OFFSET = X, Y, Z ; 可选,位置偏移,单位为米和往常一样,你可以用 DIRECTION 设置自定义方向。不过,[LIGHT_SERIES_...] 与网格结合时还有一种替代方式,可以让灯光沿着所关联网格块(chunk)法线方向指向:
DIRECTION = NORMAL举例来说,如果你有一组泛光灯(flood lights),并且使用一个包含所有发光区域(通常是平面方块)的单一网格,通过 DIRECTION = NORMAL,从该网格生成的灯光会自动与每个方块所面向的方向对齐。这正是 Brands Hatch 的泛光灯的设置方式:
还有一些参数可以微调这种对齐(下面是默认值):
DIRECTION_ALTER = 0, 0, 1
DIRECTION_OFFSET = 0, -0.4, 0DIRECTION_OFFSET 的值会被简单地加到计算出的方向上,从而稍微改变方向。DIRECTION_ALTER 则会重新定向整体:例如 DIRECTION_ALTER = 0, 0, -1 会把灯光转 180°(方向相反),DIRECTION_ALTER = 1, 0, 0 会沿竖直轴转 90°,DIRECTION_ALTER = 0, 1, 0 则沿水平轴转 90°。
单个灯光与灯光序列的完整语法与默认值
[LIGHT_..., LIGHT_SERIES_...]
ACTIVE = 1
DESCRIPTION = my light
; 形状
SPOT = 120 ; 对于线性光默认为 0
SPOT_SHARPNESS = 0.3
RANGE = 40
RANGE_GRADIENT_OFFSET = 0.2
; 光源
COLOR = 1, 1, 1, 40
SPECULAR_MULT = 0
SINGLE_FREQUENCY = 0
DIFFUSE_CONCENTRATION = 0.88
CONDITION = NightLights
CONDITION_OFFSET = ; 默认为未设置
; 光源随距离的衰减(出于性能考虑)
FADE_AT = 400
FADE_SMOOTH = 50
; 额外选项
VOLUMETRIC_LIGHT = 0
LONG_SPECULAR = 0
SKIP_LIGHT_MAP = 0
DISABLE_WITH_BOUNCED_LIGHT = 0
; 阴影:
SHADOWS = ; 默认为未设置
SHADOWS_STATIC =
SHADOWS_HALF_RESOLUTION =
SHADOWS_SPOT =
SHADOWS_RANGE =
SHADOWS_DIR =
SHADOWS_OFFSET =
SHADOWS_BOOST =
SHADOWS_CLIP_PLANE = 0.5
SHADOWS_CLIP_SPHERE = 0.5
SHADOWS_EXP_FACTOR = 20
SHADOWS_EXTRA_BLUR =- 主要参数:
ACTIVE:设为 0 可禁用光源;DESCRIPTION:光源的名称,在调试模式下与光轮廓一起显示;
- 形状:
SPOT:聚光角度,点光源设为 0;SPOT_SHARPNESS:聚光边缘的锐利程度,0 时中心最亮,1 时直到边缘均为 100% 亮度;RANGE:光照范围,单位为米;RANGE_GRADIENT_OFFSET:光开始衰减的距离(为更好看,建议保持较低值并提高光的亮度);
- 光源:
COLOR:光的颜色(格式说明在下文);SPECULAR_MULT:镜面高光强度;SINGLE_FREQUENCY:常规光设为 0,像钠灯(sodium lights)之类可设为 1;DIFFUSE_CONCENTRATION:为 1 时,正交于光方向的表面会处于阴影;为 0 时,即使背向的表面也会被充分照亮;CONDITION:控制亮度和颜色的条件名(参见 Tracks – Conditions);CONDITION_OFFSET:若设置,会偏移条件的闪烁时间;
- 光源随距离衰减(出于性能考虑):
FADE_AT:光强下降到 50% 的距离(米);FADE_SMOOTH:衰减所跨越的距离(增大可使衰减更平滑);
- 额外选项:
VOLUMETRIC_LIGHT:设为 1 可启用体积光效果(注意成本较高);LONG_SPECULAR:设为 1 可为有雨效果的湿润外观启用长镜面高光(需要 SSLR;注意它不会使用动态阴影贴图,因此不要为带阴影的光源使用);SKIP_LIGHT_MAP:设为 1 可让该光不对 Extra FX 的反弹光产生贡献;DISABLE_WITH_BOUNCED_LIGHT:当你使用某个光源来模拟反弹光时,可使用此选项在 Extra FX 的反弹光启用时禁用该光源;
- 阴影:
SHADOWS:是否启用阴影(默认情况下,对于影响赛道且范围大于 15 米的非线性光会自动启用阴影);SHADOWS_STATIC:设为 1 可将阴影标记为静态(更快);SHADOWS_HALF_RESOLUTION:设为 1 可使用降低分辨率的阴影以获得更平滑和更好的性能;SHADOWS_SPOT:可选地覆盖阴影的聚光角度;SHADOWS_RANGE:可选地覆盖阴影范围;SHADOWS_DIR:可选地覆盖阴影方向;SHADOWS_OFFSET:阴影起点的可选偏移(请小心使用,非低值可能会破坏阴影);SHADOWS_BOOST:阴影强度提升,若未设置则自动计算;SHADOWS_CLIP_PLANE:近处的阴影裁剪平面(例如,如果光源位于灯泡内部,你可能不希望它遮挡其他所有东西);SHADOWS_CLIP_SPHERE:同上,但使用球体而非平面;SHADOWS_EXP_FACTOR:阴影的指数因子;SHADOWS_EXTRA_BLUR:设为 1 可对阴影应用额外模糊。
关于拆分为组
无论是带网格的 [LIGHT_...] 还是带网格的 [LIGHT_SERIES_...] 都会将网格拆分为若干组。基本原理很简单:从零组开始,对于每个顶点,找到最近的组。如果距离小于某一阈值,则将该顶点加入该组;否则,创建一个新组。该阈值距离可以通过以下参数控制:
CLUSTER_THRESHOLD = 10 ; 距离,单位为米最小可设置值为 1 米。请检查实际创建了多少灯光:较低的阈值可能会生成过多灯光,而大量灯光会增加渲染开销。
还有一个基于 UV 的筛选选项,用于限定被考虑的顶点:
UV_FILTER_0 = 0.2, 0.1, 0.4, 0.2
UV_FILTER_1 = 0.8, 0.81, 0.1, 0.1前两个值定义区域左上角坐标,后两个值定义该区域的大小。只有位于该区域内的顶点会被考虑。
Light Maker
有一个名为 Light Maker 的小工具可以帮助你设置单个灯光。它最初是为了展示反弹光(bounced light)能力而添加的,但在通用灯光设置中也很有用。你可以将生成的光配置复制到剪贴板并粘贴到配置文件中,或者从配置中复制光并粘贴到 Light Maker(只需聚焦 Light Maker 窗口并按 Ctrl+V)。
我会在稍后添加一个更高级的编辑器。
关于性能
性能的关键不在于光源的数量本身,而在于屏幕上有多少像素被多少光源影响。与其使用一个影响整个屏幕的光源,不如使用十个各自只影响屏幕一小部分的光源。这里的“影响”不仅仅是“照亮”——请考虑与世界坐标对齐的“包围盒”对像素的影响(参考 https://www.shadertoy.com/view/WdjSRK)。任何位于该包围盒内的像素都会被该光源影响。因此,请保持光源尺寸较小,尤其要避免同时使用大角度和长距离,这会使包围盒迅速变大。
一些其他建议:
- 线性光(line light)计算量大的一部分来自其镜面分量,若将其设为 0 可加快渲染;
- 别忘了
FADE_AT和FADE_SMOOTH:即便是远处的光源不会影响太多像素,但将它们计算并提交给着色器仍会浪费时间; - 体积光和长镜面高光开销较大;
- 阴影不仅开销大,而且数量受限,因此尽量在不必要的地方禁用阴影,或切换为静态和较低分辨率。
关于阴影
阴影仅适用于角度小于 180° 的聚光灯(spot lights)。如果某光源角度大于 180°,你可以通过使用 SHADOWS_SPOT 覆盖并为阴影设置较小角度来获得阴影,尽管这种情况通常只在阴影不会出现在 SHADOWS_SPOT 之外时才适用。下面是这样的一个光源示例:
另外,聚光灯离得越高,阴影质量越低:
自定义着色器补丁(Custom Shaders Patch)中使用的动态阴影采用指数阴影贴图(exponential shadow maps)方法以获得更好的过滤效果。该技术可以在只需一次纹理采样的情况下得到平滑阴影,通过 MSAA 便宜地提高阴影分辨率,并且能更好地处理大角度灯光(参考与常见 PCF 方法的比较 https://youtu.be/zw67CyByt38?t=45),但它也有一些缺陷,主要是灯光可能会在一定距离内泄露。为了解决这一问题,我们可以增加指数因子,但这可能导致阴影失去平滑度并产生难看的效果:
因此,一如既往,这需要权衡并找到合理的折中方案。
请注意,高分辨率阴影只有 15 个插槽,低分辨率阴影有 16 个插槽,因此将一些光源设置为低分辨率阴影以确保有空余插槽是个好主意。如果带阴影的光源过多,只有离摄像机最近的那些会获得阴影。
关于移动光源
你可以通过动画物体(animated objects)让光源移动:
[LIGHT_...]
RELATIVE_TO = name of a moving node请避免为持续移动的光源启用阴影,否则 Custom Shaders Patch 会每帧重建它们的赛道阴影贴图,这是一项非常昂贵的操作。对于常规光源(不移动的),阴影通常只需生成一次。

