5个常见的光照贴图问题及其修复技巧

KRISTIJONAS JALNIONIS Technical Artist
Sep 27, 2022|18 Min
5个常见的光照贴图问题及其修复技巧
为方便起见,此网页已进行机器翻译。我们无法保证翻译内容的准确性或可靠性。如果您对翻译内容的准确性有疑问,请参阅此网页的官方英文版本。

我最近编写了一份Progressive Lightmapper(渐进光照贴图器)故障排除指南,以帮助开发者在Unity编辑器中充分利用起Baked Global Illumination(烘焙全局光照)。在这里,我解析了五个最常见的光照贴图问题及其解决方案,并附有图像和 Unity 手册中页面的链接。如需完整指南, 请访问论坛

1.未在场景内添加Baked Global Illumination
未使用全局照明渲染的 Cornell Box 场景(左)和使用烘焙全局照明渲染的 Cornell Box 场景(右)

如果某些条件不满足,渐进式光照贴图器可能无法为场景生成光照。这些条件包括但不限于:

  • 对象未被标记为GI Contributor
  • 场景内没有烘烤好的光照
  • 着色器问题

要修复这个问题,我建议尝试下方的修复方法。

将对象标记为GI Contributor
Mesh Renderer组件下的Contribute GI设置。

按照以下步骤将您想要光照贴图的对象标记为 GI 贡献者

选择你的 GameObject

导航到 Mesh Renderer 组件

展开 照明 标题。

选中“ 贡献全局照明” 复选框。

这样做将启用下面的 接收全局照明 参数。它包含两个选项:

  • 光照贴图:适用于静态光照贴图对象 - GameObject 将接收并将 GI 贡献给光照贴图。
  • 光探测器:适用于不适合光照贴图的小道具和物体 - 游戏对象将从光探测器接收 GI,并将 GI 贡献给周围的光照贴图。
检查场景光照

只有Mixed(混合)与Baked(烘焙)光照可以为参与GI烘焙。选择场景中的灯光,然后在 灯光组件中将 模式 设置为 混合 (Mixed ) 或 烘焙 (Baked)。其他需要检查的属性包括:

  • 颜色:深色的 GI 贡献较低或没有。选择明亮的灯光颜色并使用 强度 属性来增强或调暗它们。
  • 强度:强度越高,光越亮。光照必须有足够的亮度才能对GI产生实际影响。
  • 间接乘数:此属性控制间接反弹的强度。该数值最好不要设为零。否则,这束光根本不会参与GI的构成。注意,若该数值为1以上,那么场景光照将不再符合物理性渲染(PBR)的标准。
  • 访问场景 论坛 中的 No Baked Global Illumination

检查Lighting Settings文件

“照明”窗口 (可通过 “窗口”>“渲染”>“照明”访问)中,确保 “照明设置资产” 字段不留空。如果没有分配资产,请单击 “新照明设置” 按钮。这将创建并分配一项资产,解锁窗口中的属性以供编辑。

在创建完后,你需要检查:

  • 您已勾选 “烘焙全局照明” 复选框,这将启用烘焙 GI 计算。此复选框还将显示 照明模式 下拉列表。
  • 最大反弹 值未设置为零。这个值越高,光线在环境中的反射次数就越多。
  • 间接强度 滑块未设置为零。该滑动条为零时会减弱场景内的所有间接光照。
检查着色器和材质

自定义着色器可能会造成GI烘焙运算失败。(如果引擎未能正确生成光照)你可以使用Unity编辑器的内置着色器来试着排除故障。它们有:

如果在切换到上面概述的着色器之一后 Unity 生成光照,则问题可能出在自定义着色器上。在这种情况下,请确保表面着色器包含 LIGHTMAP_ON 着色器关键字。

查看 Meta Pass 页面 以获取有关如何使用着色器进一步自定义 Baked GI 输出的详细信息。

其他潜在修复

如果上述步骤没有解决你的问题,可以尝试这些修复方法:

  • 照明窗口中选择不同的光照贴图后端。如果光照在使用Progressive GPU时无法烘焙,但Progressive CPU可以成功烘焙,则问题可能出在硬件或驱动上。
  • 更新你的GPU驱动。你可以参考GPU厂商的网页来查找显卡对应的驱动。(对于 Linux 机器,请检查此 论坛主题中的 Linux 驱动程序设置部分)。
  • 保证GPU符合最低配置要求。请参阅此 论坛主题
  • 清除 GI 缓存。要清除它,请导航至 “首选项”>“GI 缓存”,然后单击 “清除缓存” 按钮。注意这将删除场景内的所有光照数据,你将需要重新生成光照。
2.对象缺失光照

某些对象没有光或光照不正常可能代表着场景布置有问题,如果动态的物体无法从Light Probe(光照探针)上采集光线,就会出现这种情况。此外,场景内的光滑金属材质在附近没有Reflection Probe(反射探针)的情况下可能只会显示出黑色。

康奈尔盒子场景中有一个非光照贴图的金属球和一座雕像:当不存在光照探测器或反射探测器时,两个物体都是黑色的(左)。在光照探针的照射下,漫反射光线的雕像变得可见(中)。放置光照探针和反射探针后,反射光线的小球和雕像都变得可见(右)。

要修复这个问题,我建议尝试下方的修复方法。

加入光照探针

动态对象(或从光照探针接收GI的GI贡献者)需要从光照探针上采集间接光照数据。如果不存在任何环境光探测器(即,场景中始终存在的光和反射探测器),则物体将回退到对 环境光探测器 (即,场景中始终存在的光和反射探测器)进行采样。

为了缓解这种情况,请在场景中设置 光探测器 网络,并在重要区域添加更多探测器。保证光照探针的数量足够覆盖所有需要光照的物体,然后重新生成光照来查看效果。

放置反射探针

即便光照探针密集如网,反射光的金属物体仍可能呈黑色。要遮蔽此类物体,您需要放置一个包含受影响物体的 反射探针 。通过单击 “烘焙” 按钮,再次生成照明或重新烘焙 反射探针组件 中的探针。

如果您观察到反射中的黑色区域,请尝试增加 反射 次数。这将增加反射的次数,从而在反射中产生反射。您可以在 照明 > 环境 > 环境照明中访问此属性。

访问对象缺失照明 论坛

检查Mesh Renderer(网格渲染器)设置

如果执行上述步骤仍然不能解决问题,请检查受影响对象的 网格渲染器组件 。在 “探测器”部分下,确保 “光探测器” “反射属性” 设置为 “关闭”以外的任何值。

Light Probes和Reflection Probes属性需要设置为Blend Probes(或除Off外的其他选项)。
调整材质颜色参数

纯黑色材料会吸收所有直接和间接光。这是物理上正确的行为。但现实生活中,没有一种自然产生的材料是完全黑色的。例如,颜色最深的自然原料之一:煤,在RGB亮度标尺上的刻度为“50、50、50”。

因此,你需要根据物理性渲染的标准来调整材质颜色值。在内置渲染管道中,您可以使用 验证反照率场景视图绘制模式 来确定反照率值是否符合 PBR 标准。您可以使用 URPHDRP 中的 渲染调试器 执行相同操作。

检查场景布置

如果您正在处理 多个场景,请检查包含照明的场景是否设置为 活动场景。Unity默认会将第一个加载的场景设为活跃场景,这可能会对独立运行版产生不利影响。

3.发光材质未被渲染
天花板上方的一块平面与球体都应用了发光材质(左)。启用泛光(Bloom)后处理效果后,发光材质变得愈发明显(中)。发光表面和球体被标记为GI Contributor后对场景灯光产生影响(右)。

发光材质的渲染常出现两类问题:

  • 材质本身不“发光”,后处理效果出现问题。
  • 材质未参与GI的构成,对象或材质的设置有问题。

要纠正这两个问题,我推荐以下修复方法。

在后处理堆栈中启用泛光(Bloom)

为了营造发光材质的印象,请在您选择的后期处理堆栈中启用 Bloom。有关如何执行此操作的提示,请参阅 内置 RPURPHDRP 文档。

检查材质属性

如果你打算使用发光对象绘制光照贴图,请确保:

  • 您已将有问题的游戏对象标记为 GI 贡献者。由于发光物体的自发光特性,您可以将它们的 接收全局照明 属性设置为 光探测器。这将节省光照地图集的空间。
  • 材质检查器 (Material Inspector)中将 “全局照明 (Global Illumination)” 属性设置为 “烘焙 (Baked)”。此属性在 发射 输入下可用。有关更多详细信息,请参阅 内置 RPURPHDRP 文档。
内置渲染管道中的材质检查器:我们用蓝色突出显示了发射属性。
检查光照设置

照明窗口中,确保 间接强度 属性未设置为零。该属性为零时将禁用所有的间接光照,包括来自发光对象的烘焙光照。

访问发光材料未渲染 论坛

4.法线贴图显得扁平

在非方向光模式下烘焙时,Unity编辑器不会用一张单独的纹理来保存方向数据。导致物体在烘焙后看起来非常扁平。

值得注意的是,低频法线贴图很难用方向性纹理来捕捉。在使用完全烘焙来的光照时,此类纹理会显得很扁平。

带有烘焙光的非定向光照贴图(左)与带有烘焙光的定向光照贴图(右):非定向光照贴图缺乏入射光的方向性,在使用法线贴图时可以很好地表现浮雕。

要修复这个问题,我建议尝试下方的修复方法。

切换到Directional(方向)模式
照明设置窗口中的方向性模式下拉菜单。

照明窗口中,将 定向模式 属性设置为 定向。该模式将生成一张储存主光源照射方向的次级纹理。法线贴图由此可很好地呈现出浮雕效果,但会缺少镜面反射。

访问平面法线贴图 论坛

使用混合光照

混合光 提供实时镜面反射和法线响应。渐进式光照贴图器将间接照明烘焙到光照贴图中。这种组合可确保使用烘焙照明时获得最高质量的材质响应。

由烘焙聚光灯照亮的定向光照贴图(左)与由混合聚光灯照亮的定向光照贴图(右):请注意混合光照亮的场景中法线贴图的对比度有所改善。

如果您的项目允许,请在 Light 组件中将灯光 模式 切换为 Mixed。混合光照的性能成本与实时光照相同。根据所使用的 照明模式 ,混合光将投射实时阴影,但不会投射烘焙软阴影。

使用光照探针

探针照亮的游戏对象通常会比烘焙光照下的对象更具动态。如果您的艺术指导允许,请将其 “接收全局照明” 属性设置为 “网格渲染器”组件中的 “光探测器”。请注意,您还可以使用 光探测代理体积 (LPPV) 为探测照明对象添加空间渐变。

5.缺少镜面效果
一个简单的场景,在光照贴图烘焙之前包含几个烘焙点光源(左),而同一场景在烘焙光照贴图之后则包含多个烘焙点光源(右):请注意,烘焙后镜面高光消失。

烘焙光照的一个固有局限在于不能让材质产生动态的镜面反射。光滑的材质在光照生成后不会保留表面上的高光。

要修复这个问题,我建议尝试下方的修复方法。

使用混合光照

与烘焙光不同, 混合光 为材质提供实时直接镜面反射响应。如果镜面高光在您的场景中很重要,请在 光照组件中将光照 模式 切换为 混合

访问缺失镜面响应 论坛

使用发光代理体

你可以使用发光对象来模仿光在光滑表面上的表现。请遵循以下步骤:

在场景中放置一个 反射探测器

层次结构 面板中单击鼠标右键,然后选择 “3D 对象”>“球体”

选择新创建的对象并将其 静态编辑器标志 设置为 反射探针静态

项目 面板中,右键单击并选择 “创建”>“材质”来创建新材质。

选择新创建的材料并启用 “发射” 复选框。将 “全局照明” 属性设置为 “无”

将材质拖拽并分配给球体。

把球体放在光源位置。

生成光照。

完成后,你应该就能看到反射探针的立方体贴图所捕捉到的发光对象。您可以在烘焙后隐藏这些对象,或者在 Camera 组件中设置 Culling Mask

由反射探针捕捉的发光代理体(左)与从远处看的代理体(右)。

有关渐进式光照贴图 (Progressive Lightmapper) 故障排除的更多提示,请查看 论坛中的完整指南。如果您想讨论这篇文章或分享其他解决方案,请随时在那里或 这里与我联系。最后,请务必关注其他 Unity 开发人员发布的新技术博客,它们将成为正在进行的 “Tech from the Trenches”系列的一部分。