目前Unity提供了多种渲染管道,两种全局照明系统,四种照明模式,三种灯光模式,以及两种Shadowmask模式,为开发者在创建面向高配PC、主机、移动和XR设备项目的过程中提供了高度灵活性。但是,作为Unity新手,如果不熟悉渲染的话,面对这些选择不免感到茫然,本文来自Unity Spotlight Team的分享,XR技术研习社对此进行了编译。
以下是本文主题结构:
•定义
•概述
•渲染管线
o模板
o手动设置
o可扩展性
o兼容性
•全局光照系统
o静态VS.动态
o警告
•灯光模式
o混合照明模式
•渲染管线对照表
•场景照明案例
o原型制作/快速预览
o 3D移动策略游戏
o 3A室内射击游戏(固定日照时间)
o大逃杀类游戏(日夜循环)
•总结
定义
首先介绍几个重要的图形渲染概念。
•渲染管线决定对象如何在场景中呈现出来,分以下三个阶段:
o第一阶段:
剔除(culling)。在此阶段列出需要被渲染的对象,优先呈现摄像机可见的范围,以及未被其它物体遮挡的对象。
o第二阶段:
渲染(rendering)。在此阶段,根据光照设置以及相关的灯光属性,将对象绘制到基于像素的缓冲区中。
o第三阶段:
后处理(post-processing)。一般在缓冲区上执行操作,比如应用Color Grading、Bloom、Depth of Field等效果,将最终输出到每一帧。
•
着色器(Shader)是在GPU上运行的程序或程序集合的统称。比如,在剔除阶段完成之后,顶点着色器(vertext shader)将可见对象的顶点坐标从对象空间(object space)变换为剪辑空间(clip space),GPU使用新坐标对场景进行光栅化,即将矢量信息转换为实际像素。然后,像素(或片段)着色器将这些像素进行着色,像素颜色由材质属性和光照环境决定。另一种常见的着色器类型被称为计算着色器(compute shader),这种着色器使开发者能够利用GPU强大的并行处理能力进行任何类型的数学运算,比如光剔除、粒子物理、体积模拟等。
•直接照明指的是来自光源(比如灯泡)的照明,并非光线从物体表面反射的结果。根据光源的大小及其与被照射物体的距离,这种照明通常会产生清晰且明显的阴影。需要注意以下两点:
o不要将直接照明与定向照明(directional lighting)混淆,定向照明是由无限远的光源(例如Unity中的平行光)发出的光,定向光的显着特性是能够使用平行光线覆盖整个场景,并且没有距离衰减(或光衰减),也就是说,随着到光源距离的增加,物体接收的照明强度不会衰减。
o在现实世界中,太阳光与任何其他光源一样,光照强度与距离成反比。例如,水星上日光的照射强度几乎是地球的7倍,而火星接收的日光照射是地球的1/2,而冥王星只有地球的0.06%。然而,鉴于地球上有限的海拔高度,相较以上的距离,日光在地球上的衰减是微不足道的。因此,平行光完全能够模拟Unity场景中的阳光,包括大型的,以行星为中心的开放世界。另外,对于其他类型的光源(比如点光源和聚光灯),Unity在高清渲染管线(HDRP)中能够提供基于物理的衰减。
•间接照明是由光线从物体表面反射然后通过介质(比如如大气或半透明材料)传播和散射而产生的照明。在这种情况下,光线通常通过遮挡物形成相对柔和的阴影。
•全局照明(GI)用于在场景中产生间接照明,主要作为直接照明的功能。在业内,目前实现全局照明存在几种技术,比如光照贴图(lightmaps)、Irradiance Volumes、Light Propagation Volumes、光照探头(light probes)、基于体素的GI和基于距离场的GI等,它们被广泛应用在像Unity、UE4、CryEngine、COD等引擎中,对于Unity来说,使用光照贴图和光照探头来实现。
o光照贴图技术通过发射光线计算光线反射,然后将生成的光照效果应用到纹理中,以此来生成光照贴图和光照探头的数据。因此,使用不同的光照贴图技术会呈现不同的照明效果。目前,Unity使用两种光照贴图技术:Enlighten和Progressive Lightmapper。
概述
以下流程图从内容创作者的角度展示了在Unity中设置照明的过程。
在整个流程中,首先需要选择渲染管线,然后决定如何生成间接照明并选择相应的全局照明系统。在确保所有全局照明设置都对项目进行了相应调整后,可以继续在场景中添加灯光、自发光表面、反射探头,光照探头以及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>
ackage 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系统可以使用以下两种技术之一:
o Progressive Lightmapper
o 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
istance 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的渲染水平发生了根本性的变化,希望本指南能够使读者更好地了解每个渲染管线的功能,以便在自己的项目中使用合适的照明方案。
欢迎关注我的微信公众号:XR技术研习社(ID:XRStudy)
专栏地址:https://zhuanlan.zhihu.com/p/50753337