广义的来说,Unity的全局光照是”实时”或是”预先计算好”的,在某些情况下两种方法可以结合使用,照出更逼真的场景。
本节我们会针对两种技术的差异优势和使用时机做个简单的描述。
实时照明(Realtime Lighting)
预设情况下,Unity的灯源(直接光源, 投射灯, 点光源)都是实时的,代表这些灯源会把光线照射到场景并以每一帧的频率更新,由于光源是可以在场景内移动的对象,场景灯光的更新是实时的,你可以在游戏窗口和场景窗口看到改变。
实时照明的影响:注意到因为没有反射光源的关系,阴影是全黑的,只有投射光锥体范围内的对象表面才有光源影响。
实时照明是场景里照亮物体最基本的方法,用来照亮角色和会动的对象。
可惜的是,Unity实时照明里的光线不会反射,因此我们才导入了全局光照系统,启用了预先计算的技术,都是为了表现一个更逼真的场景。
烘焙全局光照(Baked GI Lighting)
当烘焙一张光照贴图(Lightmap)时,场景内的静态对象会基于光的影响算出一张贴图成果,并迭在场景对象之上建立照明效果:
这些”光照贴图”可以包含场景内投射到物体表面的直接光源,以及在不同物体间反射的”间接光源”,这样的光照贴图可以透过物体材质上的着色器(Shader)描述像是颜色的表面信息(Albedo)和凹凸(Normals)信息。
烘焙光照所产生出来的贴图,是无法在游戏运作的时候变更运算的,因此被定义为静态(Static),虽然仍可在这层贴图上继续迭加光源计算,但两者已无法交互运算,通常我们采用这光照法来让低阶的手机能顺利执行,解决光在游戏中运行的效能问题。
预计算全局光照(Precomputed Realtime GI Lighting)
虽然传统的静态光照贴图无法在游戏执行时改变场景光照条件,但预先计算的实时全局光照系统能帮我们实时运算复杂的场景光源互动,透过这种方法,就能建立昏暗的环境带有丰富的全局光照反射,并实时反映光源的改变。好比做个日晷,阴影的位置和颜色会随着光源移动改变,这在原本的烘焙光照系统是无法达成的。
为了在合理的帧率实现这些效果,我们需要在实时运算之前先将一堆垄长的数据做”预计算”,预计算负责计算游戏过程中光的复杂行为,它可以在时间空档时进行计算,我们称作一个”脱机”运算。
那么它是如何运作的?
最常见的需求是我们希望间接光源能够列入场景光照贴图的计算,幸好,原理上这些间接光源都是从直接光源慢慢转变过来的颜色,只有少部分特定情况有比较大幅度的颜色改变,这样的Unity的全局光照预计算,利用间接光源漫反射(diffuse)特性对运算有利。通常好的阴影是透过即时光源所计算出来的,而非烘焙到光照贴图,假定我们并不需要太复杂的细节取样,可以大大降低全局光照所产生的数据大小。
透过预计算来简化整个流程,有效的降低了原本要在游戏中实时计算的全局光照运算数量,如果你要经常在游戏中改变光源颜色,旋转光源或是调整光的强度,甚至对场景表面做变更,这点就很重要。Unity从表面上采样底层贴图,并从广义定义颜色的值到一个大型的群组,或是”丛集”,这会产生一个低解析的仿真静态几何,以方便我们用来计算光照。
基本上,当在计算全局光照时,我们会针对静态场景周围做”光迹追踪”运算,这是非常耗效能的,因此无法苛求要实时运算,相反的,Unity把光迹追踪用在计算这些表面的丛集关系 - 在预计算”光传输”的阶段,然后把世界串成一个网络结构,我们在关键性的游戏过程就不再需要耗费效能的光迹追踪法。
我们有效的创造出一个简化的算法可以在游戏过程中变化输入结构,这代表我们可以改变光源或是表面颜色,并很快的看到场景内全局光照的影响,算出的结果产出光照贴图透过GPU着色,并和其他照明或是表面混合,最后输出到屏幕上。
收益和成本(BENEFITS AND COSTS)
虽然可以同时使用烘焙方式的GI和预计算的GI,但要注意是同时仿真两个系统,效能负担也会两次运算的总和,不只是因为要储存两套光照贴图在显卡内存,同时着色器也得付出两次的处理成本。
最终要选择哪个方法还是要取决于你项目的性质和预期的硬件考虑,例如在手机平台上,效能和内存限制较高,烘焙的GI法就会比较适合,如果是在有显卡的计算机上或是游戏机上执行,那可能使用预计算实时全局光照,或两个同时使用就比较可行。决定采用哪一种方法可以针对你的目标平台评估,记得如果项目要同时符合几个不同的硬件需求,往往都是以效能最高的平台为考虑。
预灯光设定(Per-Light Settings)
Unity里每盏灯光默认的烘焙模式都是”Realtime”,这代表这些灯光仍然会照亮你的场景,Unity的预计算GI系统会处理间接光。但如果默认的烘焙模式是”Baked”,那么这些灯光将会透过Unity的烘焙GI系统处理直接光源和间接光源,产生出来的光照贴图一旦贴到场景上在执行期间是不能改变的。
选择烘焙模式为”Mixed”的话,场景内的静态对象会被烘焙GI拿去做计算,然而,不像”Baked”模式,混合模式的灯光仍会继续运算即时光源到非静态对象上,这对于你想把静态环境烘成光照贴图,但同时又希望同样一盏灯能为会动的角色计算阴影很有帮助。