# 灯光 ## 概述 本文讨论了环境光源的机制和配置,这些光源用作游戏世界的元素,添加到复合对象中,或由关卡设计人员作为游戏对象 (gameobj) 放置。 - 光源是位于 `/prog` 目录下`lights.blk`文件中的模板。 - 它们可以通过 `.blk` 文件或通过任务编辑器 (`F12`)进行配置。但是,编辑器仅用于配置设置。要保存更改,您必须手动将它们复制回 `.blk` 文件中。 - 在全球范围内,光源分为两类:**omni**(球形)和 **spot**(90 度定向锥)。 - 灯光将作为 `gameobj`. 添加到场景中。下面提供了有关此过程的更多详细信息。 - 最好在命名光源和视觉模型时,并提供有关其半径和颜色的详细信息(如有必要)。 - 避免在不同环境中重复使用相同的光源。例如,如果你有一盏吊灯挂在离地面 5 米的地方,不要在 8 米处使用相同的灯。使用自己的设置创建单独的对象。实际上,更大的房间需要更坚固的灯泡。 ## 创建新光源时的关键考虑因素 1. **聚光灯与泛光灯**:聚光灯照亮的区域比泛光灯小六倍,而且它们在性能方面也快六倍。尽可能使用聚光灯而不是泛光灯。 2. **扩展光源模板**:创建或配置新的光源通常涉及添加新的视觉模型,例如灯或聚光灯。始终通过扩展原始模板来创建新的光源,除非有特殊原因需要修改现有光源。这可确保将来对光源的更改不会无意中影响从光源延伸的其他光源。 从性能的角度来看,单个光源的 10 个克隆和具有相同参数的 10 个唯一光源之间没有区别。 因此,不要犹豫,增加光源的数量。命名时,请使用说明其特定用途的描述性标题,包括对可视化模型的引用。 ## 光源参数和配置 ### light__color 使用从`0` 到`255`的 RGBA 值定义光颜色。Alpha 通道 (A) 在此上下文中不起作用。 ### light__brightness 将亮度与光源的最大半径一起配置至关重要。 - 请勿将亮度设置为高于最大半径所需的亮度。 过高的亮度会降低视觉质量,影响眼睛适应系统,并可能对游戏产生负面影响。 - 始终为每个光源单独调整亮度,而不是从其他光源复制值。平衡亮度与灯光的最大半径。 在配置自然光源(如火炬、蜡烛、煤油灯或篝火)时,请避免使用过于饱和的黄橙色或过高的亮度级别。 ### light__max_radius 定义灯光影响的边界。边缘是柔软的,渐变向内延伸。渐变强度是固定的,表示半径的百分比。 - **同时优化半径和亮度**:与亮度一样,配置半径以使其与亮度匹配。重叠的光源半径会损害性能,因此请保持半径尽可能小,并确保光源之间的重叠最小。 ```{important} 对于每单位亮度,白色光 (255, 255, 255) 的最大可见距离为 3 米。 ``` 为方便起见,下表显示了亮度和半径之间的关系: | 亮度 |最大半径 | |:----:|:----------:| | 0.25 | 0.75 | | 0.75 | 2.25 | | 3 | 9 | | 5 | 15 | | 10 | 30 | 出于优化目的,将半径设置为略低于这些值,但绝不能超过这些值。此外,还要考虑 IES 纹理的效果 – 由于光线在此类配置文件中很少达到最大值,因此应根据具体情况相应地调整最大半径。但是,不应超过表中的值。 ### spot_light__shadows / omni_light__shadows 为照亮整个房间的大型光源启用阴影。避免对台灯或壁灯等次要灯光使用阴影,因为阴影会占用大量资源。 ### spot_light__dynamic_obj_shadows / omni_light__dynamic_obj_shadows **请极其小心使用**。这是非常耗费性能的,并且只应应用于大型、重要且独特的光源。在给定的地图上,这样的灯不应超过两个或三个。理想情况下,除非绝对必要,否则根本不应该使用动态阴影。 ### spot_light__shadow_shrink / omni_light__shadow_shrink 此参数控制阴影柔和度,并使用整数(无小数)进行设置。 - 宽视觉光源(如篝火)应具有柔和的阴影,而较小的光源(如灯泡)应具有更清晰的阴影。 - 有效范围为`0` 到 `2`。

0

2

### spot_light__inner_attenuation 此参数特定于聚光灯,并控制聚光灯边缘的柔和度。 - “`0`”表示最大模糊,“`1`”表示锐利边缘。

0

1

### light__texture_name 这些是用于体积阴影映射的光度学数据纹理。有关详细信息,请参阅 [光度学光源](./photometric_lights.md)文章。 - IES 纹理的文件大小可以忽略不计,应放在 common 目录中: ``` /develop/assets/manmade_common/textures/ies ``` - 如果没有合适的现有纹理,请随意创建新的纹理以满足您的需求。以描述性方式命名它们,最好包括与它们配对的视觉模型的名称,并以 `ies_*`开头。例如,`ies_barsed_lamp_b`。 ### light__nightly 这是一个二进制设置 (`yes`/`no`)。激活后,灯只会在夜间亮起。 ### light__use_box 默认情况下,所有泛光灯都启用此设置,它是一个二进制(`yes`/`no`)选项,用于控制是否将灯光限制为仅在envi_probe内(通常在室内)内渲染。如果灯在户外使用,则应禁用此功能。聚光灯通常足以用于户外照明。 ## 为可视模型配置 Emission Strength 有关在灯和与光源关联的其他视觉模型使用的着色器上配置发射的信息,请参阅以下着色器: - [rendinst_simple_glass](../shaders/dng-shaders/rendinst_simple_glass.md) - [rendinst_emissive/dynamic_emissive](../shaders/dng-shaders/rendinst_emissive.md) 请务必记住,过亮的发射(如过高的光线亮度)会破坏视觉质量,干扰眼睛适应,并对游戏产生负面影响。将 Emission 调整为尽可能微妙。 ## GameObj 要向复合对象添加光源,请为其创建一个 gameObject,并将其放置在 `*/develop/assets/common/gameRes/gameObjects`目录中。将文件命名为:`template_name.gameObj.blk`。 ```{seealso} 有关更多信息,请参阅 [gameObjects](../about-assets/gameobjects/gameobjects.md). ``` 如果光源与动态模型一起使用(不能在 *daEditor* 中绘制),您可以在 `gameObj` 中添加以下行以在编辑器中显示模型: ``` ref_dynmodel:t="name_of_dynmodel" ``` ## 限制框 可以使用 `omni_light_restriction_box.gameObj.blk`对象进一步限制光源的影响。例如,这对于防止光线穿过墙壁非常有用。尽管名称包含`omni_light`,但此对象也适用于聚光灯。