Notifications
Article
最佳实践:设置光照管线
Updated 10 months ago
914
1
本文来自 Unity Spotlight Team 的分享,XR技术研习社对此进行了编译。
目前 Unity 2018 提供了多种渲染管道,两种全局光照系统,四种光照模式,三种光线模式,以及两种 Shadowmask 模式,为开发者在创建面向高配PC、主机、移动和XR设备项目的过程中提供了高度灵活性。但是,作为 Unity 新手,如果不熟悉渲染的话,面对这些选择不免感到茫然,本文来自 Unity Spotlight Team 的分享,XR技术研习社对此进行了编译。
由于本文篇幅较长,为了方便阅读,将分两部分进行论述,以下是本文主题结构:
  • 定义
  • 概述
  • 渲染管线
  • 模板
  • 手动设置
  • 可扩展性
  • 兼容性
  • 全局光照系统
  • 静态 VS. 动态
  • 警告
  • 光线模式
  • 混合光照模式
  • 渲染管线对照表
  • 场景光照案例
  • 原型制作/快速预览
  • 3D移动策略游戏
  • 3A室内射击游戏 (固定日照时间)
  • 大逃杀类游戏 (日夜循环)
  • 总结

定义

首先介绍几个重要的图形渲染概念。
渲染管线决定对象如何在场景中呈现出来,分以下三个阶段:
  • 第一阶段:剔除(culling)。在此阶段列出需要被渲染的对象,优先呈现摄像机可见的范围,以及未被其它物体遮挡的对象。
  • 第二阶段:渲染(rendering)。 在此阶段,根据光照设置以及相关的光线属性,将对象绘制到基于像素的缓冲区中。
  • 第三阶段:后期处理(post-processing )。一般在缓冲区上执行操作,比如应用色彩分级(Color Grading)、光晕(Bloom)、景深(Depth of Field)等效果,将最终输出到每一帧。

着色器(Shader)是在GPU上运行的程序或程序集合的统称。比如,在剔除阶段完成之后,顶点着色器(vertex shader)将可见对象的顶点坐标从对象空间(object space)变换为剪辑空间(clip space),GPU使用新坐标对场景进行光栅化,即将矢量信息转换为实际像素。然后,像素(或片段)着色器将这些像素进行着色,像素颜色由材质属性和光照环境决定。另一种常见的着色器类型被称为计算着色器(compute shader),这种着色器使开发者能够利用GPU强大的并行处理能力进行任何类型的数学运算,比如光剔除、粒子物理、体积模拟等。
直接光照指的是来自光源(比如灯泡)的光照,并非光线从物体表面反射的结果。根据光源的大小及其与被照射物体的距离,这种光照通常会产生清晰且明显的阴影。需要注意以下两点:
  • 不要将直接光照与定向光照(directional lighting)混淆,定向光照是由无限远的光源(例如Unity中的定向光)发出的光,定向光的显着特性是能够使用定向且平行的光线覆盖整个场景,并且没有距离衰减(或光线衰减),也就是说,随着到光源距离的增加,物体接收的光照强度不会衰减。
  • 在现实世界中,太阳光与任何其他光源一样,光照强度与距离成反比。例如,水星上日光的照射强度几乎是地球的7倍,而火星接收的日光照射是地球的1/2,而冥王星只有地球的0.06%。然而,鉴于地球上有限的海拔高度,相较以上的距离,日光在地球上的衰减是微不足道的。因此,定向光完全能够模拟Unity场景中的阳光,包括大型的,以行星为中心的开放世界。另外,对于其他类型的光源(比如点光源和聚光灯),Unity 在高清渲染管线(HDRP)中能够提供基于物理的衰减。
间接光照是由光线从物体表面反射然后通过介质(比如如大气或半透明材料)传播和散射而产生的光照。在这种情况下,光线通常通过遮挡物形成相对柔和的阴影。
全局光照(GI)用于在场景中产生间接光照,主要作为直接光照的功能。 在业内,目前实现全局光照存在几种技术,比如光照贴图(lightmap)、辐照度体积(Irradiance Volume)、光线传播体积(Light Propagation Volume)、光线探针(light probe)、基于体素的GI和基于距离场的GI等,它们被广泛应用在像Unity、UE4、CryEngine、COD 等引擎中,对于Unity来说,使用光照贴图和光线探针来实现。
光照贴图技术通过发射光线计算光线反射,然后将生成的光照效果应用到纹理中,以此来生成光照贴图和光线探针的数据。因此,使用不同的光照贴图技术会呈现不同的光照效果。目前,Unity 使用两种光照贴图技术:Enlighten 和 Progressive Lightmapper(渐进式光照贴图)。

概述

以下流程图从内容创作者的角度展示了在Unity中设置光照的过程。
在整个流程中,首先需要选择渲染管线,然后决定如何生成间接光照并选择相应的全局光照系统。在确保所有全局光照设置都对项目进行了相应调整后,可以继续在场景中添加光线、自发光表面(Emissive Surface)、反射探针(Reflection Probe),光线探针以及Light Probe Proxy Volumes (LPPVs,光线探针代理体积)。详细介绍所有这些光照对象的用法和功能超出了本文的讨论范围,因此建议读者阅读Unity手册中关于光照部分的相关介绍,以了解如何在项目中正确使用它们。

渲染管线

在 Unity 2018 之前,只有一种渲染管线,现在称之为“内置渲染管线(Built-In Render Pipeline)”,该管线提供前向(forward)和延迟(deferred)两种渲染模式供用户选择。
  • 在(多通道)前向渲染模式中,场景中的所有对象按照一个统一的顺序逐个渲染,在多通道渲染过程中,当多个光源照亮对象时,渲染成本会显着增加,具体取决于影响每个对象的光源数量。这种类型的渲染器通常提供多种着色器,并且能够轻松处理透明度。
  • 在延迟渲染模式下,所有(包括不透明)几何体首先渲染到存储有关其材质信息(颜色、反射、平滑度等)的缓冲区中。稍后(在此体现延迟),每个像素被顺序着色,同时,渲染时间主要取决于影响每个像素的光源数量。透明对象和具有复杂着色器的对象仍需要额外的前向渲染通道进行渲染。在处理包含很多动态光线的场景时,建议使用延迟渲染,例如人工光照的室内场景,或需要室内外组合光照的项目。
在2018年1月,Unity 推出了 Scriptable Render Pipeline(SRP,可编程渲染管线),允许开发者通过C#脚本自定义渲染流程。这实际上是游戏引擎领域的一次变革——用户能够自由控制对象的剔除、绘制和后处理,而无需使用像C ++这样的底层编程语言。
Unity提供了两种SRP,目前为预览版,其设计充分考虑了硬件规格及性能:
  • 高清渲染管线(以下简称 HDRP)是一个综合了Deferred/Forward、Tile/Cluster (图块/簇)渲染方式的渲染器,提供高级渲染和着色功能,适用于需要展示高品质视觉效果的PC和主机项目。Tile渲染和Cluster渲染对比如下图所示:
其中,一个 Tile 代表帧中一小块二维正方形区域中的像素,一个 Cluster 代表摄像机两个截平面之间的三维空间。Tile 和 Cluster 渲染技术均依赖于影响每个Tile或Cluster的光线,然后在一个通道中根据与其相关光线来计算光照。不透明对象最有可能使用Tile系统进行着色,而透明对象则依靠Cluster系统。与内置渲染管道(延迟模式)相比,HDRP 的主要优势是更快的光照处理和更低的带宽使用。
  • 轻量级渲染管线(LWRP)是一种快速单通道前向渲染器,适用于具有较低实时光照要求的设备,例如智能手机、平板电脑和VR/AR设备。在该渲染管线中,会对光线进行逐对象剔除,并在一个通道中进行光照计算。与内置渲染管线相比,该管线能够减少绘制调用的次数。
通过使用以下决策树,读者可以使用几个关键条件判断决定使用何种渲染管线。

模板

可以通过 Unity 的 Package Manager (Window > Package Manager) 下载最新版本的 HDRP 和 LWRP应用到项目中。在项目中应用某个 SRP 比较快捷的方式是,在使用Unity Hub创建一个新项目时,选择相应的模板(Template),如下图所示。

手动设置

如果要手动设置HDRP或LWRP项目,请确保已安装所需的 package。以使用HDRP为例,可通过 Create > Rendering > High Definition Render Pipeline Asset 命令在 Project 面板中新建对应的资源,然后将此资源拖到 Graphics Settings 面板的 Scriptable Render Pipeline Settings 属性中,如果此处不指定任何资源,Unity 将默认使用内置渲染管线。如果使用 HDRP,需要确保在 Player Settings 中选择了线性(linear)色彩空间,并使用 Rendering > Scene Settings 命令在场景中添加一个场景设置游戏对象。

可扩展性

对于理解渲染技术并熟悉C#的开发者,如果需要为项目完全定制渲染器,建议尝试使用SRP的相关概念创建自己的渲染管线。鉴于LWRP拥有较小的着色器库且易于注入、移除、切换渲染通道,使得LWRP具有极强的可扩展性。

兼容性

在Unity中将项目中的材质从内置渲染管线切换到HDRP或LWRP比较容易,使用 Edit > Render Pipeline > Upgrade xxx... 相关命令即可完成,如下图所示。需要注意的是,此操作不可逆,建议事先做好项目备份。
尽管如此,自定义着色器需要进行手动移植,此过程相对比较耗时,具体取决于自定义着色器的数量。由于LWRP 和 HDRP 在物理表现上比内置渲染管道更加准确,尤其是在光衰减和分布方面,所以切换前后的项目看上去会有一些不同。此外,HDRP和LWRP之间互不兼容,因为它们没有相同的渲染特性,两者可以相互转换,但不是一键操作,需要手动重新设置光照、材质和着色器。
最后需要说明的是,HDRP和LWRP目前仍处于预览中,并非所有功能都已针对两种管线实现。比如,某些光照模式尚未完全适用于LWRP,并且HDRP目前尚不支持VR/AR,但是在未来版本中将逐步实现。

全局光照系统

Unity 提供两种全局光照系统,可在 Window > Rendering > Lighting Settings 中启用它们。
  • 实时全局光照(以下简称实时GI):该系统完全依赖于第三方光照中间件Enlighten。在Unity的预计算过程中,Enlighten先后经过两个阶段,包括:簇化(或集群化)和光传输。第一阶段将场景分解简化为以“簇”为单位进行组织的集合,在第二阶段计算簇与簇之间的可见性。预计算后的数据在运行时用于交互性地生成场景的间接光照。 Enlighten的优势在于能够实时改变间接光照效果,因为预计算的数据依赖于簇之间的关系。但是,与其他光照贴图技术一样,改变场景中的静态几何体将触发新的预计算。
  • 烘焙全局光照(以下简称烘焙GI): 光照信息被烘焙到光照贴图和光线探针中,烘焙GI 系统可以使用以下两种技术之一
Progressive Lightmapper
Enlighten
Progressive Lightmapper 优先计算对于摄像机可见物体的光照,并大大提高的光照计算速度,但代价是增加整个场景的总体烘焙时间。 该技术使用CPU通过路径追踪算法计算间接光照。基于GPU加速的 Progressive Lightmapper 能够大幅缩短场景的烘焙时间,目前正在处在研发中,在 Unity 2018.3.05b 中集成了该技术测试版。由于Enlighten和Progressive Lightmapper 使用了不同的技术计算光照,所以两者产生的光照效果会有不同。
下图列出了各全局光照系统的主要优缺点,可根据决策树选择项目需要使用的全局光照系统。

静态 VS. 动态

无论您使用哪种全局光照系统,Unity 都只会考虑标记为“Lightmap Static”的游戏对象。动态游戏对象需要借助场景中放置的光线探针来接收间接光照。
由于全局光照计算是一个相对缓慢的过程,因此只有具有明显光照变化的大型复杂资源才需要应标记为“Lightmap Static”。接收均匀光照的较小网格可保持为动态设置,然后通过使用 Light Probes 为其提供近似效果的间接光照效果。较大的动态游戏对象可以使用 Light Probe Proxy Volume(LPPV),以便在局部接收更好的间接光照。限制场景中静态游戏对象的数量对于提高烘焙时间同时保持足够光照品质至关重要。

警告

在Unity中可以同时使用烘焙和实时GI技术,但是,必须注意,同时使用会大大增加烘焙时间和程序运行时的内存消耗,因为这两个系统不使用相同的数据。此外,间接光照在运行时的交互式更新将给CPU带来额外的压力,并且在视觉上,烘焙和实时GI提供的间接光照效果会有差异,因为它们使用了不同的技术来模拟间接光照,并且通常在完全不同的分辨率下执行。若同时使用这两种技术,建议将使用范围限制在高端平台或具有可预测性能成本且严格把控场景的项目中,同时,建议由对所有光照设置有很好理解的团队成员负责,因为管理这两个系统相对复杂。
因此,对于大多数项目而言,尽量避免同时使用两种GI技术,选择其一是相对比较稳妥的做法。

光线模式

光线的模式通常容易混淆,最重要的是,只有使用烘焙GI时,光源模式的设置才有意义。在光线组件的属性面板中有三种模式可供选择:
1. Baked:光线的直接和间接光照被烘焙成光照贴图。设置为该模式后,该光线在程序运行时将不占用性能成本,同时,将生成的光照贴图应用到场景中的成本也较低。
2. Realtime:光线的直接光照和阴影需要实时计算,并且不会烘焙到光照贴图。设置为此模式时,该光线在程序运行时将占用一定的性能成本,具体取决于场景的复杂程度、需要投射阴影的光源数量、光照交叠的光源数量等。此外,如果启用实时GI,将进一步带来性能消耗,用于在程序运行时更新场景中的间接光照。
3. Mixed:一种提供烘焙和实时功能的混合模式,例如对光线的间接光照进行烘焙,同时对直接光照进行实时计算。场景中混合模式光线的行为和性能影响取决于我们将在后面介绍到的全局混合光照模式的选择。
如果不使用任何GI技术,或者仅使用实时GI,那么所有Baked和Mixed模式的光线都将被作为Realtime进行处理。
下图为读者提供了一个决策树和对照表,当为场景添加光线时,有助于选择合适的光线模式。

混合光照模式

如上所述,混合模式的光照兼具烘焙和实时功能,具体取决于在 Lighting 窗口中选择的 Lighting Mode,如下图所示:
Unity有如下四种光照模式可供选择:
1. Subtractive
2. Baked Indirect
3. Shadowmask Mode: Shadowmask
4. Shadowmask Mode: Distance Shadowmask
可以在Edit > Project Settings > Quality下选择Shadowmask和Shadow Distance ,若项目使用的是HDRP,则在Graphics Settings中指定的 HDRenderPipelineAsset 中,默认已经启用 了Shadowmask模式,同时可以在场景中的 Scene Settings 游戏对象(若没有,需要创建)中可以设置Max Distance的值,如下图所示:
HDRP支持一种新的混合Shadowmask模式,可以通过光源组件的Additional Settings中的 Non Lightmapped Only选项,控制该光线是否投射实时阴影,如下图所示。若勾选此项,当摄像机处于Fade Distance内时,光线将投射实时动态阴影,若不勾选此项,将使用烘焙的Shadowmask来产生阴影。

渲染管线对照表

LWRP和HDRP目前仍处于预览状态,这也就意味着,一方面带来了新的功能,另一方面,原来内置管线提供的某些功能目前在LWRP或HDRP中不被支持。下表列出了在Unity 2018.3中各渲染管线的特性对比。

场景光照案例

以上介绍了各渲染管线及其主要特性,下面将通过几个示例项目具体说明如何应用Unity中的光照技术,每个项目均具有一定的代表性,读者可据此对应到自己的项目。
1. 原型制作/快速预览
如果项目重度依赖Asset Store中的资源来构建产品原型,使用内置渲染管线可能是目前唯一适用的方案,因为资源商店中的大多数资源多数与HDRP和LWRP不完全兼容,尽管如此,这种情况将随着时间的推移而得到改善。如果项目中的资源由团队内部自建,并且已经清楚了解项目需求,那么可以选择两个SRP中的一个(即LWRP或HDRP),或这创建自定义的SRP。
当项目处于开发的早期阶段,如果需要快速的迭代并且在光照方面获得最大的灵活性,使用完全实时的方案可能更加实际,即关闭烘焙和实时GI,如下图所示,这样就不需要进行任何光照预计算的过程。在这种情况下,为了查看间接光照效果,可以考虑使用 Unity 的 Post Processing Stack V2插件,启用Ambient Occlusion(环境光遮蔽)效果实时查看由间接光照产生的阴影效果。
2. 3D移动策略游戏
如果项目的目标平台是移动设备,LWRP可能是确保游戏性能稳定的绝佳选择。如果需要定制渲染管线以更好地适应游戏,图形开发人员可直接扩展LWRP。
如果项目使用LWRP并烘焙GI,需要注意的是,目前只有Subtractive光照模式可用于Mixed 模式的光线,Unity将在以后的版本中添加Baked Indirect和Shadowmask光照模式对Mixed 光线的支持。
如果出于某些原因而使用了之前的内置渲染管线,比如,项目过多依赖Asset Store中的资源,或者希望支持所有混合光照模式,在这种情况下,使用Shadowmask光照模式将能够提供烘焙阴影,同时动态对象仍然能够投射实时阴影。如果Shadowmasks对于项目来说性能成本较大,可以退而选择更加节省资源的Subtractive光照模式。最后,如果场景中的光线数量非常少,并且项目的目标平台更多考虑低端硬件设备,建议使用前向渲染。
3. 3A室内射击游戏 (固定日照时间)
如果项目为了在PC和主机上为第一人称射击游戏呈现3A级视觉效果,那么HDRP是首选渲染管线。同样,图形开发人员也可以开发自定义SRP。如果场景中包含许多投射实时阴影的光线(比如可被击毁或移动的光线道具),那么使用使用Baked Indirect光照模式烘焙GI,能够使Mixed和Baked模式的光线产生良好的间接光照效果。如果场景中投射静态阴影的光线占比较多,推荐使用Shadowmasks光照模式,因为HDRP提供了一个很好的混合Shadowmask模式,可以更好地混合实时阴影和烘焙阴影。
由于运行这类游戏的硬件配置和性能较高,所以可同时使用烘焙和实时GI技术。但是,正如全局光照部分所述,同时使用这两种技术将显着增加性能成本和烘焙时间,并且建议由了解所有技术细节的团队成员进行设置。
4. 大逃杀类游戏 (日夜循环)
如果项目是运行在PC和主机上的大逃杀类游戏,建议选择 HDRP或者自定义扩展HDRP,因为这类游戏通常具有大规模场景和完全动态的光照。如果项目不是为了实现3A级的视觉效果,并且针对的是移动设备或配置较低的设备,可以考虑使用 LWRP。
为了实现昼夜循环效果,如果选择了HDRP,则需要使用实时GI,以便在一天中的任何时间点模拟间接光照。为了在某些密集光照的室内场景中实现最佳性能并最大限度地降低渲染成本,可以将某些光线的Indirect Multiplier(间接乘数)设置为0,如下图所示:
LWRP不支持实时GI,昼夜循环必须使用自定义脚本来处理,比如,在一天中调整太阳和环境光的颜色。
对于这种类型的游戏,不建议同时使用烘焙和实时GI技术,因为性能和场景管理方面产生的巨大开销,对项目来说是一个不可忽视的关键因素。另外一个原因是,这类大型多人游戏的不可预测性,比如,性能消耗可能比密集脚本开发的单人游戏更高。

总结

由于引入了Scriptable Render Pipelines,在过去的几个月中,Unity的渲染水平发生了根本性的变化,希望本指南能够使读者更好地了解每个渲染管线的功能,以便在自己的项目中使用合适的光照方案。
Tags:
Comments
Shuang Wang
Staff
5 months ago
Are you ok?
太赞了
0