中级光照

From Valve Developer Community
< Zh
Jump to navigation Jump to search
English (en)Русский (ru)中文 (zh)Translate (Translate)


本教程将介绍在 起源 起源 地图中使用的高级光照。如果你是需要在 Hammer 编辑器中创建光照的新手, 则可能需要先阅读 基础光照教程 。本教程首先将涵盖所有创建照明的可能方法,然后介绍与调节光照相关的所有设置。接下来将是一系列更深入的教程小节,来讲解如何充分利用你已所知的光源。

灯光实体

以下是能够以某种形式投射物理光线的实体列表。

"light"实体示例

light

Light.png

一个静态的、本体不可见的全向光源。可配置预设光效模式,但无法移动位置。光线从实体原点向所有方向投射,亮度取决于设定的衰减值。该光源是所有光源中最基础的类型,应用十分广泛。

Note.png注意:它可以通过 I/O 系统 打开和关闭,但这会增加 光照贴图 的复杂度, 因为必须为每个开关组合存储预编译值,因此会占用更多内存。
"light_spot"实体示例

light_spot

Light spot.gif

light 实体的静态定向形式。此光源可以指向任何方向,并包含对光锥的形状和属性的控件。它也可以通过 I/O 系统 打开和关闭, 但需注意可开关的light_spot可能导致光照贴图错误。此光源的控件使之成为模拟真实光源最便捷的选择,推荐常规场景使用。

Note.png注意:使用此实体时,通常需要大幅提高亮度值才能获得可见效果。例如,用于路灯时可能需要将亮度设为3000-4000。
Hammer里和游戏里的表现

light_environment

Light environment.png
天空盒纹理。

一种仅朝单一方向投射光线的定向平行光源,常用于模拟阳光。其光照方向由实体参数值决定,关键在于,光线仅从 tools/toolsskybox 天空盒纹理投射。第一个键值亮度(Brightness)用于直接控制光照强度,用于模拟直射阳光的效果。第二个键值环境光(Ambient)控制来自天空的间接光照强度,表现为所有能"看到"天空的表面上投射的漫反射光。本质上决定了光源所产生的阴影区域的色彩和亮度。

如果你不想为实体设定自定义参数值,可以参考 起源 起源 系列游戏中的各天空盒所使用的预设值,具体数值详见 天空盒列表

通常,每个关卡只需放置一个 light_environment 实体。如果放置了多个 light_environment 实体,VRAD 会使用第一个找到的 light_environment 的 键值 来计算光照。

"point_spotlight"实体示例

point_spotlightnpc_spotlight

一种用于聚光灯效果的直线光束光源。其视觉效果包含:光源周围的光晕特效、沿照射方向延伸的光束,以及光束接触地面时生成的 light_dynamic 。该光源本身虽无法自主移动,但可通过绑定到移动实体或target来实现移动。此外,使用 npc_spotlight 实体在 NPC 智能控制下可产生相同的视觉效果,且能实现精准流畅的动态操控。需注意:此类动态光源渲染开销较高,应谨慎使用。

相关实体

以下是与光照效果相关但本身不发光的实体列表。虽然这些实体不产生实际光线,但对实现光影效果至关重要。无论是控制实体受光表现,还是操控 蚁狮 的阴影效果,均属于光照效果范畴。

env_sun的效果。

env_sun

Env sun(gmod).png

这个效果常被误认为是类似太阳的发光体,但实际上它只是在天空中添加一个模拟太阳外观与行为的光晕特效。该实体完全不投射光线,通常需要配合 light_environment 实体共同实现太阳的光照效果。

env_sprite

另一个不产生实际光照的实体是 env_sprite。该实体主要用于创建光源辉光(light glows)、眩光效果(glares)及其他各类高强度光效。在 半衰期2:第一章 半衰期2:第一章 接近尾声的某关卡中,开发者运用 env_sprite 在充满光源的广阔区域内模拟出强烈光照效果——具体实现于地图 ep1_c17_06。这种技术既能模拟黑暗区域外倾泻而入的光线,又可作为更兼容HDR渲染的光照技术方案。

shadow_control

Shadow control.png

该实体用于控制游戏中所有 动态阴影 的投射。任何可移动物体(如NPC和物理实体)投射的阴影均属此范畴,其核心功能是校准阴影角度以确保与光照方向一致。虽然单一方向投射的特性可能会造成问题,但可通过触发器动态控制来优化。在 求生之路 求生之路, 传送门2 传送门2,和 异形丛生 异形丛生 的引擎中,阴影方向采用逐实体计算机制——根据距离实体最近的光源动态确定。但该功能在 起源2006 起源2006起源2007 起源2007起源2013 起源2013 的模组中并不存在,除非你将 Source 2007引擎动态RTT阴影角度控制 应用于你的模组。

shadow_control 是为配合 light_environment 的使用而设计的,因此其与 lightlight_spotlight_dynamic,或其他光源实体一起使用时作用极其有限。

  • shadow_control 仅计算来自一个光源的阴影,且每个场景只能有一个 shadow_control 生效,因此一个物体最多只能投射一个动态阴影。
  • shadow_control 仅计算来自“平行”光线(例如太阳或月亮)的阴影,不计算来自点光源(例如light)的放射状光线产生的阴影。
  • shadow_control光照贴图 的阴影没有影响(反之亦然)。
  • shadow_control反恐精英:全球攻势 反恐精英:全球攻势 中已被弃用(且不再使用),取而代之的是 env_cascade_light 实体。

动态阴影与细腻的光照贴图阴影融合效果不佳。

  • 可移动物体(例如大多数实体模型)从不投射光照贴图阴影,但会投射动态阴影 (当启用 shadow_control 时)。只有 世界几何体prop_static 从不投射动态阴影(但它们会投射光照贴图阴影)。
  • 光照贴图缩放比例 (Lightmap Scale) 不影响动态阴影的细节/柔化程度(动态阴影相当于固定为 1 luxel/单位 的光照贴图分辨率)。
  • 来自同一光源的动态阴影和光照贴图阴影不会合并,而是会重叠或者“双重出现”。
  • 动态阴影只能被世界几何体(Brush)接收。

另请参阅 info_no_dynamic_shadow 实体。

VRAD

RAD光照编译是编译过程中的关键环节,负责生成场景中的所有光照效果。它不仅是编译过程中最耗时的阶段,通常也是需要反复执行最频繁的环节。由于光照效果除经验积累外无法预先精确估算,往往需要通过多次枯燥的编译调试才能达到理想效果(可以通过使用 Hammer++ Hammer++ 来简化此过程)。关于如何优化RAD编译的专题将在后续讨论,当前应优先掌握其核心功能和参数配置。

技巧

本节将指导如何运用前述实体实现高效光照。前文已系统阐述了大量实践知识,但唯有付诸实践方能发挥其价值。后续章节将着重探讨如何综合运用这些技术要点,在你的地图设计中提升光照效果的质量和表现能力。

色温

虽然所有光源实体(light entity)的亮度参数(Brightness) 的 RGB 颜色值预设为 255 255 255(纯白),但现实中极少会有光源可以发出纯白色的光。根据光源发出的“黑体温度(blackbody temperature)”不同,其发出的光线将呈现介于橙色“红”光(通常称为“暖色(warm)”,尽管其实际温度较低)与紫外“蓝”光(通常称为“冷色(cool)”)之间的某种色调,如此 色温标尺 所示。你可以参考 维基百科 “色温”条目 来确定光源在色温标尺上的目标位置,或直接采用 Valve 地图制作标准中的常用 RGB 值,常见的白炽灯泡(钨丝灯)为“暖色”,RGB 值为 254 216 146,常见的荧光灯为“冷色”,RGB 值为 159 237 215,联合军的常用灯光则为冰冷的 147 226 240

照明心理学

色彩组合千变万化。这里,一抹精致的绿调呈现出病态的观感。

经证实,“黑体温度”辐射光谱(参见上文)中色温较高的冷色调照明会引发玩家的心理压力,使其产生不安甚至生理不适感;而暖色调照明则无此影响。

这种对光照的潜意识情绪反应可被用于构建具有特定情绪导向的光照环境。其应用可简至选择荧光灯(营造恐怖场景)或白炽灯泡(塑造安全区域)。

例如,在 半衰期2 半衰期2 的第一张地图中, 当玩家被国民护卫队押送至审讯区时,会经过一条走廊(或者其他的什么)。分析其照明设计可发现Valve对心理效应的精准把控——走廊起始处采用标准钨丝灯(散发温暖光晕),紧接着却突变为荧光灯(释放令人不安的冷光)。这种组合在现实中极为罕见(除非建筑师中途更改设计或电工用尽灯具),实则暗示Valve(或联合军)意图制造"从安全领域步入危险地带"的心理过渡。

在玩家进入的牢房前,他可能会目睹一个令人不安的场景,囚室内正上演市民倾诉困境的压抑场景。此处天花板悬挂钨丝灯。这可能是因为荧光灯会与立方体小房间产生巨大的冲突感(荧光灯通常用于走廊及开阔区域)。在侧面,有一个无形的 light_spot,其唯一作用正是为场景注入情绪张力。

除上述直接影响外,运用 色彩理论 还能通过间接的潜意识联想塑造环境氛围。以荧光灯为例:其冷调幽光天然携带不安感,这种非自然的淡蓝辉光可唤起冰冷、虚无与孤立的情绪联想。

色彩并非唯一影响因素。光源的排布密度、亮度及未照亮区域同样至关重要。明亮的房间感觉更安全,因为其中的一切都清晰可见、易于应对;但另一方面,零星散布的点状光源会放大或制造一种不安感,因为玩家有太多被隐藏的或者难以看清的地方。同理,如果一个房间的所有角落都被照亮,唯独一个角落是暗的,那个角落就会被视为潜在的威胁或者其他隐藏的东西,反而会吸引探索玩家的注意。

如何运用这些原理取决于关卡设计师。无论是恐怖地图还是儿童游戏皆可受惠于此——但倘若意外将儿童游戏做得阴森而恐怖,则注定会失去这项工作的薪水。光照不仅赋予物体可见性,更决定了它们在所有观察者眼中的情感呈现。

创造合理的光源

在游戏场景中创造合理的光源往往颇具挑战。仅在场景中放置一个光源实体并不能解释光线从何而来或为何存在。合理的光源需符合环境逻辑且位置合理,通常需要多个实体协作才能实现。最常见的是双实体组合:一个是光源实体,负责实际照明,另一个是视觉实体,通常表现为灯具(由具有适当纹理的prop_static或 func_detail 构成)。

一盏普通的灯。

第一步是确定有哪些可用的光源。寻找会发光的纹理或模型。在模型或纹理浏览器中通过关键词 “light”(灯)或 “lamp”(灯具)进行筛选,效果很好。现在选择一个符合房间氛围的(例如,工业场景用工业灯),并将该模型或纹理放置在房间中。在本示例中,选择右侧展示的灯,并使用 prop_static 放置它。

现在有了看起来会发光的东西,下一步就是创建它所发出的光。观察选定的光源,思考发出的光是否会因有色玻璃而变色,以及光源本身是否会将光线聚焦/遮挡形成定向光源。使用各种光源实体,并相应地设置其属性来创建效果。在给定的示例中,灯光将会聚焦在一个方向上,因此选择 light_spot 。其次,这是一个强光源,所以将其亮度(brightness)设为 1000。现在观察它的颜色。玻璃没有着色,虽然发出的光很强,但现实中探照灯会通过内部使用高反光表面来聚焦光线以获得强度,因此色温也足够接近,可以保留颜色值在 255 255 255(纯白)。现在将其与 prop_static 对齐,调整灯光的角度和聚焦范围,使其看起来像是从 prop_static 发出的。

现在光源已经与其模型对齐了,但可能还存在一个问题。如果对齐的光源最终位于光源模型/实体的边界内部,它将会阻挡发出的光线(只能照亮道具)。为防止这种情况,进入 prop_static 的属性,确保将“禁用阴影”(Disable shadows)设置为“是”(Yes)。(如果光源是 世界几何体 ,将其绑定到一个 func_brush 上,并以相同方式修改其属性)。这样可以防止光源被自身模型阻挡。

现在你有了一个可用的设置,一个好主意是将它们编组(并且还可以将这个组制作成预制件(prefab)以便插入到其他地图中),这样它们就能始终保持在一起。现在如果需要更多灯光,就可以复制这个组。

另一种创建高质量光源的方法,能更好地模拟现实效果且不影响性能,是组合使用 light 和 light_spot 。像上面描述的那样放置 light_spot ,但将 light 放置在距离作为光源的模型约 50 单位(units)的位置。将这个 light 的亮度设为大约 50,颜色与 light_spot 相同。这通常能在 light_spot 不能照亮的表面上创建出更正确的辉光效果。

静态与动态

在性能方面,使用静态光源相比动态光源具有诸多优势。静态光源不会增加额外的处理负担,因此对实现快速渲染地图至关重要。而动态光源可能带来巨大的渲染开销,在地图中过度使用代价高昂。掌握不同类型光源的适用场景,避免错误地使用至关重要。

首先,静态光源是在VRAD编译过程中计算的;因此,在游戏运行时几乎无需进行任何计算——它只需要渲染预先计算好的光照,这是一个很快的过程。常见的静态光源实体包括 lightlight_spotlight_environment ,但在某些条件下也可能发生变化。静态光源带来的问题在于其固定不变的特性。虽然静态光照能以极低的处理成本实现非常精确和细致的照明效果,但无法实现任何特效,因为它不能发生变化。

另一方面,动态光照分为两种类型。一种是可开关光源(switchable lights),另一种是纯动态计算光源(true dynamically calculated lights)。每种类型都有其自身的处理负担,但两者渲染代价都很高昂,应谨慎使用。

可开关光源(switchable lights)与静态光源在本质上相同,因为它们都使用在RAD编译过程中生成的光照贴图(lightmap)信息。将一个光源设置为可开关的方式有以下三种之一:为其指定名称(name)、赋予其样式(style) 或设置其模式(pattern)。通常用作可开关光源的是那些不支持动态效果的标准光源,包括 lightlight_spot ,但不包括 light_environment 。可开关光源使用两组光照贴图:一组对应开启状态,一组对应关闭状态。它们通过在这两组光照贴图之间切换或混合来实现亮度变化(例如渐变效果),同时始终保持仅需两组贴图。这既保留了静态光源的所有优势,又允许光源状态发生改变并实现部分动态效果。那么问题来了:假设有两个可开关光源同时照射在同一个表面上,需要多少组光照贴图?

  • 灯 1 & 2 开
  • 灯 1 开, 2 关
  • 灯 1 关, 2 开
  • 灯 1 & 2 关

那么总共会有四种状态。如果再添加第三个可开关光源,光照贴图数量将增加到八组。这就是可开关光源的问题所在——为了创建所有可能的状态组合,所需的光照贴图会变得非常昂贵。事实上,其开销如此之大,以至于存在一个硬编码限制(hard-coded limit):同一表面上最多只能有两个可开关光源产生影响。不过有一个折中方案:具有相同名称的光源将共享同一组光照贴图。因此,你可以让 50 个同名的可开关光源照射在同一表面上;然而,光源名称组的数量最多不能超过 32 个。由于需要额外的光照贴图,可开关光源会增加 RAD 编译所需的时间,增大文件体积,同时在状态切换时消耗系统资源。但是,一个稳定在特定状态(不进行切换)的可开关光源,其运行时开销不比静态光源高。

纯动态计算光源(True dynamic lighting) 是指其动态效果必须内置于实体本身,最常见的识别办法是通过实体内的 Parent(父级)属性来识别。具有内置动态效果的实体是 light_dynamicpoint_spotlight 。你也可以通过设置 效果flags 中的 EF_BRIGHTLIGHTEF_DIMLIGHT flags,使任意动态实体投射动态光。point_spotlight 比较特殊,它有一个flags可以将其启用为动态或静态。此flags默认设置为动态,这常常会让人措手不及。动态光源的渲染过程完全在游戏运行时进行。这意味着它对 RAD 编译过程或文件大小几乎没有影响,但会拖慢你的地图运行速度。动态光源的使用应比可开关光源更加谨慎。动态光源导致的系统减速通常是持续性的,因为光源需要持续渲染。此类实体应仅用于光源本身需要移动的情况。如果光源本身不打算移动,那么它就不应该是一个真正的动态光。如果它仅仅是为了开启和关闭,那么应该使用可开关光源(switchable light)代替。如果使用不当,动态光照的成本将超过其收益。动态光的另一个缺点是,为了简化计算,它不运行反射和漫射等过程,这会导致光照效果看起来更刺眼、更简单。

静态光源引擎负担轻且细节表现佳,而动态光源则提供了运动与变化的可能性。判断动态光源影响的最简单方法是使用 +Showbudget 命令测试地图。这使你能够实时监测特效是否过度,以及光照效果是否在拖慢地图运行速度。合理运用动态光源可以提升地图效果,但它们本质上是一种代价高昂的特效。

快速高效RAD编译

RAD 编译过程可能相当漫长,频繁编译很容易拖慢开发进度。你可以采用以下几种方法来解决这个问题:

  • 在大多数编译中关闭 RAD,仅在需要调整和测试光照时专门开启它。
  • 使用 警戒线 工具,确保只编译你需要修改的区域。(如果使用了 light_environment,请复制一份环境光实体,确保其位于分区边界内。)
  • 一次性进行多项修改。与其只调整地图中某一部分的光照,不如尝试调整地图不同区域的多组光照,然后一次性编译所有更改。
  • 标准化你的光照。为地图中每种类型的光源(例如荧光灯、聚光灯等)选定统一的 RGB 值和亮度值,让该类型的每个光源实例都使用相同的初始值。这样就不必为地图中的每个光源单独设定数值,只需根据具体需求微调光源数值即可(例如,较大的房间可能需要使用更大的同类型光源)。
  • 利用家中任何闲置的电脑。在这些电脑上安装 SDK,并用它们来进行光照编译。这样你就可以在等待光照编译结果的同时,继续对地图进行其他编辑。
  • 使用像 DropboxSparkleShare 这样的程序可以自动同步地图文件,使这个过程更加容易。

结论

这涵盖了在标准 Source 引擎游戏中可找到的所有光照效果的基础知识。

另请参见