照明(半衰期:爱莉克斯)

From Valve Developer Community
Jump to: navigation, search
English Русский

在3D中渲染对象时,《半衰期:爱莉克斯》背后的引擎会模拟现实生活中灯光的显示方式—允许表面对光源、环境光等做出逼真的响应,静态和动态对象都会从这些光源投射阴影。为了确保高视觉逼真度和高性能,创意工坊工具需要预先计算大量信息—以各种形式存储照明数据,如光照贴图纹理、光探头体积和立方体贴图。

但这些到底什么?

照明系统的输入可分为以下几部分:

  • 静态几何体上的光照贴图纹理(Hammer网格、静态道具)
  • 光探头体积和立方体贴图(动态对象上的环境光、反射)
  • 光源(环境、点光源、正交光源和聚光灯)
  • 体积雾

要预览Hammer中的效果,可以使用顶部的“预览烘焙照明(Preview Baked Lighting)”菜单。这将做一个相对低质量的预览来呈现在虚拟现实中的最终照明效果——极大地帮助艺术指导、游戏设计和其他类似的。它使用顶点照明和许多单像素动态光源,而不是光照贴图——需要更少的预计算,但导致较低的质量和更昂贵的运行时渲染。

你需要为完整的发布版照明创建光照贴图,但你可以在VR中使用这个预览版本的照明进行低性能测试。除了非常简单的地图外,任何地图在这种照明下的帧率都可能非常糟糕,所以不要以这种方式发布地图!

光源类型

光源有几种不同的类型,光的消散方式也不同。你可以在左侧工具栏中使用Hammer中的实体工具将光源放置到地图中——很方便,它有一个样式化的灯泡图标。

放置后,在3D视图中选择实体,并在右下角的'对象属性'中设置颜色、亮度、最大距离等。

  • 环境光——light_environment
    • 来自天空的虚拟阳光——无限远的光源
    • 不随距离衰减
    • 通常在地图上只有一个
    • 在workshop_examples/prefabs/environment_settings文件夹里提供超级有用的预制件
  • 点光源——light_omni
    • 单一的全方位光源
    • 有点像灯泡!
  • 聚光灯——light_spot
    • 来自特定点的定向光源
    • 就像一个真实世界的聚光灯,令人惊讶!
  • 正交光 - light_ortho
    • 需要在实体类弹出菜单中选择'light_ortho'来放置
    • 介于环境光和聚光灯之间
    • 光是平行的,但只存在于特定的长方体内
    • 与环境光一样,不会随距离衰减
    • 适用于有限的天窗和其他特殊用途等

直接和间接照明

光源实际上由两个部分组成:

  • 直接照明——基于光源视线的主要组件
  • 间接照明——光线从一个表面反射到另一个表面的次要组成部分——可能相当微妙,但极大地增加了视觉真实感

如何渲染直接照明是这里的主要选择。

默认为烘焙灯光索引

  • 选择时将“直接照明(Direct Lighting)”设置为“烘焙(Baked)”,并选中“烘焙光照索引(Baked Light Indexing)”(默认设置)
  • 默认情况下,间接照明烘焙到光照贴图(对于静态曲面)和光探测体积(对于动态对象)
  • 优点:
    • 直接照明具有镜面反射(闪亮)组件
    • 可以从动态对象(角色、物理道具等)投射阴影
    • 静态几何体阴影上的真实接触强化【使用光源半径(Light Source Radius)/太阳散射角(SunSpreadAngle)】
    • 直接照明可以闪烁、频闪、打开和关闭(给灯光实体一个目标名称,并通过实体I/O告诉它该怎么做)
    • 渲染成本相对低!
  • 缺点:
    • 一次最多可以有4个索引光照射在一个表面上,否则会发生奇怪的事情(最好保持为一个或两个,以使渲染成本更低)
      • 在Hammer的3D视图右上方预览菜单里——将“工具可视化模式(Tools Visualization Mode)”设置为“烘焙照明复杂性(Baked Lighting Complexity)”
      • 黑色是在那个表面上的零索引光,红色1,橙色2,黄色3,白色4,青色是“不要那样做”
    • 光源不能移动
    • 一次只能有一个索引光源从动态对象上投射阴影
    • 如果你想要一个完全可开关的灯,间接组件不能被打开或关闭——将它设置为“None”
    • 地图中索引灯光的总数是有限制的,尽管它相当高,而且在正常使用中不太可能达到

完全烘焙直接照明

  • 在“直接照明(Direct Lighting)”设置为“烘焙(Baked)”且未选中“烘焙光照索引(Baked Light Indexing)”的情况下选择
  • 优点:
    • 基本上渲染0成本!
      • 直接组件存储在光照贴图和光探测容器中,与间接组件相同
    • 静态几何体阴影上的真实接触强化【使用光源半径(Light Source Radius)/太阳散射角(SunSpreadAngle)】
  • 缺点:
    • 直接照明没有镜面反射组件
      • 明亮的表面看起来干燥而粗糙
      • 不要从方向光照贴图中获得方向性
    • 不能从动态对象上投射阴影
    • 光源不能移动
    • 不能打开或关闭灯光,不能闪烁或频闪

每像素直接照明

  • 选择“直接光(Direct Light)”设置为“每像素(Per Pixel)”
  • 渲染成本可能非常高;通常只用于特殊场合(如玩家手电筒)或非常小的光源(弹药夹,树脂等)。
  • 只有在你知道自己在做什么的情况下才用这些
    • 查看附加的地图中的示例以了解更多细节
  • 优点:
    • 可以有高质量的高光组件(尽管在上面列出的小光源下高光会被关闭)
    • 可以有完全动态的阴影(同样,对于那些小光源会关闭)
    • 可以移动光源,例如用玩家手电筒!
    • 直接照明可以闪烁,频闪,打开和关闭
  • 缺点:
    • 渲染成本可能非常高!
    • 无接触硬化【光源半径(Light Source Radius)/太阳散射角(SunSpreadAngle)不起作用】
    • 如果启用,间接组件仍然被烘焙到光照贴图等(大多数情况下切换到“None”)
    • 外预览照明,我们只支持
      • 在视图中启用带阴影的单个light_spot或light_ortho
      • 最多8个禁用阴影和镜面反射和完全线性衰减的light_omnis

间接照明

为了对动态对象进行适当的间接照明,你需要放置Light Probe Volume and Cubemap实体——env_combined_light_probe_volume

  • 你想要每个中心都是一个典型的,在那个特定的空间里的平均视图,可以是一个房间,走廊,户外场景等等
    • 对于一个简单的长方体房间,你应该把它放在正中央,大约眼睛的高度
  • 扩展体积边界(红色、绿色和蓝色3D箭头)以完全包围该体积
    • 反射是通过盒子投影的立方体贴图完成的——想象一个盒子的每个面都有一个纹理
    • 在这个简单的长方体房间中,你希望体积边界与墙、地板和天花板相交
    • 因此,反射就是那个房间的简化版,具有正确的视深度和一切
  • 体积可以旋转和重叠——可以设置优先级,使一个覆盖另一个(例如,一个黑暗的玩家可进入的盒子,周围有阳光照射)
  • 必要时,应将hammer的几何体分解为单独的网格
    • 每个网格只能接收来自一个立方体贴图的反射
    • 不要担心在过程中有效地添加额外的几何体、顶点等——所有奇特的网格解剖东西都在后台以可见性和类似的方式进行。
  • 所有可到达的区域都应该用光探测容器包围起来——如果你有动态物体突然闪得很亮或者什么的,你可能漏掉了这一点
提示:使用r_light_probe_volume_debug_colors和r_cubemap_debug_colors的控制台值来调试光探测容器

光照贴图密度

光照贴图密度描述光照贴图纹理在特定表面上的密度。这是必须控制的,因为给所有面一个均匀的密度是没有效率的。

你可以使用命令mat_luxels 1预览游戏中的光照贴图密度。

光照贴图玩家空间

光照贴图是包含静态表面预先计算的光照信息的纹理。为了达到最好的视觉保真度,你需要尽可能高的分辨率。你可以通过放置光照贴图玩家空间容器来确保编译过程自动优先考虑玩家可访问的东西——很简单,这些是带有materials/tools/toolslightmapres.vmat的Hammer网格。一个表面越接近这些网格,就有越多的光照贴图纹理元素被分配给它。

它的一般要点是-放置这些光照地图玩家空间容器在玩家可以到达的区域。不可到达的区域——栅栏后面的东西,高墙上的东西,远处的建筑物——将因此分配越来越少的光照贴图纹理元素,这取决于他们离得有多远。

最终的结果显然是无缝的光照贴图细节!

光照贴图分辨率偏差

当编辑一个表面,你可以控制光照贴图分辨率偏差。这个值将影响该面相对于地图其余部分的光照贴图纹理空间的大小。

偏差以2的幂来缩放。光照贴图的偏差为+1将使纹理分辨率变为正常的2倍,+2则为4倍等等。负偏差将降低光照贴图分辨率。

小心无意中调整这个选项,因为一个带有非常大光照贴图偏差的单一表面会有效地破坏你其余贴图的光照贴图密度!如果你有糟糕的阴影,你的控制台报告“Mesh with material <x> is extremely large in lightmap (x.x%)”有一个大的值,这可能就是其原因。你可以转到控制台中列出的坐标来了解这些面可能在哪里,并在游戏中使用mat_luxels 1来找到可疑的密集面。

照明基本总结:

  • 在你的场景中使用索引灯作为主光源——阳光,主要光源等你想要从可切换/闪烁的灯等反射的光源
    • 烘焙照明复杂性的可视化模式将向你展示事物在渲染成本方面的样子
    • 理想情况下,你需要黑色、红色和一些橙色和黄色
  • 在视觉上不太重要的东西上使用完全烘焙的灯——填充灯,背景物件,调暗的光源
  • 只有在非常特殊的情况下才使用逐像素光源——如果有疑问,就不要使用。

体积雾

《半衰期:爱莉克斯》使用了一个基于体积元素的系统,让大气对光源做出反应——朦胧的光斑、眩光、雾、透过窗户的光束——所有这些都可以使用这个统一的体积雾系统。

要在地图中启用它,请放置env_volumeTric_fog_controller实体。默认设置通常是可以的。

你可以使用env_volumetric_fog_volume实体来设置特定体积的雾——以类似于光探针体积的方式拖出体积的边界。对于雾体积的较硬边缘,选择雾体积实体并将“衰减指数”设置为一个较低的值,如零。

接下来,你需要设置光源来产生体积雾。选择一个光照实体,然后将“Volumetric Fogging”设置为“Baked”。你可以用“fog contribution strength”来调整雾的强度

一个缺点是,对于户外区域来说,阳光照射的东西会突然看起来更暗。默认情况下,大气会吸收光线。通常情况下,我们会通过在阳光上启用体积雾来解决这个问题,但不幸的是,由于各种技术原因,环境光(例如阳光)不能产生体积雾。

可以将雾的体积设置为较低的雾强度(以减少大气的暗化),然后使用light_ortho启用体积雾,低亮度、高雾贡献强度、角度和颜色设置为与阳光的light_environment相同。

你可以使用许多启用了体积雾的光源——每个光源的额外渲染成本相对较小。对于light_omnis,尽可能多地设置为“Baked: No shadows”,否则图形程序会很伤心。

查看附加地图以获取更多例子!

编译照明

预览烘焙照明

要预览你的地图在完全编译后的光照情况,使用Preview Baked Lighting : Bake All Lighting菜单。这将执行一些较低质量的计算以帮助你遍历地图上的整体外观和视觉——除了它会让你继续在地图上工作这一点,但记得每当有任何重大的变化时重新烘焙预览照明,这样你会得到一个最新的光影效果。

提示:按F5切换到无照明视图,用F6预览全图照明。
提示:烘焙预览照明时,为了节省时间,你可以选择有限数量的Hammer网格,然后烘焙选择的照明(Bake Lighting On Selection)。

编译光照贴图

一旦你对地图的外观感到满意,现在就可以编译了。按F9弹出“地图生成器(Map Builder)”对话框。完整编译(Full Compile)的默认设置将生成1k分辨率的光照贴图——对于一个简单的贴图来说,这应该是相对快的,只需要几分钟。要为金属表面上的适当反射建立立方体贴图,请记住勾选“加载时建立立方体贴图(Build cubemaps on load )”复选框。

对于地图的发布版本,选择最终编译(Final Compile)选项。这将产生更高质量的2k分辨率的光照贴图。对于一台普通的家庭PC来说可能需要一段时间!