广义上说,Unity中的照明可以以某种方式被视为“实时(realtime)”或“预先计算(precomputed)”,并且两种技术都可以组合使用来创建身临其境的场景照明。

实时照明(Realtime lighting)

在Unity中定向光(Directional),点光(point),聚光灯(spot)都是实时光源。它们会时刻照明整个场景。随着光源或者物体的移动,照明会立即更新。

Unity 技术分享 unity3d技术_Real

这是实时灯光的效果。请注意,因为没有反弹光,所以阴影是完全黑色的。只有落在聚光灯锥体内的表面才会受到照明影响。

实时照明是场景中照明对象的最基本的方式,对于照亮人物或其他可移动几何是有很用的。

但是,Unity的实时灯光线不会反弹。为了使用全球照明技术创造更逼真的场景,我们需要启用Unity的预计算照明解决方案

烘焙全球照明(Baked GI Lighting)

当“烘焙(baking)”一个“光照贴图(lightmap)”时,会将光对场景中静态物体的影响写入到纹理中,然后将其覆盖在场景的物体之上,以产生光照效果。

Unity 技术分享 unity3d技术_Light_02

左:一个简单的光照场景。右:Unity生成的光照贴图(lightmaps)纹理。注意:阴影和光信息是如何被捕获的。

这些“光照贴图(lightmaps)”可以包括撞击物体表面的直射光(direct light)以及从场景中的其他物体的表面反射的间接光(indirect light)。

使用烘焙照明(backed lighting),这些光照贴图(lightmaps)在游戏过程中不能改变,因此被称为“静态”的。光照贴图(lightmaps)可以叠加使用,但是不可以自己选择。

通过这种方式,将照明效果计算从游戏进行中移除,从而提升性能,从而可以去适应硬件不太强大的移动平台。

Unity 技术分享 unity3d技术_贴图_03

工程中实现的效果

预先计算的实时全球照明(Precomputed Realtime Gl Light)

虽然传统的静态光照贴图无法对场景内照明条件的变化作出反应,预先计算的实时全球照明为我们提供了更新复杂场景照明的技术。

通过这种方式,可以创建具有丰富的全局照明的光线环境,具有反射光,并且实时响应照明条件的变化。

Unity 技术分享 unity3d技术_Real_04

一个使用预计算实时全球照明的时简单例子。

为了在可播放的帧速率中传递这些效果,预先计算会将游戏中发生的复杂光线行为的负担转移,当时间效率变得不是那么重要时再去计算这些,这可以称之为“离线”过程。

最常见的,当我们想要在我们的场景照明中创造更加现实的效果时,我们可能想要把间接(反弹)光存储在光照贴图中。幸运的是,间接(反弹)光颜色趋向于柔和,几乎没有尖锐或高频的变化。Unity的预先计算的实时全球照明解决方案利用了间接光源的这些“弥散”特征,以达到我们的优势。

更明亮的照明细节,例如清晰的阴影,通常可以用实时灯光更好地生成,而不是将其烘烤成光照贴图。假设我们不需要捕捉这些复杂的细节,我们可以大大降低我们全球照明解决方案的分辨率。

通过在预计算中进行这种简化,有效地减少了在游戏过程中更新全球照明所需的计算次数。

为了加快预先计算,Unity不会直接在光照贴图上工作,而是创建一个更分辨率的近似于静态几何的世界,这称作集群(clusters)。

Unity 技术分享 unity3d技术_Light_05

左:将场景视图设置为“Albedo”,可以清楚地看到Unity预先计算的实时全球照明产生的纹理元素。
右:一旦照明已经计算出来,场景就会出现在游戏中,并将结果转换为光照贴图并应用。

通过将世界简化为关系网络,我们消除了对游戏性能(performance-critical)至关重要的昂贵的光线跟踪需求。

好处和成本

虽然可以同时使用烘焙全球照明(Baked Gl lighting)和预先计算的实时全球照明(Precomputed Realtime Gl),但是请注意,同时渲染两个系统的性能成本恰好是它们的总和。我们不仅必须在视频存储中存储两套光照贴图,还可以在着色器中支付解码的处理成本。

你可能希望选择一种照明方法,这取决于你的项目的性质和你预期硬件的性能。例如,在视频存储和处理能力更受限制的移动设备上,可能使用烘焙全球照明(Backed Gl lighting)方法更具性能。在具有显卡的PC桑,可以使用预计算实时全球照明,或者同时使用这两个系统。

必须根据项目的性质和所需的目标平台来评估采用哪种照明方法。

启用烘焙全球照明(Baked Gl)或预计算实时全球照明(Precomputed Realtime Gl)

可以在Unity的Lighting面板(Windows > Lighting > Setting > Lighting >Scene)中启用Baked Gl和Precomputed Realtime Gl。

Unity 技术分享 unity3d技术_贴图_06

使用哪种技术也可以通过灯光对象来控制(Light > Inspector>Light>Baking)。

Unity 技术分享 unity3d技术_Real_07

在场景中同时使用Baked Gl和Precomputed Realtime Gl可能会对性能造成不利影响。一个好的做法是确保一次只能使用一个系统,禁用另外一个系统。

这个可以通过勾选Unity的Lighting面板中Precomputed Realtime GI或Baked GI右侧的框来实现。只有选中的选项才会出现在场景中,并且每个灯的任何设置将会被覆盖。

灯的设置

灯的默认的烘焙模式是’Realtime’。这意味着所选择的灯会为您的场景提供直射光,并由Unity的Precomputed Realtime Gl提供间接的光。

如果烘焙模式设置为“Baked”,则这个灯将仅由Unity的Baked Gl提供照明光。

Unity 技术分享 unity3d技术_Unity3D_08

当选择’Mixed’模式时,标记为静态的GameObjects仍将包含这些光在其Baked Gl光照贴图中。’Mixed’灯还将为场景中的非静态GameObjects提供实时的直接照明的光线。

当在静态环境中使用光照贴图,而且仍然希望角色使用这些相同的光线将实时阴影投射到光照贴图的几何体上的情况下非常有用。