光照贴图
执行光照计算的开销是非常昂贵的。 延迟渲染允许我们使用很多光源,但阴影的开销仍然是一个限制因素。如果我们的场景是动态的,那么我们没有办法来避免执行这些计算。但是如果光源和几何体都是不变的,那么我们可以只计算一次光照并重复使用。这使得我们可以在场景中放置许多光源,而不必在运行的时候再渲染它们。这种方法也可以使用那些不能用作实时光源的区域光源。
到底有多少光照要预先计算可能会有所不同。在本教程中,我们将一路走下去,将所有内容都放在光照贴图中。所以根本不会有任何动态光照。
为了尝试光照贴图,我创建了一个简单的测试场景,它具有一个简单的结构,可以提供阴影,还有一些放置在其内部的球体。一切物体都使用默认的Unity材质。
针对光照贴图的一个测试场景。
烘焙光源
要开始使用光照贴图,将唯一的光源对象的模式改为“Baked(烘焙)”而不是“Realtime(实时)”。
使用烘焙模式的主方向光源。
将主方向光源变成烘培光源后,它将不再包含在动态光照中。从动态对象的角度来看,光源是不存在的。 唯一仍然不变的是环境光照,它仍然是基于主方向光源的。
没有直接光照的效果。
要实际启用光照贴图,请在光照窗口的“混合光照(Mixed Lighting)”部分中打开“烘培全局光照(BakedGlobal Illumination)”。 然后将光照模式设置为“烘培间接光照(BakedIndirect)”。 尽管名字里面说的是烘培间接光照,但是它也包括了直接光照。 它通常用于向场景添加间接光照。另外,确保实时全局光照(Realtime Global Illumination)被禁用,因为我们还没有支持到这一点。
烘培间接光照模式。
静态几何体
场景的对象都应该是固定的。它们永远不会移动位置。要将这一个信息传达给Unity,请将这些对象标记为静态。你可以通过启用检视器窗口右上角的“静态”切换键来做到这一点。
光源也必须被标记为静态吗?
不,这不是必需的。光源只需要设置为适当的模式。
有各种子系统关心物体是否是静态的。“静态(static)”还有一个下拉菜单,你可以使用它来微调哪些系统会将这个对象视为静态的。现在我们只关心光照贴图,但最简单的做法是使一切都完全是静态的。
静态的物体。
一个物体对于光照贴图来说是否是静态的,也可以通过其网格渲染器的检视器来进行查看和编辑。
对于光照贴图来说是静态的物体。
现在,所有的物体都是静态的,它们将被包含在光照贴图的处理过程中。
使用烘焙光照的场景。
请注意,使用光照贴图得到的结果不如使用实时照明得到的结果亮度那么高。这是因为缺失了镜面高光,只剩下了漫反射光照。镜面高光取决于视角,因此取决于相机的角度。通常,相机是移动的,因此它不能包含在光照贴图中。这种限制意味着光照贴图可以用于微弱的光线和暗淡的表面,但不能用于强直射光或有光泽的表面。如果你想要镜面高光,你将不得不使用实时光源。所以你经常会使用烘烤光源和实时光源的混合。
为什么我没有得到烘焙光源?
为了确保在需要的时候光照贴图可以实际生成和更新,请在光照窗口的底部启用“自动生成(Auto Generate)”。 否则,你必须手动生成新的光照贴图。
自动生成的光照贴图。
光照贴图设置
光照窗口包含专门用于光照贴图设置的部分。在这里,你可以在质量、尺寸和烘烤时间之间取得平衡。你还可以在Enlighten的光照贴图引擎和Progressive lightmapper之间进行切换。后者会增量地生成光照贴图,优先考虑场景视图中可见的内容,这在编辑的时候很方便。我在本教程中使用的是Enlighten光照贴图引擎。
默认的光照贴图设置。
在做任何事情之前,请将“DirectionalMode“设置为”Non-Direction“。 稍后我们会处理其他模式。
使用“Non-directional”模式的光照贴图。
烘烤的光照存储在纹理中。 你可以通过将光照窗口从“场景(Scene)“切换到”全局地图(Global Maps)“模式来进行查看。 使用默认设置,我的测试场景很容易与一张1024×1024贴图相匹配。
得到的光照贴图。
Unity的默认对象都具有用于光照贴图的UV坐标。对于导入的网格,你可以提供自己的坐标,也可以让Unity为你生成。烘烤后,可以在光照贴图中看到纹理展开。它们需要多少空间取决于场景中物体的大小和光照贴图的分辨率设置。 如果它们不适合单一贴图,Unity将会创建其他贴图。
光照贴图的分辨率的不同会带来很大的差异。
对于每个项目来说,最佳设置都是不同。 你必须调整设置,直到达成良好的平衡。需要注意的是,视觉质量也很大程度上取决于用于光照贴图的纹理展开的质量。不存在纹理接缝可能会产生明显的瑕疵。Unity的默认球体就是一个很好的例子。它不适用于光照贴图。
间接光源
烘烤光照意味着我们失去了镜面高光,我们获得的是间接光照。这是在到达我们的眼睛之前会在多个表面反射的光。因为光会在角的周围反射,那些本来会被遮挡的区域仍然会被照亮。我们不能实时计算这个信息,但是我们可以在烘焙的时候包括反射光。
要清楚地看到实时光照和烘培光照之间的差异,将环境光照的强度设置为零。 这就去掉了天空盒的影响,所以所有的光都只是来自方向光源。
没有环境光照,在实时光照与光照贴图下的效果对比。
每次光子反射的时候,它都会失去一些能量,它被与它相互作用的材质着色。Unity在烘烤间接光照的时候考虑到了这一点。 因此,物体会根据附近的颜色进行着色。
绿色的地面,在实时光照与光照贴图下的效果对比。
自发光表面也会影响烘焙光照。它们会成为间接光源。