Version: 2019.3
动态光照
专家指南

最佳实践:设置光照管线

定义

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

  • 渲染管线确定场景中对象的显示方式,分为三个主要阶段。
    • 第一步是剔除;它列出了需要渲染的对象,最好是那些对摄像机可见的对象(视锥体剔除)和其他对象不遮挡的对象(遮挡剔除)。
    • 第二个阶段渲染是指将这些对象绘制到基于像素的缓冲区中(通过正确的光照以及它们的一些属性)。
    • 最后,可以在这些缓冲区上执行后期处理操作,例如,应用颜色分级、泛光和景深,从而生成发送到显示设备的最终输出帧。根据帧率,这些操作每秒钟重复很多次。
  • 着色器是在图形处理单元 (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 和游戏主机项目而设计。

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

  • The Universal Render Pipeline (URP) is a fast single-pass forward renderer; it has been designed for devices with lower real-time lighting requirements in mind, such as smartphones, tablets and XR devices. The lights are culled per-object and allow for the lighting to be computed in one single pass, which results in reduced draw calls compared to the Built-In Render Pipeline.

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

模板

You can download the latest versions of the HDRP and URP via the Unity Package Manager (Window > Package Manager). The easiest way to get started with one of these SRPs is to create a new project with the Unity Hub and use one of the corresponding templates.

手动步骤

If you want to set up your project for the HDRP or URP by hand, ensure you have the required package installed. Then create a new asset in your Project window via Create > Rendering > High Definition Render Pipeline Asset. Drag this asset into the Graphics settings. In case you selected the HDRP, ensure the linear color space is selected in the Player settings for your platform and add a Rendering > Scene Settings object into your scene.

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

可扩展性

If you have some rendering knowledge and are familiar with C#, experimenting with the SRP concept to create your own Custom Scriptable Render Pipeline is definitely recommended if you need to fully tailor the renderer for your project. The URP is especially easy to extend, due to its smaller shader library and the ability to inject, remove and swap rendering passes easily.

兼容性

Porting your project’s materials from the Built-In Render Pipeline to the HDRP or to the URP is relatively easy in Unity, thanks to a 1-click material converter under Edit > Render Pipeline > Upgrade…; be aware, however, that it is a non-reversible action. Backing up your project beforehand is highly recommended!

Nevertheless, custom shaders will have to be ported by hand, so transitioning from the Built-In Render Pipeline to the HDRP or URP during production might be time-consuming, depending on the number of custom shaders you would have to rewrite.

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

Furthermore, the HDRP and the URP are not cross-compatible, as they do not share the same rendering features. Porting your project from HDRP to URP and vice versa is possible, but it is not a 1-click operation and will require manual rework of the lighting, the materials and the shaders!

Finally, the HDRP and the URP are still in preview and Unity is hard at work ensuring they will be production-ready very soon. Please be aware that not all features have been implemented yet for both pipelines. For instance, certain lighting modes that I detail below are not yet fully available for the URP, and XR is not yet properly supported by the HDRP.

全局光照系统

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

  1. (Precomputed) Realtime Global Illumination: This system entirely relies on Enlighten, a third-party lighting middleware. During the precomputation in Unity, Enlighten goes through two lengthy stages, among others: Clustering and Light Transport. The first one consists in simplifying the scene into a collection of surface patches called clusters, and the second, in calculating the visibility between these clusters. This precomputed data is used at runtime to generate the indirect lighting interactively. The strength of Enlighten relies on the ability to edit the lighting in realtime, as the precomputed data relies on the relation between clusters. However, like in other traditional lightmapping techniques, editing the static geometries in your scene will trigger a new precomputation.

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

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

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

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

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

静态与动态对比

No matter which Global Illumination system you use, Unity will only consider objects that are marked as “Contribute GI” during the baking/precomputing of the lighting. Dynamic (i.e. non-static) objects have to rely on the Light Probes you placed throughout the scene to receive indirect lighting.

Because the baking/precomputing of the lighting is a relatively slow process, only large and complex assets with distinct lighting variations, such as concavity and self-shadowing, should be tagged as “Contribute GI”. Smaller and convex meshes that receive homogeneous lighting should not be marked as static, and they should therefore receive indirect lighting from the Light Probes which store a simpler approximation of the lighting. Larger dynamic objects can rely on LPPVs, in order to receive better localized indirect lighting. Limiting the number of objects tagged as “Contribute GI” in your scene is absolutely crucial to minimize baking times while maintaining an adequate lighting quality. You can learn more about this optimization process and the importance of Probe lighting in this tutorial.

警告

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 值范围内)使用烘焙的阴影遮罩,而不是实时阴影。

管线比较表

The URP and HDRP are still in preview, which means that on the one hand they bring exciting new features to the table, but on the other hand, they might not support certain functions offered by the Built-In Pipeline yet, or drop support for others. The following table gives you an overview of the current state of the lighting pipeline for Unity 2018.3.

光照情形

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

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

If you heavily rely on the Asset Store to build your prototype, the Built-In Render Pipeline could be the only suitable render pipeline, as most assets found on the Store are not fully compatible with the HDRP and URP; nonetheless, asset compatibility will improve over time. If you are building all the assets from the ground up and already have a clear idea of your project’s requirements, then you could pick one of the two SRPs (i.e. URP or HDRP) or create a custom one.

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

2.3D 手机策略游戏

If you are targeting mobile devices, the URP could be a great candidate to ensure solid performance for your strategy game. If the rendering pipeline needs to be customized to better suit your game, a graphics programmer will probably find extending the URP straightforward.

If you pick the URP and use Baked Global Illumination, be aware that at the moment, only the Subtractive Lighting Mode is available for the Mixed lights. Support for Baked Indirect and Shadowmask will be added in a later release.

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

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

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

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

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

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

If you plan to release a battle royale game for PC and consoles, that features large-scale environments and fully dynamic lighting, you should select the HDRP, or extend it to tailor the rendering pipeline to your project. You could consider the URP if you are not aiming for AAA visual fidelity and are targeting mobile devices or systems with lower specifications.

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

The URP does not support the Realtime Global Illumination system: the day-night cycle would have to be handled with a custom script that would, for instance, modulate the sun and ambient color throughout the day.

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

结束语

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

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

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


  • 2018–08–17页面已发布
动态光照
专家指南
Copyright © 2023 Unity Technologies
优美缔软件(上海)有限公司 版权所有
"Unity"、Unity 徽标及其他 Unity 商标是 Unity Technologies 或其附属机构在美国及其他地区的商标或注册商标。其他名称或品牌是其各自所有者的商标。
公安部备案号:
31010902002961