跳到主要内容

运行时光照贴图

Sponza 此场景的全部光照均由光照纹理提供

光照贴图生成是为静态场景预计算光照信息、存入纹理,再应用到材质的过程。大量光源和几何体静止或属于环境时,这种方法高效且真实。

运行时生成光照贴图​

PlayCanvas 提供便捷的生成方案。使用编辑器标准灯光组件,可选择哪些灯光烘焙到贴图,哪些在运行时动态照亮场景。应用生成光照纹理时,会使用标记为烘焙的灯光。

运行时生成有多个优点:

  • 光照不在正常运行时逐帧计算。
  • 可使用数百盏静态灯光照亮场景。
  • 多数情况下,运行时渲染光照纹理比下载大量纹理更快。
  • 可在编辑器中混合静态和动态灯光。
  • 支持运行时重新烘焙。
  • 光照贴图为 HDR。
  • 可烘焙颜色与方向数据,使烘焙表面具有一定高光表现。

缺点是目前不支持烘焙全局光照,以及专门烘焙工具的一些高级功能。

备注

合批与运行时光照贴图不兼容,因为每个对象需要独立的光照纹理。

配置烘焙灯光​

每个灯光组件包含以下烘焙设置,新灯光默认为动态:

  • Bake Lightmap(烘焙光照贴图):启用后,为范围内启用了光照贴图的模型烘焙光照。
  • Bake Direction(烘焙方向):是否贡献光照方向信息。场景设置选择 Color and Direction(颜色与方向)模式时,会影响高光结果。

灯光组件设置

另有 Affect Dynamic 和 Affect Lightmapped 控制灯光行为,决定运行时影响哪些模型。任一选项启用时,灯光都会在运行时工作并产生开销。

  • Affect Dynamic(影响动态对象):影响未使用光照贴图的模型。
  • Affect Lightmapped(影响光照贴图对象):也影响使用光照贴图的模型。

不能同时启用 Bake Lightmap 和 Affect Lightmapped,否则既为模型生成贴图,又在运行时重复添加相同光照。

灯光组件阴影设置

烘焙灯光使用与动态灯光相同的 Shadows(阴影)设置,但只在生成贴图时计算一次,因此启用阴影的成本低得多。参见阴影。烘焙会忽略阴影级联选项。

柔和平行光​

默认烘焙灯光产生硬阴影。平行光未启用 Bake Direction 时,可使用柔和烘焙阴影改善画质,此时有两个额外选项:

  • Bake Samples(烘焙采样数):烘焙灯光时使用的样本数,默认 1,最大 255。影响烘焙性能,应尽量低,例如 5–20。
  • Bake Area(烘焙区域):以度指定半影角,产生柔和阴影边界。

柔和平行光设置

下图比较硬阴影和软阴影,Bake Samples 为 15,Area 为 10。

硬阴影与软阴影示例

烘焙环境光​

PlayCanvas 支持环境色和天空盒两种环境光,默认均在运行时应用。

运行时环境光的限制是缺少环境光遮蔽。也可将环境光连同 AO 烘焙到贴图,在全局设置的 Lightmapping 部分配置。

启用 Ambient Bake(烘焙环境光)后,环境光贡献连同 AO 一并烘焙。Samples(采样数)影响烘焙性能,应尽量低,例如 5–20。

光照贴图设置

下图比较环境色在有无 AO 时的效果。

环境色示例

光照贴图滤波​

烘焙柔和平行光或环境光时,为改善性能通常使用较少采样,但会产生条带伪影。下图使用 15 个样本:

15 个样本的光照贴图

增加采样可获得最高质量。下图使用 100 个样本:

100 个样本的光照贴图

更高效的替代方案是智能双边模糊滤波,在更低开销下取得可接受质量。下图使用 15 个样本并启用滤波:

15 个样本并启用滤波的光照贴图

滤波作用于最终烘焙贴图,不跨越展开 UV 的接缝,因此可能在接缝处产生可见边缘,并非适合所有场景。应在滤波强度与采样数量之间平衡,减少伪影。

配置烘焙模型​

每个 Model 或 Render 组件都必须启用光照贴图才能接收结果。在组件属性中勾选 Lightmapped 即可。

模型组件设置

渲染组件设置

Cast Lightmap Shadows 决定模型是否向光照贴图投射阴影。界面显示生成的纹理分辨率,也可对 UV1 面积应用乘数,影响纹理大小。尺寸乘数见下文。

常用灯光设置​

多种灯光设置组合各有用途,混合不同组合可以平衡画质和性能。

烘焙影响未烘焙对象影响已烘焙对象说明
falsetruefalse默认动态灯光,影响所有未使用光照贴图的模型。
truefalsefalse为光照贴图模型生成纹理,正常运行时无光照计算开销,适合多数静态环境灯光。
truetruefalse生成贴图,同时影响未使用光照贴图的模型,适合需要照亮动态实体的灯光,例如也应照亮玩家角色的主要环境灯光。
falsetruetrue动态灯光,同时影响已使用和未使用光照贴图的模型。

光照贴图设置​

Size Multiplier(尺寸乘数)影响所有模型和渲染组件。PlayCanvas 根据模型缩放与几何体表面积自动选择分辨率。可通过全局设置,以及模型或渲染组件中的 Size Multiplier 调整这一计算。

例如,一个 1x1 单位(米)的平面,全局尺寸乘数为 16,模型组件乘数为 2,则生成 32x32 纹理(1 sq/m * 16 * 2)。每平方米 32x32 像素,每像素约 3 厘米。

Max Resolution(最大分辨率)限制生成贴图的尺寸,节省内存。

Mode(模式)指定烘焙数据,例如漫反射颜色或从像素指向光源的方向。方向数据用于模拟简单高光,但只能烘焙单一方向,因此多灯重叠时较复杂。也可逐灯设置是否烘焙方向。

全局光照贴图设置

自动展开与 UV1 生成​

光照贴图始终使用模型资源的第二组 UV 坐标(UV1)。为获得最佳结果,建议上传前在 3D 工具中为模型添加第二 UV 集。适合烘焙的 UV 参见 UV 映射。

如果模型没有 UV1,PlayCanvas 编辑器可以自动展开并生成。

模型组件:缺少 UV1

模型缺少 UV1 时,启用光照贴图后会在模型组件中看到警告。

模型资源:自动展开管线

选中模型资源,展开 Pipeline(管线),点击 Auto-Unwrap(自动展开)并等待完成。自动展开会修改模型资源,因此从源文件重新导入(例如上传新 FBX)后,预计算 UV1 会丢失。如果上传模型仍无 UV1,需要重新自动展开。

Padding 决定展开区域之间的间距。如果出现漏光,即贴图中出现不应存在的光,可增大间距减少问题。

设备丢失后的恢复​

运行时烘焙贴图由 GPU 生成,设备丢失会丢弃其内容。在引擎 2.23 及以上版本中,应在图形设备触发 devicerestored 后安排重新烘焙。恢复生命周期参见设备丢失与恢复。