Version: 2019.1
动态光照
专家指南

最佳实践:设置光照管线

定义

首先,让我们来看看在本指南中经常遇到的几个重要图形渲染术语的定义。

  • 渲染管线确定场景中对象的显示方式,分为三个主要阶段。
    • 第一步是剔除;它列出了需要渲染的对象,最好是那些对摄像机可见的对象(视锥体剔除)和其他对象不遮挡的对象(遮挡剔除)。
    • 第二个阶段渲染是指将这些对象绘制到基于像素的缓冲区中(通过正确的光照以及它们的一些属性)。
    • 最后,可以在这些缓冲区上执行后期处理操作,例如,应用颜色分级、泛光和景深,从而生成发送到显示设备的最终输出帧。根据帧率,这些操作每秒钟重复很多次。
  • 着色器是在图形处理单元 (GPU) 上运行的程序或程序集合的通用名称。例如,在剔除阶段完成后,顶点着色器用于将可见对象的顶点坐标从“对象空间”转换为称为“裁剪空间”的不同空间;然后 GPU 使用这些新的坐标对场景进行光栅化,也就是将场景的矢量表示转换为实际像素。在稍后阶段,这些像素将由像素(或片元)着色器进行着色;像素颜色通常将取决于各自表面的材质属性以及周围的光照。现代硬件上另一种常见的着色器是计算着色器:计算着色器允许程序员利用 GPU 的大量并行处理能力,用于任何类型的数学运算,如光照剔除、粒子物理或体积模拟。

  • 直接光照指的是从自发光光源(如灯泡)发出的光照,而不是光从表面反射的结果。根据光源的大小及其与接收者的距离,这种光照通常会产生清晰的不同阴影。
    • 请勿将直接光照与方向光照混淆,后者是指是由无限远的光源(例如计算机模拟的太阳)发出的光。方向光的显著特性是能够用平行光线覆盖整个场景,并且不存在距离衰减(或光衰减);也就是说,接收到的光照量不会随着与光源距离的增加而衰减。
    • 在现实中,太阳光也会像任何其他光源一样,光照会按照距离的平方反比定律而衰减。简单来说,当接收者与光源之间的距离增加时,收到光照量会迅速降低。例如,水星上的太阳光照度几乎是地球上的 7 倍,火星上的太阳光照度是地球的近一半,而冥王星仅仅为 0.06%。然而,对于海拔高度范围非常有限的大多数实时应用程序来说,太阳光的衰减微不足道。因此,方向光完全足以模拟大多数 Unity 场景(包括以行星为中心的大型空旷空间)中的太阳光。对于其他类型的光源(如点光源和聚光灯),当您选择高清渲染管线时,Unity 现在可提供基于物理的衰减。
  • 间接光照是由于光从表面反射并通过介质(如大气或半透明物质)传播和散射而形成的结果。在这种状况下,遮挡物通常投射出柔和甚至难以看清的阴影。

  • 全局光照 (GI) 用于在场景中生成间接光照,主要作为直接光照的函数。GI 有几种方法,如烘焙/动态光照贴图、辐照度体积、光传播体积、烘焙/动态光照探针、基于体素的 GI 和基于距离场的 GI。Unity 支持开箱即用的烘焙/动态光照贴图和光照探针。
    • 光照贴图程序是一个基础系统,它通过发射光线、计算光线反弹并将产生的光线应用到纹理来生成光照贴图和光照探针的数据。因此,不同的光照贴图程序通常会产生不同的光照外观,因为它们可能依赖不同的技术来生成光照数据。目前,Unity 提供两个光照贴图程序:Enlighten 和 Progressive Lightmapper(渐进光照贴图程序)。有关 GI 系统及其光照贴图程序的更多详细信息将在本指南的下一节中提供。

概述

下面的流程图从内容创建者的角度,大致显示了 Unity 中的整个光照管线。

首先要选择一个渲染管线。然后决定如何产生间接光照,并相应地选择一个全局光照系统。确保为您的项目适当地调整了所有全局光照设置之后,您可以继续添加光源发光表面反射探针光照探针光照探针代理体 (LPPV)。所有这些光照对象的用法和特性的详细介绍超出了本文的范围,因此,建议您阅读手册中的“光照”部分,以学习如何在项目中正确地使用光照。

渲染管线

截至 2018 年初时,Unity 只有一条渲染管线可用;此管线已重命名为“内置渲染管线”(Built-In Render Pipeline)。此渲染器提供了前向渲染和延迟渲染以供选择。

  • 在(多通道)前向模式中,场景中的所有对象都是按顺序渲染,根据影响每个对象的光源数量,可能在多个通道中渲染,因此当对象被多个光源照亮时,渲染成本会急剧增加。这种类型的渲染器通常提供各种各样的着色器,并且可以很轻松地处理透明度。
  • 在延迟模式下,所有(不透明)几何体首先渲染到缓冲区中,在其中存储有关材质的信息(颜色、镜面反射、光滑度等等)。在后一种通道(也就是“延迟”)中,每个像素按顺序着色:渲染时间将主要取决于影响每个像素的光源数量。对于透明对象以及某些包含复杂着色器的对象,仍然需要额外的前向渲染通道。当处理包含许多动态光源的场景时(例如具有人工光照的内部空间,或室外与室内光照相结合的项目),通常建议使用延迟渲染。

2018 年 1 月,我们推出了可编程渲染管线 (SRP),允许通过 C# 脚本来自定义渲染循环。这实际上是游戏引擎领域的一次小革命:用户终于无需使用像 C++ 这样的低级编程语言便可以个性化设置对象剔除、绘制和帧后期处理。

Unity 目前提供了两个预览版 SRP,它们的设计考虑到了性能和现代硬件:

  • 高清渲染管线 (HDRP) 是一种混合延迟/前向瓦片/聚类渲染器。它提供了先进的渲染和着色功能,是专为要求逼真视觉的 PC 和游戏主机项目而设计。

瓦片是帧的一个小型二维方形像素部分,而聚类则是摄像机视锥体中的一个三维体积。瓦片和聚类渲染技术都依赖于影响每个瓦片和聚类的光源的列表,然后可以用相应的已知光源列表在一个通道中计算其光照。不透明对象很可能使用瓦片系统进行着色,而透明对象则依赖于聚类系统。该渲染器的主要优点是,与内置渲染管线(延迟)相比,光照处理速度更快,带宽消耗也大大减少,因为内置渲染管线依赖于更慢的多通道光照积累。

  • 轻量级渲染管线 (LWRP) 是一种快速的单通道前向渲染器;它是为实时光照要求较低的设备而设计的,例如智能手机、平板电脑和 XR 设备。轻量级渲染管线根据每个对象来剔除光线,并允许在单个通道中计算光照,与内置渲染管线相比,这会降低绘制调用次数。

现在,您可以使用下面的决策图表来快速确认您应该根据几个关键标准选择哪一种渲染管线。

模板

可以通过 Unity Package Manager (Window > Package Manager) 来下载最新版本的 HDRP 和 LWRP。要使用这些 SRP 的其中之一,最简单的方法是使用 Unity Hub 来创建一个新项目并使用其中一个对应的模板。

手动步骤

如果要为项目手动设置 HDRP 或 LWRP,请确保安装了所需的包。然后在 Project 窗口中通过 Create > Rendering > High Definition Render Pipeline Asset 来创建一个新资源。将此资源拖动到 Graphics 设置中。如果选择了 HDRP,请确保在平台的 Player 设置中选择线性颜色空间,并在场景中添加 Rendering > Scene Settings 对象。

如果在 Graphics Project Settings 窗口中没有分配任何管线资源,则 Unity 将使用默认的内置渲染管线 (Built-In Render Pipeline)。

可扩展性

如果您略懂渲染方面的知识,并且熟悉 C#,在您需要为项目完全定制渲染器时,我们绝对推荐使用 SRP 概念来创建您自己的自定义可编程渲染管线。因为 LWRP 的着色器库较小并且能够轻松注入、删除和交换渲染通道,因此可以对 LWRP 进行轻松扩展。

兼容性

在 Unity 中将项目的材质从内置渲染管线移植到 HDRP 或 LWRP 相对比较容易,这要归功于 Edit > Render Pipeline > Upgrade… 下的一键材质转换器。然而,请注意,这种操作是不可逆的。强烈建议提前备份您的项目!

尽管如此,必须手动移植自定义着色器,因此在生产过程中从内置渲染管线过渡到 HDRP 或 LWRP 可能会耗费时间,具体时间取决于必须重新编写的自定义着色器数量。

此外,由于高清渲染管线在物理上比内置渲染管线更正确,特别是在光衰减和分布方面,因此在切换到 HDRP 之后,项目应该会有所不同。

此外,HDRP 和 LWRP 并不是交叉兼容的,因为它们没有共同的渲染特征。可以将项目从 HDRP 移植到 LWRP,反过来也可以,但并不是一键操作,而是需要手动重新制作光照、材质和着色器!

最后,HDRP 和 LWRP 仍然是预览版,Unity 正在努力确保这两个功能尽快可供生产阶段使用。请注意,这两个管线尚未实现所有功能。例如,下面详述的某些光照模式尚未完全适用于 LWRP,XR 还没有得到 HDRP 的正确支持。

全局光照系统

Unity 中有两个全局光照系统。可以在 Window > Rendering > Lighting Settings 中启用它们。

1.(预计算)实时全局光照:这个系统完全依赖于第三方光照中间件 Enlighten。在 Unity 中的预计算期间,Enlighten 经历两个漫长的阶段:聚类和光线传输。第一个阶段是将场景简化为一组称为聚类的面片,第二个阶段是计算这些聚类之间的可见性。在运行时,这些预计算的数据用于以交互方式生成间接光照。Enlighten 的强大功能依赖于实时编辑光照的能力,因为预计算的数据依赖于聚类间的关系。然而,与其他传统的光照贴图技术一样,编辑场景中的静态几何体将触发新的预计算。

2.烘焙全局光照:光照被烘焙成称为光照贴图的纹理以及光照探针。烘焙 GI 系统可以使用下列其中一个光照贴图程序:

1.[渐进光照贴图程序 (Progressive Lightmapper)](https://docs.unity3d.com/Manual/ProgressiveLightmapper.html)
2.[Enlighten](https://docs.unity3d.com/Manual/GI-Enlighten.html)

渐进光照贴图程序可以优先计算摄像机视野内对象的光照,并大大加快光照的迭代速度,而代价是增加整个场景的整体烘焙时间。渐进光照贴图程序使用 CPU 根据路径追踪来计算间接光照。一种新的 GPU 渐进光照贴图程序目前正在开发中,这将极大降低场景的烘焙时间。

因为 Enlighten 和渐进光照贴图程序使用不同的方法产生烘焙光照,因此在比较这两者时,不应该期望得到完全匹配的光照效果。

请查看下面的图表,确定项目适合使用哪种全局光照系统,以及该系统的主要优点和缺点

静态与动态对比

无论使用哪种全局光照系统,在烘焙/预计算光照过程中,Unity 只会考虑标记为“Lightmap Static”的对象。动态(即非静态)对象必须依赖于放置在整个场景中的光照探针来获得间接光照。

由于光照的烘焙/预计算是一个相对缓慢的过程,所以只有具有不同光照变化(例如凹度和自我阴影)的大型和复杂资源才应被标记为“Lightmap Static”。获得均匀光照的较小和凸面网格不应标记为静态,因此它们应该从光照探针获得间接光照;光照探针中存储了更简单的光照近似值。较大的动态对象可以依赖 LPPV,以便获得更好的本地化间接光照。要最大程度减少烘焙时间并同时保持足够的光照质量,最重要的就是限制场景中标记为“Lightmap Static”的对象数量。可在本教程中详细了解这个优化过程和探针光照的重要性。

警告

Unity 允许烘焙和实时 GI 系统同时有效,因此可以访问所有光照功能。但是,务必注意,同时启用这两个系统会大大增加运行时的烘焙时间和内存使用量,因为这些系统不依赖相同的数据集。此外,在运行时对间接光照的交互式更新将给 CPU 带来更大的压力,而且在视觉上比较烘焙和实时 GI 系统提供的间接光照时,应该会看到差异,因为它们依赖不同的技术来模拟间接光照,并且通常以明显不同的分辨率运行。

同时使用这两个 GI 系统应仅限于高端平台和/或以可预测的成本对场景进行严格控制的项目。这种方法只应由非常了解所有光照设置的专家用户使用,因为同时管理这两个系统会增加很大的复杂性。所以,对大多数项目来说,选择两个 GI 系统的其中一个通常是更安全的策略。很少推荐同时使用这两个系统!

光照模式

光源的模式是一种常常让人混淆的属性。最重要的是,只有启用了烘焙全局光照系统时,光源的模式才有意义。

Light Inspector 中提供了三种可用模式:

1.烘焙:从这些光源产生的直接和间接光照被烘焙成光照贴图,这可能是一个耗时的过程。处理这些光源不需要运行时成本,但是将所产生的光照贴图应用到场景中确实需要很小的成本。 2.实时:来自这些光源的直接光照和阴影是实时的,因此不会被烘焙成光照贴图。它们的运行成本可能很高,具体取决于场景的复杂性、阴影投射光源的数量、重叠光源的数量等。此外,如果启用实时全局光照,则会在运行时更新间接光照,从而导致性能进一步降低。 3.混合:这种混合模式提供烘焙和实时功能(如烘焙间接光照和实时直接光照)的混合。场景中所有混合光源的行为及其性能影响将取决于所选择的全局混合光照模式(如下一节中所述)。

如果不使用任何 GI 系统或只使用实时 GI 系统,那么所有烘焙和混合光源都将被覆盖为实时光源!

下面的图表结合了一个决策流程图和一个比较表;可以帮助您决定每次在场景中添加新光源时哪种光源模式合适。

混合光照模式

如前面的图表中所示,混合光源具有特定的烘焙和实时功能,具体取决于您在 Lighting > Settings 窗口中选择的全局混合光照模式。

有四种模式可供选择:

1.Subtractive 2.Baked Indirect 3.Shadowmask Mode: Shadowmask 4.Shadowmask Mode: Distance Shadowmask

可以在 Edit > Settings > Quality 下面调整阴影遮罩模式 (Shadowmask mode) 和阴影距离 (Shadow Distance)。使用 HDRP 时,在 Graphics 设置中分配的 HDRenderPipelineAsset 中会启用阴影遮罩模式 (Shadowmask mode),而阴影 Max Distance 是在 Scene Settings 对象中设置的。

HDRP 支持新的混合阴影遮罩模式。可以通过 Additional Settings 中的 Non Lightmapped Only 复选框来控制某个特定光源是否应投射实时阴影。如果使用这个参数,那么当摄像机在光源的 Fade Distance 值范围内时,光源会实时投射动态阴影,否则会回退到烘焙的阴影遮罩。这种新的 HDRP 模式的主要优点是能够针对特定光源(位于主方向光使用的 Shadow Distance 值范围内)使用烘焙的阴影遮罩,而不是实时阴影。

管线比较表

LWRP 和 HDRP 仍然处于预览版,这意味着它们一方面带来了令人兴奋的新特性,但另一方面,它们可能还不支持内置管线提供的某些功能,或者去除了对其他功能的支持。下表概述了 Unity 2018.3 的光照管线的当前状态。

光照情形

我们已经介绍了渲染管线和主要光照功能,现在让我们看看几个项目的例子,看看可以使用哪些设置来提供光照。由于每个项目都是独一无二的,因此您可能会根据自己的需求使用稍微不同的选项。

1.原型构建或快速预先可视化

如果您严重依赖 Asset Store 来构建原型,则内置渲染管线可能是唯一合适的渲染管线,因为商店中的大多数资源并不完全兼容 HDRP 和 LWRP;尽管如此,资源兼容性将随着时间推移而改善。如果您要从头开始构建所有资源,并且已经清楚了解了自己项目的需求,那么您可以从这两个 SRP(即 LWRP 或 HDRP)中选择一个,或者创建一个自定义 SRP。

如果处于(预)生产的早期阶段,并且需要快速周转时间和最大的光照灵活性,您可能更想要使用一种不需要任何预计算的完全实时方法,因此您可能希望同时关闭烘焙和实时 GI 系统。为了缓解缺少正确间接光照的问题,您可以从 Post Processing Stack V2 启用屏幕空间环境光遮挡 (Screen Space Ambient Occlusion):该功能可以提供低成本的实时接触阴影,从而帮助场景中的对象上底色。

2.3D 手机策略游戏

如果目标平台是移动设备,LWRP 可能是很好的候选项,可确保策略游戏的扎实性能。如果需要自定义渲染管线以更好地适应游戏,图形开发程序员可能会发现,扩展 LWRP 会更加简单明了。

如果选择 LWRP 并且使用烘焙全局光照,请注意,目前混合光源只能使用减法光照模式 (Subtractive Lighting Mode)。以后的版本中将增加对烘焙间接光照 (Baked Indirect) 和阴影遮罩 (Shadowmask) 的支持。

或者,如果您决定坚持使用旧的内置渲染管线,例如,由于您依赖 Asset Store 中的许多资源,那么所有全局混合光照模式都受支持。在这种情况下,采用阴影遮罩光照模式 (Shadowmask Lighting Mode) 的方法将提供烘焙阴影,同时仍然允许动态对象投射实时阴影。如果阴影遮罩对您的项目来说成本过高,则可以回退到最低成本的 Subtractive 模式。最后一点,如果关卡中有非常少的光源,且目标平台采用旧硬件,那么前向渲染路径可能是最好的选择。

3.AAA 级走廊射击游戏(一天中的固定时间)

如果目标是在 PC 和游戏主机上实现线性第一人称射击游戏的 AAA 级质量视觉效果,HDRP 应该是首选的渲染管线。同样,还可以在图形开发程序员的帮助下开发自定义 SRP。

如果关卡包含许多投射实时阴影的光源(例如,可破坏的灯光道具和移动光源),那么应该将烘焙 GI 系统与 Baked Indirect 模式配合使用,这样可以确保混合方向光和静态灯光道具中的烘焙光源呈现出良好的间接光照效果。如果关卡中大部分都是投射固定阴影的光源,那么推荐使用阴影遮罩的方法,因为 HDRP 提供了一个很好的混合阴影遮罩模式,允许更精细地控制实时阴影和烘焙阴影之间的混合。

因为这类线性游戏在性能和内存消耗方面通常是高度可预测的,所以烘焙和实时 GI 系统可以同时被激活。但是,正如全局光照部分中所介绍的,同时使用这两个系统将极大增加性能成本和烘焙时间,而且只应由了解所有技术含义的专家用户使用!

4.大逃杀游戏(昼夜周期)

如果您计划发布一款面向 PC 和游戏主机的大逃杀类型游戏(特征是包含大规模环境和完全动态光照),那么应该选择 HDRP,或者进行扩展以便为项目量身定制渲染管线。如果目标不是实现 AAA 级逼真视觉效果,而是面向低规格的移动设备或系统,那么可以考虑使用 LWRP。

为了适应昼夜周期,如果选择了 HDRP,实时 GI 系统应该被激活,因此可以模拟一天中任何时候的间接光照。对于某些光照密集型内部空间,如果希望让实时 GI 系统忽略这些内部空间,并将它们的渲染成本降到最低,您可以将某些光源的 Indirect Multiplier 属性设置为 0,从而在这些空间中最大限度提高性能。

LWRP 不支持实时全局光照系统:必须使用自定义脚本来处理昼夜周期,例如,通过脚本调节一天中的太阳和环境颜色。

对于这个特定的场景,不建议同时激活实时 GI 系统和烘焙 GI 系统,因为对于庞大的关卡,性能和场景管理方面产生的开销可能至关重要。反对同时使用这两个 GI 系统的另一个理由是,这样大规模的多人游戏存在着不可预知性:例如,性能估算要远远难于高度可编程的单人冒险游戏。

结束语

由于引入了可编程渲染管线,Unity 中的渲染架构在过去的几个月中发生了翻天覆地的变化。因此,要弄清楚所有这些变化及其对光照管线的影响可能会令人筋疲力尽。

希望本指南和及其多个插图能让您更好地理解每个渲染管线的功能,从而能在 Unity 中满怀信心地使用合适的光照设置让您项目大放异彩!

可通过以下文章来详细了解 Unity 中的光照和渲染管线:


动态光照
专家指南