使用手册

From Bakery GPU Lightmapper: Wiki
Revision as of 14:03, 5 November 2025 by Mr F (talk | contribs)
Jump to navigation Jump to search

Contents

系统要求

使用 Bakery 需要:

Windows(7 或更高版本)电脑。

Nvidia 显卡。最低支持型号为 Kepler(GeForce 650 或更新型号,Quadro 显卡请查看规格)。

64 位 Unity 编辑器。Bakery 已在 5.6 到 6 及更高版本上测试过,同时也在 Tuanjie 1.6.7 上通过测试。

Bulbgraph.png系统要求仅适用于开发者的电脑,而非目标平台。使用 Bakery 烘焙的光照贴图可以在任何地方使用。

前提条件

  • 确保你的项目中没有任何脚本编译错误,否则也会导致 Bakery 的脚本无法编译。
  • 确保你的显卡驱动是最新版本,如有需要请更新

请使用 Game-Ready(标准)驱动程序,而不是 “Studio” 驱动。

安装

1. 通过 Asset Store 将 Bakery 导入到你的项目中。

2. Unity 会显示要导入的文件列表。如果这是你第一次使用 Bakery,建议直接 点击 Import(导入)。有经验的用户可以取消选中 examples 文件夹,以进行更轻量的安装。

文件将被导入到 `Assets/Bakery` 和 `Assets/Editor/x64/Bakery` 文件夹中。 这些文件夹之后可以移动。

3. Unity 随后会导入 Bakery 并编译脚本。此时可能会弹出如下窗口:

Goahead.png

此时你应点击 “Go Ahead”(继续)。

现在你应该能在编辑器中看到新增的 Bakery 菜单:

Bmenu.jpg

快速开始

1. 添加一些模型或基础体,并将其标记为静态(Static)。

用于光照贴图的网格必须具有不重叠的 UV2。如果存在 UV2,则会使用 UV2(否则使用 UV1)。如果你的模型没有为光照贴图进行展开,请在资源中勾选 Generate Lightmap UVs(生成光照贴图 UV)。 Unity 的基础体已经具有正确的 UV2。


Staticmarked.jpg


2. 选择方向光(Unity 为你创建的那个),并添加 Bakery Direct Light 组件。

Bulbgraph.pngBakery 和 Unity 使用独立的光源组件。

3. Bakery Direct Light 有许多可调选项,但你可以轻松将其与 Unity 光源匹配。点击 Match lightmapped to real-time。现在 Bakery 光源的颜色应与 Unity 默认的方向光相同,呈黄色调。

Matching.jpg

Bulbgraph.pngDirect Light 组件可能会提示项目未使用线性光强度。问题在于,Unity 默认会对光源颜色应用伽马校正 不正确

可以通过脚本启用正确模式。 这就是 “Fix” 按钮的作用。如果你已经在非线性光强模式下设置了许多光源,并且不想再次更改它们,可以跳过修复。即使你按了 “Fix”,也可以随时撤销此更改。


4. 要获得带阴影的环境光,请创建 Skylight(Bakery->Create->Skylight)。

Menusky.jpg


5. 选择 Skylight,为它设置一些偏蓝的颜色,然后点击 Match scene skybox to this light。 这将使场景的 skybox 与光照完全匹配。

Bulbgraph.png将 Unity 的 skybox 与 Bakery Skylight 匹配是可选的,但对正确性很有用,可以确保可见环境和引擎内的反射探针与烘焙光照一致。目前此选项仅适用于 Standard 渲染管线。


Skycomp.jpg


6. 点击 Bakery->Render Lightmap。默认情况下,Full Lighting 模式是激活的。它会烘焙所有光源的直接和间接光照贡献。如果你想将实时阴影与烘焙全局光照(GI)结合使用,请将模式更改为 Indirect

Bakerywindow.jpg

Bulbgraph.png Bakery 可能会提示你正在使用旧的 gamma mode。如果你在意光照质量,强烈建议使用线性模式。如果你的项目已经在错误的伽马模式下设置好了,并且不想更改,或者是发布到不支持线性模式的移动设备上,也可以忽略此提示。

7. 点击 Render

8. 完成!现在你应该已经得到烘焙的全局光照(GI):

Bakedgi.jpg

渲染设置

所有渲染设置都可以通过 Bakery->Render Lightmap 访问。设置会为每个场景单独保存。Bakery 窗口顶部的选项允许你在 Simple(简单)、Advanced(高级)和 Experimental(实验)设置之间切换,每个后续模式都会显示更多可调选项。对于大多数场景,Simple 模式已经足够,是入门的好方法。


Render mode

定义要烘焙的光照贴图类型。

Full Lighting

烘焙所有 Bakery 光源的完整直接光和间接光。

Bulbgraph.png在 2017.3 之前的 Unity 版本中,如果同一对象上同时有 Unity 和 Bakery 组件,你需要手动禁用 Unity 组件以避免亮度加倍。在较新版本中,实时效果会自动对烘焙光源禁用,就像内置光照烘焙器一样。
Indirect
Unity 支持的不同渲染模式对比

基础混合模式。它会查看每个光源上的 Baked Contribution 选择器:如果设置为 Direct And Indirect,则光源会像在 Full Lighting 模式下一样被烘焙。如果设置为 Indirect Only,则只会烘焙该光源的间接光照(GI)。在后一种情况下,你应保持对象上的 Unity 光源和 Bakery 光源同时存在,一个提供实时直接光照,另一个提供预计算的全局光照(GI)。

Indirectonly.jpg

Shadowmask
左:完全烘焙的光照。中:动态光源 + 烘焙 GI。右:胶囊形阴影、凹凸贴图和高光为动态光照,但立方体阴影和 GI 为烘焙光照。
当相机足够远离场景,或者动态阴影被禁用时,场景将呈现如下效果

更高级的混合模式。它通过生成两种类型的光照贴图来工作——一种包含烘焙颜色(如 Indirect 模式),另一种包含静态物体的阴影。它有几个优点:

  • 实时阴影只需渲染少量动态对象,而不是整个场景。
  • 实时阴影与烘焙阴影可以正确融合。
  • 实时光源可以渲染凹凸贴图、高光和其他表面效果,同时仍会被高质量烘焙阴影遮挡。

更多详情

要启用此行为,你必须在同一对象上同时存在 Unity 光源和 Bakery 光源,并将 Baked Contribution 设置为 Shadowmask and Indirect。未标记的光源将按 Indirect 模式进行烘焙。

Smask22.jpg

Distance Shadowmask

此复选框仅在你选择 Shadowmask 时可见,并且只是切换项目 Quality Settings 中同名的设置。 更多详情

Bulbgraph.png由于缺少对应的脚本 API,该复选框在 Unity 5.6.x 上不可见。你可以在 Window->Lighting->Mixed Lighting->Lighting Mode 中切换该设置。
Bulbgraph.png在 Unity 版本 < 2017.3 中,由于 API 限制,渲染 Shadowmask 光照贴图会清除光照探针。烘焙后需要重新渲染光照探针。在较新版本中不应发生此问题。
Subtractive

启用 Subtractive 光照模式。

此选项对光照贴图本身没有任何特殊作用,实际上它的工作方式与 Full Lighting 相同。

唯一的区别是,它还会将实时 Unity 光源设置为与 Subtractive 模式兼容(因为无法通过 UI 完成此操作)。

你还需要在 Unity Lighting 窗口中额外设置全局减法参数(例如全局阴影颜色)。

Ambient Occlusion Only

仅烘焙环境光遮蔽(AO)。如果你很清楚自己在做什么,这可能会有用。请确保设置 AO 选项


Directional mode

不同方向模式的对比

定义了方向信息的烘焙方式。标准光照贴图每个像素只存储单一颜色,而方向光照贴图为着色器提供了关于该像素周围半球内光照变化的提示。这些数据用于在完全烘焙的区域中结合法线贴图。如果将其应用到内置的 Bakery 着色器中,还可以产生**近似高光反射**效果。

None

不包含方向数据,每个像素仅有单一颜色。

Baked Normal Maps

依然没有方向数据,但在渲染光照贴图时会考虑法线贴图。此方式在运行时没有额外开销。由于光照贴图的分辨率通常低于法线贴图,结果可能显得模糊。其他问题包括:由于缺乏 mipmapping,远处可能出现锯齿,以及降噪步骤可能导致细节被涂抹。要了解如何在此模式下使用具有程序化法线的自定义着色器,请参阅 Normal Mapping 章节。

Dominant Direction

此模式类似于 Unity 中 Enlighten 和 Progressive 烘焙器的实现。它与大多数着色器兼容,仅生成一张额外的贴图,运行时开销极小。缺点是凹凸贴图的效果较弱,略显灰暗,与实时光照下的同一物体相比可能差异较大。

RNM

基于最初为《Half-Life 2》开发的 Radiosity Normal Mapping 技术(相关演示文稿),后来被许多游戏采用(如《Mirror's Edge》)。此模式总共生成三张 HDR 贴图,是内存占用最高的模式之一,但运行时开销仍相对较低。该模式比 Dominant Direction 更精确,能更好地再现表面反差,并能正确处理来自不同角度、具有不同颜色的光照对法线贴图的影响。

SH

基于论文《Precomputed Global Illumination in Frostbite》。这是最高质量的模式,能提供更好的表面对比度,并准确表现来自不同方向、不同颜色的光照。总共生成四张贴图,其中仅一张为 HDR,因此比 RNM 占用更少内存。运行时开销略高于 RNM。

MonoSH
Dominant Direction、完整 SH 与 MonoSH 的尺寸/质量对比

与 SH 类似,但使用单色的 L1 方向系数。表面对比度同样良好,虽然无法准确表现来自不同方向的不同颜色光照,但对多数场景来说已经足够。仅生成一张额外贴图,因此显存占用与带宽需求与 Dominant Direction 相近;事实上更低,因为 Dominant Direction 使用 RGBA 贴图,而 MonoSH 只需 RGB。该贴图通过内置的方向光照贴图系统传递,但在标准着色器下显示不正确。请务必使用兼容的着色器。

限制
  • RNM 和 SH/MonoSH 只能与 Bakery shader 一起使用,或者需要对你的着色器进行调整。
  • 在 RNM 和 SH 模式下,不会生成标准的颜色光照贴图。你需要确保场景中所有材质都使用 Bakery Shader,或者使用 Lightmap Groups 将 RNM/SH 对象与其他对象分开。
  • RNM 和 SH 贴图是通过 MaterialPropertyBlock 应用于对象的,因此在 Unity 的 Lighting 窗口中可能无法完全显示。
  • Dominant Direction、RNM 和 SH/MonoSH 模式可能需要为全局光照(GI)和光照网格使用更多采样,以获得相近的质量。

Texels per unit

1 vs 10 texels per unit

每个世界单位的光照贴图像素(Texels)近似数量。它会影响生成光照贴图的数量和分辨率。

入门示例值:

  • 大型户外区域(城市):1 - 5
  • 中型户外区域(几条小巷):10 - 20
  • 高质量室内场景:100

假设场景比例大约为 1 单位 = 1 米。在 Unity 中使用这种比例通常是推荐的,以便更好地导航和进行物理模拟。如果你的比例不同,请相应地调整 Texels。

请注意,Texels Per Unit 是基础分辨率,但每个对象还可以通过 Mesh Renderer 上的 "Scale in Lightmap" 选项以及 Bakery 窗口中的 "Scale per map type" 进行额外调整。

Bulbgraph.png 将 "Scale in Lightmap" 设置为 0 的对象不会被烘焙,但仍会投射阴影并影响全局光照(GI)。

Max resolution

光照贴图的最大尺寸限制。如果对象无法容纳在单张光照贴图中(根据当前的 Texels Per Unit 值),将会分配额外的光照贴图。同样的四个正方形对象可以使用四张 512x512 的贴图,也可以使用一张 1024x1024 的贴图。


Bounces

注意更多的反弹会为封闭空间带来更多光照。

定义光线在表面上反弹的次数。通常,对于户外场景(例如城市),较低的反弹次数就足够了,而对于封闭场景(室内、洞穴),则需要较高的反弹次数。

虽然滑块最多限制为 5 次反弹,但可以在数字输入框中输入任意反弹次数。


Samples

左:Samples = 4,右:Samples = 16。为了演示,去噪功能已关闭。

影响全局光照(GI)的质量。典型值为 16 到 32。

Bulbgraph.png 可以输入超出滑块最大值的任意数字,但请注意,该数字表示最终光线数量的平方根,例如 32 表示 1024 条光线,64 表示 4096 条光线,依此类推。

GPU Priority

在 GPU 处理光照贴图时,操作系统和其他软件的响应可能会变慢。此选项允许你在烘焙速度和系统响应之间进行平衡。


Render

为所有打开的场景烘焙光照贴图。 如果 Light Probe Mode 设置为 L1 或 L2,也会烘焙 光照探针


Render Light Probes

为所有打开的场景烘焙 光照探针

请注意,要在 Shadowmask 模式下对动态对象获得正确的混合光阴影,你还需要启用 occlusion probes


Render Reflection Probes

为所有打开的场景烘焙反射探针。此按钮仅为方便起见,会调用引擎内置的反射探针更新功能。


Update Skybox Probe

为当前的 skybox 烘焙全局漫反射和反射探针。与 “Render Reflection Probes” 一样,它仅调用引擎内置函数。


Occlusion probes

在渲染光照探针时,允许 Unity 使用当前选择的内置光照烘焙器烘焙遮挡探针(occlusion probes)。遮挡探针是存储在普通光照探针中的附加数据,可以防止动态对象在阴影区域被错误照亮。目前在 Unity 中无法使用自定义遮挡探针,必须调用内置光照烘焙器来完成此操作。


Warnings

这些选项会在按下任意 Render 按钮后对场景进行验证,并显示警告对话框,询问是否继续或停止烘焙过程。

  • Suppress all popups(屏蔽所有弹窗):按下 Render 后不显示任何对话框。
  • UV validation(UV 验证):检查所有模型是否具有完全正确的光照贴图 UV,特别是 UV 是否位于 0-1 范围内且不重叠。
  • Overwrite check(覆盖检查):显示哪些光照贴图文件将被覆盖。
  • Memory check(内存检查):显示大致所需的视频内存量。
  • Sample count check(采样数检查):检查是否有光源、GI 或 AO 的采样数不合理,可能导致 GPU 超出可用资源。
  • Lightmapped prefab validation(光照贴图预制体验证):验证光照贴图预制体,并在某些预制体将被覆盖时发出通知。

渲染设置 (Advanced)

Light probe mode

更改光照探针的烘焙方式。

  • Legacy(传统模式):使用 Render Light Probes 按钮生成探针。点光源和方向光在光照烘焙器中计算,而区域光/天空光/间接光则通过在每个探针位置渲染立方体贴图收集。结果以 L2 球谐(spherical harmonics)形式存储。缺点是立方体贴图渲染速度慢,并且在游戏中使用的着色器未物理正确表示光照表面,或者项目为移动平台设置时,光照贴图和探针可能不匹配(Unity 可能会裁剪高强度值)。
  • L1:在点击 Render 时,光照探针会与光照贴图一起渲染。此选项提供更高的烘焙性能,并保证探针光照与光照贴图匹配。结果以 L1 球谐形式存储(仍可被普通着色器使用)。使用 Bakery shader 的 Non-Linear Light Probe SH 选项可以进一步提升结果。
  • L2:更高质量(完整 L2 球谐)。与 L1 一样,会自动与光照贴图一起渲染。与 L1 相比,性能影响可忽略不计。应在所有着色器下显示正常。探针对比度/方向性/振铃去除可通过 Project Settings -> Bakery -> “Ringing removal for L2 light probes” 调整。

在 Unity 2019.3 中似乎存在一个 bug,如果启用 Occlusion Probes 选项,Legacy 光照探针的颜色无法正确保存。使用 Occlusion Probes 时,默认且推荐使用 L2 模式。



Asset UV Processing

配置资产的 UV 间距(padding)调整。可选值:

  • Don't change(不更改):不修改资产。
  • Adjust UV padding(调整 UV 间距):会查找具有自动生成 UV 的模型(资产上启用 “Generate Lightmap UVs”),并进一步调整它们,使每个网格的 UV 岛之间具有适当间距。导入器设置中的全模型 Pack Margin 会被忽略。系统会根据每个网格的面积和光照贴图分辨率计算出最优值。
  • Adjust UV padding for new meshes only(仅调整新网格的 UV 间距):与上面相同,但会跳过之前至少调整过一次的模型。
  • Remove UV adjustments(移除 UV 调整):撤销所有之前的 UV 调整,使自动展开的模型恢复到 Unity 原始展开的样子。

Denoiser

设置所需的去噪器。可选值:

  • Optix 5:使用 OptiX 5.1 AI 去噪器(之前称为 “Legacy denoiser”)。在 GPU 上运行。支持从 Kepler(通常是 GeForce 6xx)到 Turing(通常是 GeForce 20xx)的所有显卡。不支持 Ampere(30xx)。OptiX 5.1 使用嵌入的静态训练数据集,因此不受驱动实现影响。
  • Optix 6:使用 OptiX 6.0 AI 去噪器(之前为默认选项)。在 GPU 上运行。在 Kepler(6xx)显卡上似乎无法使用,但在更新的显卡上均可运行,包括 Ampere(30xx)。自 6.0 起,OptiX 去噪器的训练数据集存储在驱动中。在 v442.50 之前,其行为类似于 OptiX 5.1;但之后 NVIDIA 更改了数据集,结果可能有所不同。更新后的数据集有时可能产生网格状图案和更亮的边缘(仍可通过 “Denoise: fix bright edges” 修复),但运行速度更快。
  • Optix 7:使用 OptiX 7.2 AI 去噪器。行为类似 OptiX 6.0,但在 Ampere(30xx)上可能支持更好。
  • OpenImageDenoise:使用 Intel Open Image Denoise 库。在 CPU 上运行(任何支持 SSE 4.1 的 CPU)。可能略慢于 OptiX,但质量可比。
  • OpenImageDenoise2:使用 Intel Open Image Denoise 2,CUDA 模式。在 GPU 上运行,性能与 OptiX 6/7 相当,质量与 CPU 版本相同。

Adjust sample positions

寻找最佳采样位置以防止光照泄漏。算法详情可参考 此处。在某些情况下(通常是大型且多边形极少、法线平滑的几何体),可能会产生不正确的结果,此时可以将其禁用。


Unload scenes before render

在烘焙前卸载 Unity 场景以释放显存。复杂场景仅在编辑器中显示就可能占用数 GB 的显存。


Denoise

左:未开启 “Denoise”,右:开启 “Denoise”。

如果启用,将应用去噪算法。


Fix Seams

左:缝隙(“Fix Seams” 关闭),右:缝隙已修复(“Fix Seams” 开启)。

如果启用,将尝试融合由 UV 不连续造成的缝隙。对平滑几何体很有用,包括 Unity 默认的球体。


Split by scene

如果同时加载多个场景,并且启用此选项,每个场景将拥有自己的一套光照贴图,而不会与其他场景共享。这对于在运行时流式加载场景时限制纹理占用量非常有用。


Hole filling

“Hole filling” 关闭与开启的对比。

如果 Atlas Packer 设置为 xatlas,将尝试填充每个孔洞,从而生成更高效的贴图集。对于几何体非常复杂的场景,可能会增加场景导出时间,但通常推荐开启。


Min resolution

光照贴图的最小尺寸限制。可用于在生成大量小而完全填充的光照贴图与少量未完全填充的光照贴图之间进行平衡。


Scale per map type

允许你对颜色贴图、Shadowmask 和方向贴图设置不同的分辨率缩放。例如,常见情况是间接光颜色分辨率较低,但 Shadowmask 分辨率较高。请注意,缩放在光照贴图渲染完成后才应用,因此不会节省烘焙时间。如果启用了 “Adjust UV padding”,间距将基于最低分辨率的贴图,以防止像素泄漏。


Checker preview

Checker Preview 功能演示。

如果勾选了 “Show checker” 选项,场景视图将在可见对象上渲染棋盘格图案,以展示光照贴图像素大小。这对于在烘焙前确保 Texels Per Unit 和其他影响分辨率的设置使用合理数值非常有用。

启用 Checker Preview 将强制 Bakery 执行贴图集打包。可能需要一些时间,但通常不会超过几秒钟。在修改场景内容后,按下 “Refresh checker” 可重新打包场景以查看更改。

Checker Preview 还使用随机颜色显示场景将如何被分割到不同的光照贴图中。

Bulbgraph.png 当前 Checker Preview 无法显示地形的正确像素大小。

Atlas preview

Atlas Preview 功能演示

当 Checker Preview 开启时,会显示 Atlas Preview 按钮。点击它将打开一个新窗口,显示未来光照贴图的 UV 布局。点击 "<" 和 ">" 按钮可浏览各个光照贴图。 这对于在烘焙前检查打包质量和光照贴图数量非常有用。


Emissive boost

将任何表面自发光(emission)乘以此数值。


Indirect boost

将所有反弹光照乘以此数值。作用与光源组件上的 Indirect Intensity 相同,但为全局设置。


Backface GI

Backface GI
左:“Backface GI” = 0,右:“Backface GI” = 1。注意阴影区域接收到更多的绿色光照。

决定光线通过前面表面到达背面并被全局光照(GI)反弹的程度。这对于薄的半透明表面(如树叶)尤其有用。取值范围为 0-1。


Ambient occlusion

左:AO intensity = 0,右:AO intensity = 1。

一种简单的非物理环境光遮蔽(Ambient Occlusion,AO),可在最终场景光照上叠加以增强美观效果。

  • Intensity(强度):控制 AO 效果的可见度。值为 0 时禁用该效果。
  • Radius(半径):决定 AO 效果使用的光线距离。较小的值产生局部遮蔽(角落、褶皱),较大的值则更类似 Skylight,从远处物体产生阴影。
  • Samples(采样数):影响环境光遮蔽的质量。典型值为 4 到 32。

Dither transparency

通过自动抖动不透明度贴图来启用半透明阴影。了解 Bakery 如何处理不透明度贴图


RTX Mode

启用 RTX 硬件加速。仅 RTX 显卡可受益于此选项。最低支持的驱动版本为 418。

驱动可以在大多数非 RTX Nvidia 显卡上模拟 RTX 模式,但通常会更慢。

在 Ampere(3xxx)或更新的显卡上,RTX 模式 必须 启用。


Export terrain trees

如果启用,绘制在地形上的树木将影响光照。树木本身不会被烘焙。请注意,在烘焙过程中,每棵树都使用最高可能的 LOD 等级。对于多公里范围且模型高度复杂的森林场景,不建议使用此选项。


Terrain optimization

如果启用(默认),地形将使用独立的光线追踪技术以利用其高程图几何结构。否则,它们将像其他普通网格一样处理。地形优化可以显著减少高分辨率地形所需的内存占用。在某些情况下,它还能加快地形烘焙速度,但在其他情况下(尤其是简单低分辨率地形)可能需要禁用该选项。

Bulbgraph.png 地形优化当前不兼容绘制的地形洞。需禁用此选项才能使其正常工作。
Bulbgraph.png 地形优化仅支持非 RTX 模式。

Light Mesh batch limit

如果该值大于 0,会将多个 Light Mesh 合并为一个,前提是它们具有相同设置并影响相同的 Lightmap Groups,同时将它们的总采样数限制为该值(例如,如果限制为 64,则可以合并 2 个采样数为 32 的灯光,或 4 个采样数为 16 的灯光,等等)。在拥有大量 Light Mesh 的场景中,这可以提升性能。但设置过高时需小心,因为 GPU 在一次处理过多采样时可能触发操作系统驱动超时。


Compress volumes

如果启用,将对体积 3D 贴图应用纹理压缩,并将 Bakery 着色器切换到相应的采样模式。不推荐对分辨率非常低的体积使用此选项。体积大小可能会被调整为 4 的倍数。

注意事项:

  • 目前仅支持压缩为 BC6H/BC7 纹理格式(桌面/主机平台)。
  • 体积压缩仅支持 Unity 2020.1 或更高版本。
  • 目前仅标准渲染管线的 Bakery 着色器支持使用压缩体积贴图。

Samples multiplier

将所有阴影和 GI 采样数乘以指定因子。可用于在草稿质量和最终质量之间快速切换。


Tile size

GPU Priority 相同,但这里设置的是贴图块(tile)大小。Bakery 会将光照贴图拆分为更小的块,并一次更新一个块。块越小,GPU 工作被中断的次数越多,系统响应性可能更好。


Temp path

临时文件夹。在渲染过程中,Bakery 可能需要几个 GB 的可用空间。将此文件夹放在 SSD 上相比 HDD 可略微加快渲染速度。目前,该文件夹不会自动清理。你可以随时手动删除其内容(渲染时除外),或通过 Bakery -> Utilities -> Clear cache 清理。


Output path

光照贴图文件夹。所有光照贴图,以及 lightprobe 和顶点颜色(vertex color)资源都将保存在此处。该路径相对于你的 Assets 文件夹。


Use scene named output path

如果启用此选项,输出路径将自动设置为与当前活动场景同名的文件夹(Assets/CurrentSceneName/)。这与 Unity 内置光照贴图烘焙器的行为类似。


Render Selected Groups

仅烘焙包含所选对象的 Lightmap Groups。 不仅仅是所选对象会被重新绘制,它们所属的所有 Lightmap Groups 都会被处理。其他光照贴图不会被更新。如果对象不属于某个手动分配的组,则使用相同光照贴图的场景部分将被重新烘焙。

目前,使用 Sectors 进行场景部分烘焙更为方便。


Beep on finish

如果启用,Bakery 在烘焙完成时会播放提示音。

渲染设置 (Experimental)

Unwrapper

如果启用 Adjust UV Padding,则定义将使用的展开器(unwrapper)。


Atlas Packer

选择在将不同对象的 UV 布局打包到大型光照贴图集时使用的算法。

  • Default:Bakery 在 v1.7 之前使用的原始算法。
  • xatlas:使用 xatlas。

某些功能仅支持特定的贴图集打包器:

Default xatlas
Override resolution 支持 不支持
高效 LOD 打包 不支持 支持
Hole filling 不支持 支持

请注意,贴图集打包器(Atlas Packer)也可以为每个 Lightmap Group 单独选择。


Export geometry and maps

如果启用,Bakery 会在渲染前将场景导出为其专用格式。如果你确定场景的几何体和贴图以及光照贴图分辨率设置没有改变(例如,你只是调整 GI 或光源设置),可以禁用此选项以加快下一次渲染速度。


Update unmodified lights

如果启用,Bakery 会重新计算自上次渲染以来未改变的光源。如果你只是调整某个光源,不想等待其他光源重新渲染,可以禁用此选项。


Update modified lights and GI

如果启用,Bakery 会重新计算自上次渲染以来发生变化的 GI 和光源。


UV padding: increase only

仅在启用 Adjust UV padding 时可见。默认情况下,模型资源的最佳 UV 间距仅基于当前加载的场景进行计算。如果同一模型有多个实例使用不同的光照贴图分辨率,最小的分辨率将决定间距,以确保 UV 图块之间的间距足够大,防止相互重叠。然而,在两个不同的独立场景中烘焙同一模型时,为新场景优化可能会破坏之前场景中的 UV。勾选此选项可以防止这种情况发生,即永远不减小间距值,从而始终为曾经烘焙过的最低分辨率实例进行优化。


Denoise: fix bright edges

左:去噪后可见明亮边缘;右:已修复。

仅在 Denoise 启用时可见。有时用于去噪的神经网络可能会在阴影周围产生明亮边缘,就像应用了锐化效果一样。如果启用此选项,Bakery 会尝试将其滤除。启用后,去噪阶段可能会略微变慢。

此功能也可用于滤除“火花”(fireflies),即光照贴图中偶尔出现的亮点。


Post-packing

有时在渲染场景时,Bakery 会将光照贴图拆分为多个子光照贴图,例如在烘焙不同 LOD 或地形时。 Post-packing 会尝试通过将这些子光照贴图合并到同一纹理中来最小化最终贴图集数量。 建议保持此选项启用。


Combine with Enlighten real-time GI

如果启用,则在按下 Render 按钮时,Bakery 会首先尝试使用 Enlighten 烘焙以计算实时 GI。之后,将进行常规的 Bakery 光照贴图烘焙过程。烘焙 GI 和实时 GI 将协同工作。


Bake on remote server

启用网络烘焙(Network baking)。


Presets

当前在 Experimental 模式下的 Render/Update 按钮下显示。

  • 点击 New 将所有当前设置保存到预设文件中。
  • 默认情况下,当一个预设处于激活状态时,所有设置都会被灰显,以防止覆盖预设。
  • 点击 Modify preset 可更改设置并覆盖预设。
  • 可以通过预设字段切换预设。将其设置为 None 可禁用预设使用。

组件

Bakery Lightmap Group Selector

指定对象及其所有子对象使用的 Lightmap Group。 Lightmap Group 是 Bakery 用来表示共享同一光照贴图的对象集合的术语。每个组都有属性,告诉 Bakery 如何打包对象、哪些光源影响它们,以及结果是烘焙到纹理还是顶点。

默认情况下,所有静态对象会自动打包到多个光照贴图组(贴图集)中,因此通常无需手动管理。手动定义组仅用于特殊用途,例如:

  • 指定某些对象使用 每顶点光照贴图 而非纹理。
  • 使用建模软件中的原始未缩放 UV 烘焙光照贴图。
  • 将关卡的特定区域分组以使用单张光照贴图,从而便于资源流式加载或通过脚本在运行时切换不同的烘焙光照。
  • 使用 Render Selected Groups 按钮仅更新已分组的对象。

要手动定义组,可以创建 Lightmap Group Assets,方法包括使用 Assets->Create 菜单,或在组件中使用 Create New 按钮。使用 Create New 按钮时,将根据以下表单创建新的资源:

  • Name:要创建的 Lightmap Group 资源的名称。
  • Packing Mode:此选择器定义 Lightmap Group 的打包模式,共有 3 种模式:
    • Original UV:对象及其子对象将使用未修改的 UV 进行烘焙,不执行打包。适用于多个网格共享同一已打包 UV 布局的模型。
    • Pack Atlas:对象及其子对象将打包到专用纹理贴图集中。在 v1.3 之前,每个可打包的子对象都需要有此组件,但现在不再需要。每个子对象将作为单独矩形打包,除非 Bakery 自动检测到子对象有非重叠的子对象,在这种情况下,多个对象可以使用同一个矩形。
    • Vertex:对象及其子对象将使用顶点色烘焙光照而非纹理。注意,需要使用自定义着色器才能生效,例如 Bakery Shader。文档中也提供了一个简单的着色器(“Bakery/Simple Vertex Lightmapped”)用于演示和参考。了解更多关于顶点光照贴图的信息
  • Directional mode:允许你覆盖该组的 directional mode。选项与全局相同,Auto 将使用全局设置。
  • Resolution:所需的光照贴图分辨率。
  • Auto-resolution:使用 Texels Per Unit 来确定最接近的二次幂分辨率。
  • Atlas packer:为该组选择 贴图集打包 算法。
  • Bitmask:用于排除光源影响光照贴图的开关列表。每个 Bakery 光源也有一个位掩码设置。光源只会影响与其共享至少一个开关的 Lightmap Group。默认设置意味着所有光源影响所有光照贴图。
Transparent selfshadow关闭 vs 开启:注意一些单面但背向的多边形如何被正确照亮。

如果你有一个被分配了“Pack Atlas”模式的 Lightmap Group,组件上将会出现额外设置:

  • Override resolution:覆盖该对象及其子对象在光照贴图中占用的分辨率。
  • Resolution:手动定义的分辨率。例如,如果你有一个分辨率为 512 的光照贴图,并且分配给 4 个对象,同时覆盖分辨率设置为 256,Bakery 将生成一个 512x512 的光照贴图,每个对象正好占据 256x256 的区域。

如果你选择一个 Lightmap Group 资产,将会显示额外的实验性设置:

  • Subsurface scattering: (点击阅读更多)
  • Normal offset:允许你将光线从表面偏移。这很少有用,主要用于实验目的。
  • Transparent selfshadow:从表面后方发射光线,使其不会在自身投射阴影。对于半透明叶片可能有用。
  • Vertex sampling density,(仅当 Packing Mode 设置为 Vertex 时可用):默认情况下,每个顶点只计算一个值;如果采样密度 > 0,则会在三角形上分散采样并求平均,从而生成超采样、更平滑的结果。

Bakery Lightmapped Prefab

此组件允许预制件存储光照贴图元数据。这样处理后的预制件可以在任意场景中实例化,无论是在编辑器中还是运行时。 该组件应直接添加到预制件的根对象上。不支持嵌套预制件。由于预制件在烘焙后会被覆盖(类似于按下“Apply”按钮的效果),因此要求预制件没有任何未应用的更改(子对象不应移动,材质和脚本参数应保持不变等)。如果检测到此类更改,组件界面会显示错误,烘焙后不会保存任何元数据。如果启用了 Lightmapped prefab validation 警告,所有预制件错误也会在烘焙前以对话框形式显示。

光照贴图预制件支持所有 Bakery 功能,例如 LOD、地形、方向光贴图、RNM、SH、顶点模式和 Shadowmask。要使 Shadowmask 生效,光源也必须是同一预制件的一部分。

Bulbgraph.png 注意,由于 API 限制,预制件 Shadowmask 仅在 Unity 2017.4 或更高版本中可用。

烘焙后,一个名为 “BakeryPrefabLightmapData” 的对象会被添加到预制件中。该对象包含一个脚本,存储应用光照贴图所需的所有数据。

此外,光照贴图预制件允许保存当前渲染设置,并使用两个按钮将其加载回任意已打开的场景:

  • Save current render settings to prefab:在该预制件上存储当前渲染设置的副本。
  • Load render settings from prefab:将当前渲染设置设置为预制件中存储的设置。
应用预制件

烘焙光照贴图预制件时,建议检查:

  • 预制件已“应用”。在旧版 Unity 中,点击 Inspector 右上角的 “Apply” 按钮。在新版 Unity 中,点击 “Overrides” 列表,然后选择 “Apply All”。
  • 预制件组件 UI 不显示任何错误。
  • [推荐] 在主窗口启用 “Lightmapped prefab validation” 复选框。点击 Render 时不会显示任何关于预制件的警告对话框。
Bulbgraph.png 光照贴图以其烘焙所在的场景或所使用的 Lightmap Group 命名(如果有)。在同一场景中烘焙不同预制件时,请确保使用不同命名的 Lightmap Group 或更改 输出路径
Bulbgraph.png 当使用相同模型逐个烘焙多个预制件时,建议将 Asset UV Processing 设置为“Don't Change”,以防止修改共享模型的 UV。
Bulbgraph.png Bakery 的预制件工作流程是在 Unity 提供“预制件双击进入视图”功能之前实现的。因此,在隔离预制件视图中光照贴图可能无法正确应用,组件可能显示 “This GameObject is not a prefab” 信息。但在普通场景中使用时应能正常工作。
Bulbgraph.png 当解包已烘焙的预制件并取消与现有光照贴图的关联时,请确保删除保存预制件范围光照贴图/渲染器连接的 BakeryPrefabLightmapData 对象。

Bakery Direct Light

纯直射光 + GI
左:“Shadow Spread” = 0.01,右:0.05。注意阴影从锐利逐渐变模糊的效果。

无限远方向光(例如太阳)。

  • Color:光的颜色。
  • Intensity:线性色彩乘数。
  • Shadow Spread:光源尺寸,或者简单说,阴影的模糊度。0 = 阴影最锐利,1 = 阴影最模糊。从技术上讲,它在单条光线与更宽光锥之间插值。
  • Shadow Samples:影响阴影质量。Shadow Spread 值越小,所需样本越少即可得到干净图像。太阳阴影的典型值为 1 到 16。设置为 0 时,该光源的阴影将消失。
  • Bitmask:用于排除此光源对特定 Lightmap Groups 影响的开关列表。
  • Baked contribution:确定应烘焙哪类光照数据。仅在 Indirect 或 Shadowmask 模式可见。可选值:
    • Direct and Indirect:直射光与间接光都完全烘焙。
    • Indirect only:实时光提供直射贡献,仅烘焙间接光。
    • Shadowmask and indirect:实时光提供直射贡献,静态几何体的阴影烘焙到单独贴图,动态与静态阴影混合。间接光正常烘焙。
    • Direct, Indirect, Shadowmask(仅自定义光照):与直射和间接相同,但 Shadowmask 也生成,可与自定义着色器一起使用。
  • Denoise shadowmask:确定是否对该光源的 Shadowmask 应用去噪。通常不需要,因为阴影噪点不明显,但对非常宽且模糊的阴影(大 Shadow Spread)可能有用。
  • Indirect intensity:非物理 GI 乘数。自然光照应为 1,可根据场景风格调整。
  • Anti-alias:对阴影执行超采样。
  • Texture projection:在光照上投射乘法平铺纹理,可用于模拟远处云影。

当设置了纹理投影时,可以使用“Tiling”和“Offset”字段调整其缩放和偏移。或者,点击 "Tweak projection in Scene View" 并使用额外的 Gizmo 可视化移动和缩放投影。点击“Render reference frame”可保存光源视角的 PNG,这对于在场景上绘制云影很有用。

如果同一对象同时启用了 Unity 和 Bakery 光源且参数不匹配,会出现两个按钮:

  • Match lightmapped to real-time:将 Unity 光源的通用设置复制到 Bakery 光源。
  • Match real-time to lightmapped:将 Bakery 光源的通用设置复制到 Unity 光源。
Bulbgraph.png 从物理角度看,Bakery 的方向光强度(Intensity)等于照度(Lux)除以 π。

Bakery Sky Light

纯天空光与 GI

无限远的带阴影环境光(天空)。

  • Color: 颜色。
  • Intensity: 线性色彩倍增。
  • Sky texture: 可选的立方体贴图资源,例如 HDRI 全景图,用于从不同方向影响光照颜色。
Bulbgraph.png 旋转天空光的 GameObject 会相应旋转立方体贴图的光照。
  • Samples: 影响阴影质量。典型值为 8 到 32。
  • Hemispherical: 如果启用,光照仅来自上方(上半球)。否则来自所有方向。
  • Bitmask: 用于排除此光源影响特定 Lightmap Groups 的开关列表。
  • Baked contribution: 决定应烘焙哪种光照数据。仅在 Indirect/Shadowmask 模式下可见。可能值:
    • Direct and Indirect: 直接和间接光照都将完全烘焙。这是默认且推荐的天空光行为,因为在 Unity 中没有实时版本可以模拟它们。
    • Indirect only: 假定实时光源提供直接贡献;仅烘焙间接光照。

如果天空光的设置与当前场景的天空盒不匹配,将出现两个按钮:

  • Match this light to scene skybox: 将活动天空盒材质的通用设置复制到 Bakery 天空光。当前仅支持使用 “Skybox/Cubemap” 或 “Skybox/Bakery skybox” 着色器的天空盒。
  • Match scene skybox to this light: 将 Bakery 天空光的通用设置复制到场景天空盒。

Bakery Light Mesh

Left: Samples Near = 0, Samples Far = 4096.
Middle: Samples Near = 0, Samples Far = 128.
Right: Samples Near = 16, Samples Far = 128.
请注意,光照效果看起来相似,但使用的合并采样数量更少。

任何形状的自发光网格。应与 Mesh Renderer 组件或设置为 Area 模式的 Light 组件一起使用。

  • Color:颜色
  • Intensity:线性颜色倍增器
  • Cutoff:最大光照距离。Bakery 会在接近该限制时额外衰减正确的平方反比衰减。当 Cutoff 值刚好对应物理衰减变得非常暗的位置时效果最佳。Cutoff 可提升烘焙性能,也可以设置为非常高(不可达)的值以保证完全正确性。
  • Self Shadow:决定光源网格自身是否投射阴影。此选项同时启用更精确的光照算法。
  • Samples Near:影响靠近网格的光照质量。典型值为 16 到 64,仅当 Self Shadow 开启时可用。
  • Samples Far:影响远离网格的光照质量。典型值为 4 到 4096。

Bakery 基于光源表面距离混合两种不同的区域光算法。靠近光源时,算法类似 GI,而远处光源被近似为虚拟点光云。

Bulbgraph.png
  • 光源网格自身不会接收光照,也不会被烘焙到光照贴图中。
  • 一个拥有大量多边形的光源网格比烘焙多个简单的光源网格要快
  • 如果结果总是脏/噪点较多,可以尝试将 Samples Near 设置为 0,这样只使用 VPL 算法。对于不需要精度的简单光源(如建筑物的窗户光),这也非常有用。
弯曲的光源网格
  • Bitmask:用于排除此光源影响特定 Lightmap Groups 的开关列表。
  • Baked contribution:决定烘焙哪种类型的光照数据。仅在 Indirect 或 Shadowmask 模式下可见。可能的值:
    • Direct and Indirect:完全烘焙直接和间接光贡献。这是默认且推荐的光源网格行为,因为 Unity 中没有实时版本可以模拟它们。
    • Indirect only:实时光源提供直接光贡献,仅烘焙间接光。
    • Shadowmask and Indirect:实时光源提供直接光贡献,但静态几何体的阴影会烘焙到单独的贴图。动态和静态阴影将混合在一起。间接光照将照常烘焙。目前仅 HDRP(和自定义渲染器)支持混合区域光。
    • Direct, Indirect, Shadowmask (custom lighting only):与 Direct and Indirect 相同,但同时生成 Shadowmask 并分配用于自定义着色器。
  • Indirect intensity:非物理 GI 倍增器。自然光照应设为 1,但可修改以实现更风格化的场景。
  • Shadowmask with falloff:将完整光衰减烘焙进 Shadowmask(仅对自定义着色器有用)。

如果网格材质和光源设置不匹配,将出现两个按钮:

  • Match light to material:将网格材质或区域光的通用设置复制到 Bakery 光源。
  • Match material to light:将 Bakery 光源的通用设置复制到网格材质或区域光。

Light Mesh 与自发光材质的区别

自发光材质:

  • 在 GI 计算中传播光线,因此是“免费的”,无论有多少网格是自发光的。
  • 小而明亮的光可能会产生不准确或有噪点的结果,这取决于 GI 的采样数量。
  • 由于 Bakery 中 GI 的工作方式,它必须占用光照贴图空间,因此可能会浪费空间。同时,这意味着自发光对象需要有效的 UV,并且必须启用“投射阴影”。

Light Mesh:

  • 光照会为每个光源单独计算,因此比自发光材质慢。
  • 设计用于为小而明亮的光提供干净的光照效果,即使距离很远也能保持效果。
  • 不占用光照贴图空间。

Bakery Point Light

左:“Shadow Spread” = 0.5,右:“Shadow Spread” = 1。

点光源,没有面积。尽管在物理上不可能,但在游戏中很有用,并且是匹配 Unity 点光源和聚光灯的唯一方式。

Bulbgraph.png 聚光灯只是带有额外投影遮罩的点光源。
  • Color: 颜色
  • Intensity: 线性色彩倍增
  • Shadow spread: 阴影模糊度。虽然点光源没有面积,但通常希望它仍能产生模糊阴影。为此,阴影被模拟为从球形区域光源投射。此参数定义了虚拟球体的半径,直接影响阴影模糊度。
  • Physical falloff: 如果启用,将使用正确的平方反比衰减,并在边界附近额外衰减。否则将尝试模拟 Unity 的衰减。
  • Falloff min size: 详见 Point Light Attenuation 部分。
  • Range: 如果物理衰减被禁用,则等于 Unity 的光源范围;如果启用,只会在边缘轻微衰减物理衰减。
  • Samples: 影响阴影质量。典型值为 1 到 512。设置为 0 将使该光源的阴影消失。
从左到右:Omni,Cookie(默认聚光灯纹理),Cubemap,IES。
  • Projection mask: 遮罩/Cookie 类型。选项:
    • Omni: 无遮罩,相当于 Unity 的点光源。
    • Cookie: 纹理投影遮罩。附加选项:
      • Cookie texture: 2D 纹理资源。Bakery 包含原始 Unity 聚光灯纹理(名为 ftUnitySpotTexture),可用于模拟。
      • Angle: 纹理投影角度(类似 Unity 聚光灯)。
      • Correct distortion: 修正宽角下直线可见的 cookie 失真。
    • Cubemap: 立方体贴图投影遮罩。附加选项:
      • Projected cubemap: 立方体贴图资源。
    • IES: 光照由 IES 文件数据调制。附加选项:
      • IES file: .ies 扩展名文件。
  • Bitmask: 用于排除该光源影响特定 Lightmap Groups 的开关列表。
  • Baked contribution: 决定应烘焙哪种类型的光照数据。仅在 Indirect 或 Shadowmask 模式下可见。可能值:
    • Direct and Indirect: 直接光和间接光完全烘焙。
    • Indirect only: 实时光提供直接光,仅烘焙间接光。
    • Shadowmask and Indirect: 实时光提供直接光,但静态几何体阴影烘焙到单独贴图中,动态和静态阴影混合,间接光正常烘焙。
    • Direct, Indirect, Shadowmask (custom lighting only): 与 Direct and Indirect 相同,同时生成 Shadowmask 用于自定义着色器。
  • Indirect intensity: 该光的非物理 GI 倍增。自然光应为 1,可根据风格化场景修改。
  • Shadowmask with falloff: 将完整光衰减(除距离外)烘焙到 Shadowmask(仅自定义着色器有用)。
  • Legacy sampling: 使用 Bakery 原始更偏置的阴影采样策略。产生无噪点阴影,但宽半影可能出现条纹。禁用后使用无偏但更有噪点的技术。

如果同一对象同时启用了 Unity 和 Bakery 光源,且设置不匹配,则会出现两个按钮:

  • Match lightmapped to real-time: 将 Unity 光的常用设置复制到 Bakery 光。
  • Match real-time to lightmapped: 将 Bakery 光的常用设置复制到 Unity 光。
Bulbgraph.png 从物理角度来看,Bakery 点光源的“Intensity”为 Candela 除以 Pi。

Bakery Volume

由 BakeryVolume 照亮的动态门(动态 GIF,由 NOTLonely 制作)


体积(Volumes)生成存储每个体素光探针的 3D 纹理(L1 球面调和和阴影贴图),使其成为常规 Unity 光探针的可行替代方案。


Unity Light Probes Unity LPPV Bakery Volumes
手动放置每个光探针
在一个物体上插值多个光探针
运行时可移动
可以放入预制件
完整脚本 API
“Ringing” 伪影 可能出现 可能出现 已修正
去噪
运行时开销 CPU:低开销;GPU:低开销 CPU:中等开销;GPU:中等开销 CPU:无开销;GPU:中等开销

Bakery Volume 是一个与一组 3D 纹理(3 个 SH 纹理和一个可选的 shadowmask)关联的边界盒,使其非常易于使用和编程。Volumes 可以在运行时轻松地交换、移动、加载或卸载,也可以与预制件关联。它们不需要任何 Light Probe Groups 或手动探针布置;整个 Volume 都由均匀的探针体素网格填充。光/影泄漏会自动像处理光照贴图一样修复(尽管对于较大的体素尺寸,薄的双面墙可能会出现问题,但可以通过在不同侧使用不同 Volume 避免)。由于体素网格的均匀特性,也可以对其应用类似光照贴图的降噪,这是常规光探针无法做到的。此外,Bakery 着色器使用 Geomerics 采样技巧,完全消除了高对比度 HDR 光照下 SH 有时会产生的 “ringing” 伪影。

因此,Volumes 可以为动态物体生成干净、精细、高质量的烘焙光照(即来自静态物体并影响动态物体的光照,而不是相反)。

Volume 方法的唯一缺点是每像素着色开销较高。其开销类似于 LPPV(随着屏幕上受体素影响的像素数量而缩放),但与 LPPV 不同的是,一旦烘焙完成,Volumes 本身不会再更新。多个 Volume 的混合可以通过稍微重叠它们来避免。

设置 Volume 变换

Volume 控制柄

当 BakeryVolume 被添加到一个 GameObject 时,场景视图中会出现一个边界盒控制柄。拖动小方块即可缩放它。

还有其他方法可以更改 Volume 的大小和位置:

  • 将任何可渲染的 GameObject 拖入 “Wrap to object” 字段。Volume 会包裹该对象(及其子对象),以将它们完全包含在内。
  • 如果同一个对象上添加了 Box Collider,则会出现 “Set from box collider” 和 “Set to box collider” 按钮。可以用它们快速在 Volume 和 Collider 之间复制数值。

分辨率

当启用 “Adaptive resolution” 时,体素数量由 “Voxels per unit” 控制。禁用它可以手动输入分辨率。对于大多数 1 单位 = 1 米 的游戏来说,一个合理的 “Voxels per unit” 值是 2,但在某些情况下(例如动态门)使用较小但更高分辨率的 Volume 会更有利。

其他设置

  • Enable baking: 是否需要(重新)计算 Volume?禁用可防止覆盖已有数据。
  • Denoise: 在烘焙 Volume 后应用去噪。推荐用于高分辨率 Volume。避免用于覆盖许多光源的低分辨率 Volume,因为去噪器难以区分实际内容和噪声。
  • Global: 自动将此 Volume 分配给所有兼容 Volume 的 Shader,除非它们有覆盖设置。内部会调用 Shader.SetGlobalTexture()/SetGlobalVector()。

使用方法

Volumes 可以分配给使用 Volume 感知 Shader 的对象。Bakery 自带实现该功能的 “Bakery Standard” Shader,以及 HDRP 和 URP 的 Shader 图。请查看 example_volumes 场景,了解应用 Volume 的各种方式。

提示

  • 确保查看示例。
  • 如果两个 Volume 相连,让它们略微重叠。重叠大小应等于最大动态对象的尺寸。这样在运行时简单切换 Volume 就能正常工作。
  • 仅在动态对象实际可达的区域放置 Volume。例如,使用玩家高度限制 Volume 的高度。

旋转 Volumes

如果启用 “Rotate around Y” 选项,Volumes 可以绕 Y 轴旋转。旋转开销非常低,只使用 2 个额外的浮点数据(预计算的角度 sin/cos)。

还可以在运行时旋转 Volumes(Experimental -> “Support rotation after bake” 以及 Bakery Shader 中的类似选项),这种情况下 Volume 必须在初始旋转为零时进行烘焙。

在 URP 中,这种动态旋转可以与 `BakeryURPVolumeGraphRotatable.shadergraph` 一起使用。

对于全局 Volume,动态旋转会在组件被(重新)启用或调用 `volume.SetGlobalParams()` 时更新。使用局部旋转 Volume 时,需要手动在材质或 MaterialPropertyBlock 上设置旋转:

SetMatrix("_VolumeMatrix", volume.GetMatrix())

技术信息

Volumes 可以自动工作(查看示例场景),也可以通过脚本控制其使用方式。

可以通过组件的以下公共属性获取 Volume 数据:

  • `bakedTexture0`:存储 L0 RGB 系数和 L1 Z 红色通道在 alpha 中。
  • `bakedTexture1`:存储 L1 X RGB 系数和 L1 Z 绿色通道在 alpha 中。
  • `bakedTexture2`:存储 L1 Y RGB 系数和 L1 Z 蓝色通道在 alpha 中。
  • `bakedMask`:存储体积阴影遮罩。
  • `bounds`:Volume 的包围盒。

所有 `bakedTexture*` 使用 RGBAHalf(每体素 8 字节)格式,mask 使用 ARGB32(每体素 4 字节)。阴影遮罩也可以使用单通道 R8 格式(每体素 1 字节)。

因此 Volume 的字节大小 = width * height * depth * 3 * 8 + (仅当使用阴影遮罩时)width * height * depth * 4(或使用 R8 mask 时为 width * height * depth)。

可以对 Volume 启用纹理压缩,使其体积显著减小。

采样 Volume 需要特殊 Shader,这些 Shader 已包含在 Bakery 中。要在自定义 Shader 中添加 Volumes,请查看 HDRP/URP 包中包含的 `BakeryVolume_float()` 函数(位于 `BakeryDecodeLightmap.hlsl`)。


Bakery Light Filter

彩色玻璃,如在 "Bakery Real-Time Preview" 中所见。Bakery lightmapper 烘焙出的结果相同。

将渲染器标记为光过滤器(Light Filter)。过滤器会用其颜色着色所有直接和间接光线,类似于现实中的光学滤镜,从而实现彩色透明效果(例如彩色玻璃)。唯一的参数是用于着色的纹理。

  • 光过滤器对象仍然会像其他对象一样接收光照贴图。
  • 过滤器不会散射或模糊光线(如需此效果,请尝试 Subsurface ScatteringBackface GI)。
  • 过滤器可以产生带颜色的阴影。如果灯光使用 Shadowmask 模式,则结果只会保存 R 通道(因为 Unity 仅支持单通道遮罩)。对于完全烘焙的阴影,则没有限制。



Bakery Sector

参见 Partial scene baking.


Bakery Always Render

如果添加到一个物体上,Bakery 在烘焙时将始终考虑该物体,即使它的 Renderer 被禁用。


Bakery Pack As Single Square

如果添加到一个物体上,Bakery 会将该物体及其子物体的 UV 视为单个组合方块,在自动图集打包或 Lightmap Group 的 Pack Atlas 模式下,它们之间永远不会被移动。整个子层级将作为一个整体打包。


Bakery Shared LOD UV

如果添加到一个 LODGroup 上,将标记所有同名 LOD 共享同一个光照贴图。默认情况下,每个 LOD 网格会获得独立的光照贴图,占用图集空间;但如果已知同一个物体的 LOD 拥有相似的 UV2(或者在没有 UV2 且 UV1 不重叠的情况下),它们可以映射到图集的同一部分,从而节省内存。 这种技术也称为 Lightmap Stealing

材质兼容性

漫反射和发光

Bakery 利用 Meta Pass 系统支持大多数 Unity 材质。所有内置、Surface、URP 和 HDRP 着色器都已经定义了正确的 Meta Pass。

如果你使用的是 Unlit 着色器,需要按照 Unity 文档手动添加 Meta Pass。

如果未定义该 Pass,Bakery 将假定 _MainTex_BaseColorMap_Color(如果未设置纹理)为材质的漫反射(Albedo),并将 _EmissionMap_EmissionColor 作为发光颜色。

为了使发光生效,Material.globalIlluminationFlags 必须设置为 MaterialGlobalIlluminationFlags.BakedEmissive。标准着色器会自动设置此值。

不透明度

材质参数被转换为 Cutout(默认)
通过“Dither Transparency”选项添加半透明值
Light Filter 组件用于红色平面,生成彩色阴影

默认情况下,Bakery 始终从 _MainTex_BaseColorMap_BaseMap 的 alpha 值获取全分辨率的不透明度,并将其视为 Cutout(1 位透明)。

当启用 Dither Transparency 选项时,半透明值会自动转换为可变蓝噪声,然后被滤波/模糊,产生部分透明效果(以前可以通过自定义手动抖动贴图实现,但从 v1.97 起自动完成)。

为了使不透明度生效,着色器的 RenderType 标签 必须为以下值之一:

  • Transparent
  • TransparentCutout
  • TreeLeaf

如果存在名为 _Cutoff 的属性,它将影响 Cutout(因此 Standard 着色器的 Cutoff 滑块会自动生效)。

在没有 Dither Transparency 的情况下,如果材质 RenderType 为 TransparentTreeLeaf,则 _Color 的 alpha 值会额外修改 Cutoff: finalCutoff = 1 - (1 - cutoff) * alpha

对于彩色透明效果,请使用 Light Filter 组件。

有关漫反射半透明效果,请参考 Backface GIsubsurface scattering

Alpha Meta Pass

从 v1.9 起,Bakery 还支持指定基于自定义着色器的透明度,但这需要使用兼容的着色器。要使用 Alpha Meta Pass,需要执行以下步骤:

  • 在着色器中添加一个名为 BAKERY_META_ALPHA_ENABLE 的属性。例如:
[HideInInspector] BAKERY_META_ALPHA_ENABLE ("Enable Bakery alpha meta pass", Float) = 1.0
  • 确保 RenderType 标签设置为上文提到的某个值。
  • 声明一个名为 META_BAKERY 的 Pass。
  • 在该 Pass 中检查 unity_MetaFragmentControl.w 是否非零,如果是,则返回计算出的透明度值。

示例可参考包内的 Baked_Alpha_meta.shader

注意:当前 Alpha Meta Pass 需要将 Light Probe Mode 设置为 L1 或 L2。

Normal mapping

自定义表面法线可以与 烘焙法线贴图 模式一起使用。不幸的是,Unity 的 Meta Pass 默认不输出法线信息,因此默认情况下,法线取自名为 _BumpMap 的贴图,并通过 _MainTex_ST 进行额外变换。

然而,可以制作完全自定义的着色器,带有高级法线映射功能(例如混合多层法线),并使其兼容烘焙。要实现这一点,需要执行以下步骤:

1. 在着色器中定义一个 Meta Pass,具体方法请参考 文档

2. 将该 Pass 命名为 "META_BAKERY",而不仅仅是 "META"

3. 包含文件 "BakeryMetaPass.cginc"

4. 添加 #pragma vertex vert_bakerymt

5. 如果 unity_MetaFragmentControl.z 变量不为 0,着色器应返回世界空间法线。返回的法线应使用 BakeryEncodeNormal 函数编码。

在 Assets/Bakery/examples/shaders 中包含了两个实现了扩展 Meta Pass 的示例着色器。

你也可以复制并修改 BakeryMetaPass.cginc 以满足你的需求,例如从顶点着色器传递额外数据。

正/背面

无论着色器使用何种剔除模式,Bakery 都将所有背面视为不透明,这意味着任何直接光线都不会穿过背面,就像它不会穿过正面一样。 然而,如果使用 Backface GI,背面可以部分发出正面接收到的光照。

扩展 Lightmap Parameters 资源

扩展 Lightmap Parameters

类似于 Bakery 的 Lightmap Group,Unity 也有 Lightmap Parameters,可以作为资源创建并分配给 Mesh Renderer。它们的逻辑有相似之处也有不同之处:

  • Lightmap Group 的主要用途是将多个对象组合到同一个图集。此外,它还允许覆盖该图集的烘焙设置。
  • Lightmap Parameters 主要用于覆盖对象的烘焙设置,但通过使用“Baked Tag”选项,它们也可以影响打包:具有不同 Baked Tag 的对象将永远不会共享同一个图集。

由于有些用户更习惯 Lightmap Parameters 的工作流程,Bakery 现在支持并扩展了它们:

  • Bakery 会遵循 Baked Tag 设置。
  • Lightmap Parameters UI 中将显示额外的 Bakery 特定选项。有关其含义,请参考 Lightmap Group 部分。

项目设置

一些全局设置可以在 Project Settings -> Bakery GPU Lightmapper 中调整(此选项仅在 Unity 2018.3 或更新版本可见;旧版本请编辑 BakeryProjectSettings.asset):

  • Mipmap lightmaps:启用光照贴图的 mipmap。随着图集变小,可能会导致 UV 图块之间的泄漏;另一方面,它可以减少远处高分辨率光照贴图的锯齿。总体上,建议对非常远的物体使用单独烘焙的 LOD 以及较低分辨率的光照贴图。
  • Color file format:常规 HDR 颜色光照贴图的文件格式。可选值:
    • HDR:Radiance HDR 格式(默认)。可用多种图像编辑器打开。
    • Asset:Unity 原生格式。可自定义 mipmap 数量。
  • Mask/Direction file format:额外 LDR 地图的格式,如阴影遮罩或方向数据。可选值:
    • TGA:8 位 Targa(默认)。
    • PNG:8 位 PNG。通常比 TGA 占用更少磁盘空间。
    • Asset:Unity 原生格式。可自定义 mipmap 数量。
  • Compress lightmaps:定义光照贴图资源的压缩行为。压缩光照贴图占用更少的显存,但可能会出现一些视觉伪影(例如色带或色斑),具体取决于压缩类型(移动端压缩问题请参见此处)。可选值:
      • Compress but allow overriding asset: 新的光照贴图将在启用压缩的情况下创建。创建后,可以在 Inspector 中更改它们的压缩设置。修改后的值将在重新烘焙后保留(默认)。
      • Force compress: 始终压缩所有光照贴图。
      • Force no compress: 始终生成未压缩的光照贴图。
  • High quality direction: 为方向贴图启用“高”质量压缩。实际格式取决于平台。例如在 PC 上,它会从 DXT1 改为 BC7,这提供了更高的质量,但 VRAM 使用量会翻倍。
  • Texel padding (default atlas packer): 定义在使用默认 atlas 打包器时,在光照贴图 atlas 中对象 UV 布局之间添加多少空白 texel。
  • Texel padding (xatlas packer): 同上,但在使用 xatlas 时。
  • Alpha Meta Pass resolution multiplier: 乘以 Alpha Meta Pass 的分辨率,使在低分辨率光照贴图烘焙时仍能实现精确的基于 Shader 的切割效果。
  • Volume render mode: 为所有 Volumes 使用哪种 渲染模式?Auto 使用当前活动的渲染模式(默认)。
  • Delete previous lightmaps before bake: 在烘焙新光照贴图之前,实际删除该场景中所有之前渲染的光照贴图文件。
  • Log level: 定义烘焙过程中在控制台输出的信息量。可能的值:
    • 0: 不输出任何内容。
    • 1: 仅输出进度信息。
    • 2: 仅输出警告。
    • 3: 输出全部信息。
  • Alternative scale in lightmap: 使渲染器属性 'Scale in Lightmap' 的行为更类似于 Unity 内置的行为。
  • Align to texture compression blocks with xatlas: 使 xatlas 将 chart 对齐到 4x4 块边界,从而获得更适合压缩的结果。
  • Generate smooth positions: 是否应调整采样位置以防止低多边形几何体在平滑法线下产生错误阴影?在使用法线差异极大的几何体时,可在极少数情况下禁用。技术说明见 这篇文章
  • Smooth positions per-triangle: 是否应按三角形决定平滑/平面位置?在使用法线差异极大的几何体时,可在极少数情况下禁用。
  • Use 'Receive GI' values: 在渲染器上考虑 “Receive Global Illumination” 值。最初 Bakery 会忽略它。
  • Remove ringing in Legacy light probes: 在 Legacy 模式下启用更柔和的光探针卷积,以防止高对比度区域出现伪影。
  • Always render reflection probes: 在每次 Render/Render Light Probes 后自动渲染反射探针。
  • Ringing removal for L2 light probes: 对 L2 光探针 应用去振铃处理。值越高,探针光照越平滑;这种平滑可以减少 [[1](https://docs.unity3d.com/6000.2/Documentation/Manual/light-probes-troubleshooting.html) 振铃] 伪影(如果存在)。
  • Put menu under Tools: 将 Bakery 菜单放入 Tools 菜单下。

如果任何格式设置为 Asset 且启用 mipmapping,会显示额外选项:

  • Maximum mipmap count: 定义 mipmap 的最大数量。例如,设置为 2,则 8K 光照贴图仅有两个额外 mipmap:4K 和 2K。更低分辨率将被省略,从而在 mipmapping 过程中限制泄漏伪影。

SkinnedMeshRenderer 支持

Bakery 自 v1.65 起支持蒙皮网格 (skinned meshes)。但是,有一些限制:

  • 某些 Unity 版本不支持蒙皮网格的 UV1,并会悄无声息地忽略 “Generate lightmap UVs”。请确保场景中实际使用的网格具有 UV1,并在可能的情况下使用非重叠的 UV0;
  • UV 填充调整在蒙皮网格上不起作用(Unity 在尝试调用 Unwrap 函数时似乎会崩溃);
  • 蒙皮网格不能使用每顶点光照贴图 (per-vertex lightmaps)(引擎不支持带蒙皮的 additionalVertexStreams)。

Shader Tweaks

左:默认双线性过滤。右:双三次过滤。
左:两个阴影都已烘焙。
中:球形阴影为动态,另一个阴影为静态。通过相乘组合在一起。
右:与中间相同,但使用默认最小值组合。

Bakery 提供可选的着色器修改,可以应用到 Unity 着色器上,以改善光照贴图采样并使实时光照更接近光照贴图效果。着色器调整菜单可以通过 Bakery->Shader Tweaks 访问。

这些选项会修补基础 Unity 着色器包含文件(来自 CGIncludes 文件夹),这些文件被大多数内置和第三方着色器使用。所有修改都会影响使用该版本编辑器打开的所有项目,但也可以轻松恢复。着色器调整会影响标准和表面着色器的工作方式。HDRP、URP 以及其他 SRP 不受影响。

所有可用修改显示为按钮。点击按钮应用修改,按钮将保持按下状态。再次点击按钮即可移除修改。目前可用选项:

Bulbgraph.png 可能需要以管理员身份运行 Unity 编辑器以使 CGIncludes 修补生效
  • Use bicubic interpolation for lightmaps: 光照贴图将使用双三次插值代替默认双线性。此调整能很好地修复低分辨率光照贴图的许多锯齿边缘。目前仅适用于 DX11 和现代主机,其他平台仍使用双线性。
  • Use multiplication for shadowmask: 使用相乘代替最小值组合静态和动态阴影。出于未知原因,Unity 默认使用最小值操作符,这会产生一些乘法不存在的伪影。
  • Use physical light falloff (forward): 用更物理正确的平方反比替换实时点光/聚光灯的默认衰减。“Range” 只会在边缘略微淡出(与 Bakery 光源启用 Physical Falloff 复选框效果一致)。仅影响 Forward 渲染器。详情见 Point Light Attenuation
  • Use physical light falloff (deferred): 同上,但仅影响 Deferred 渲染器。

衰减调整在 Unity >2017 版本上可能无法完全生效。此外,SRP 默认已经使用正确的衰减。