光照概述
为了计算 3D 对象的着色,Unity 需要知道落在 3D 对象的光的强度、方向和颜色。
这些属性由场景中的灯光对象提供。不同类型的灯光以不同的方式发射为它们分配的颜色;某些光可以随着与光源的距离而衰减,并且接受的光线角度也有不同的规则。Unity 提供的各种光源在 灯光类型 中有详细说明。
Unity 以多种不同的方式计算复杂的、高级的光照效果,每种方式对应不同的场景。
选择光照方案
Unity 中的光照可以粗略地分为『实时』和『预计算』,并且,两种光照可以组合使用,以创建沉浸式的场景光照。
在本节中,我们将简要概述不同技术的适用场景、相对优势,以及独特的性能因素。
实时光照
默认情况下,Unity 中的灯光 —— 平行光、聚光灯和点光源 —— 是实时的。这意味着,它们为场景提供直接光照,并且每桢更新。如果灯光和游戏对象在场景中移动,光照将立即更新。在场景视图和游戏视图中都可以观察这种变化。
注意,因为没有弹射光,所以阴影是完全黑色的。只有位于聚光灯椎体内的表面才会收到影响。
译注:原文有错误,这里应该有一张截图,展示一个聚光灯的实时效果。
实时光照是照亮场景中物体的最基本方式,可以用于照亮角色或其他可移动的几何物体。
不幸的是,在 Unity 中,来自实时光的光线不会被弹射。为了使用诸如全局光照等技术,创建更加逼真的场景,我们需要使用 Unity 的预计算光照方案。
烘培光照贴图
Unity 可以计算复杂的静态光照效果(使用称为全局光照或 GI 的技术),并将它们存储在一张称为光照贴图的纹理文件中。这个计算过程成为『烘培』。
烘培光照贴图时,场景中静态对象上的光源效果被计算,并将计算结果写入覆盖了场景几何顶点的纹理文件中,以产生光照效果。
左图:一个简单的光照贴图场景。右图:Unity 生成的光照贴图纹理。注意是如何捕获阴影和灯光信息的。
光照贴图可以包含撞击到表面的直接光和场景中其他对象或表面弹射的间接光。光照贴图可以和表面信息结合使用,例如对象的材质着色器指定的颜色(漫反射)和浮雕(法线)。
使用烘培照明时,光照贴图在游戏期间无法改变,因为被称为是『静态』的。实时灯光可以叠加在光照贴图之上,但是无法改变光照贴图本身。
当在游戏过程中移动灯光时,使用这种方法可以潜在地提升性能,以适配性能不佳的硬件,例如移动平台。
预计算的实时 GI
虽然静态光照贴图不能对场景中光照条件的变化做出响应,但是,预计算实时 GI 技术可以支持交互式地更新复杂场景的光照。
使用这种技术,可以创建具有丰富全局光照的场景,并且可以实时地响应弹射光和光照变化。一个很好的例子是昼夜系统 —— 光源的位置和颜色随着时间变化。而使用传统的烘培光照技术是不可能实现的。
简单的昼夜示例,使用了预计算实时 GI。
为了在可玩帧率下实现这些效果,我们需要将一些冗长的数字解调从实时处理转移到预计算过程中。
预计算把游戏过程中计算复杂光照行为的过程,转移到不重要的时间段进行处理。我们称之为『离线』处理。
更多信息请参阅 关照和渲染教程 。
利与弊
尽管可以同时使用烘培 GI 和预计算实时 GI,但要注意,同时渲染两个系统的性能成本恰好是它们的总和。我们不仅需要在显存中存储两种光照贴图,还需要支付着色器解码它们的成本。
选择和放弃哪种光照方案,取决于项目性质和硬件性能预期。例如,移动设备的显存和处理能力有限,烘培 GI 方案可能更加高效。在具有专用图形硬件的独立计算机上,或最新的游戏机上,很可能使用预计算实时 GI 方案,甚至同时使用两种方案。
关于采用哪种方案,必须基于特定项目的性质和目标平台进行评估。请记住,当定位于(需要支持)一系列不同的硬件时,通常性能最差的硬件能将决定需要哪种方案。
另请参阅 灯光故障排除和性能 。