Difference between revisions of "使用手册"
| Line 888: | Line 888: | ||
如果添加到一个 LODGroup 上,将标记所有同名 LOD 共享同一个光照贴图。默认情况下,每个 LOD 网格会获得独立的光照贴图,占用图集空间;但如果已知同一个物体的 LOD 拥有相似的 UV2(或者在没有 UV2 且 UV1 不重叠的情况下),它们可以映射到图集的同一部分,从而节省内存。 | 如果添加到一个 LODGroup 上,将标记所有同名 LOD 共享同一个光照贴图。默认情况下,每个 LOD 网格会获得独立的光照贴图,占用图集空间;但如果已知同一个物体的 LOD 拥有相似的 UV2(或者在没有 UV2 且 UV1 不重叠的情况下),它们可以映射到图集的同一部分,从而节省内存。 | ||
这种技术也称为 [https://github.com/laurenth-personal/LODLightmapScripts/ Lightmap Stealing]。 | 这种技术也称为 [https://github.com/laurenth-personal/LODLightmapScripts/ Lightmap Stealing]。 | ||
| + | |||
| + | = 材质兼容性 = | ||
| + | |||
| + | === 漫反射和发光 === | ||
| + | Bakery 利用 [https://docs.unity3d.com/Manual/MetaPass.html Meta Pass] 系统支持大多数 Unity 材质。所有内置、Surface、URP 和 HDRP 着色器都已经定义了正确的 Meta Pass。 | ||
| + | |||
| + | 如果你使用的是 Unlit 着色器,需要按照 Unity 文档手动添加 Meta Pass。 | ||
| + | |||
| + | 如果未定义该 Pass,Bakery 将假定 {{codeVar|_MainTex}}、{{codeVar|_BaseColorMap}} 或 {{codeVar|_Color}}(如果未设置纹理)为材质的漫反射(Albedo),并将 {{codeVar|_EmissionMap}} 和 {{codeVar|_EmissionColor}} 作为发光颜色。 | ||
| + | |||
| + | 为了使发光生效,[https://docs.unity3d.com/ScriptReference/Material-globalIlluminationFlags.html Material.globalIlluminationFlags] 必须设置为 [https://docs.unity3d.com/ScriptReference/MaterialGlobalIlluminationFlags.BakedEmissive.html MaterialGlobalIlluminationFlags.BakedEmissive]。标准着色器会自动设置此值。 | ||
| + | |||
| + | === 不透明度 === | ||
| + | [[File:Upload 2019-1-25 0-4-30.png|thumb|材质参数被转换为 Cutout(默认)]] | ||
| + | [[File:Alphacombos dither.jpg|thumb|通过“Dither Transparency”选项添加半透明值]] | ||
| + | [[File:Alphacombos filter.jpg|thumb|Light Filter 组件用于红色平面,生成彩色阴影]] | ||
| + | |||
| + | 默认情况下,Bakery 始终从 {{codeVar|_MainTex}}、{{codeVar|_BaseColorMap}} 或 {{codeVar|_BaseMap}} 的 alpha 值获取全分辨率的不透明度,并将其视为 Cutout(1 位透明)。 | ||
| + | |||
| + | 当启用 '''Dither Transparency''' 选项时,半透明值会自动转换为可变蓝噪声,然后被滤波/模糊,产生部分透明效果(以前可以通过自定义手动抖动贴图实现,但从 v1.97 起自动完成)。 | ||
| + | |||
| + | 为了使不透明度生效,着色器的 [https://docs.unity3d.com/Manual/SL-SubShaderTags.html RenderType 标签] 必须为以下值之一: | ||
| + | |||
| + | * {{codeVar|Transparent}} | ||
| + | * {{codeVar|TransparentCutout}} | ||
| + | * {{codeVar|TreeLeaf}} | ||
| + | |||
| + | 如果存在名为 {{codeVar|_Cutoff}} 的属性,它将影响 Cutout(因此 Standard 着色器的 Cutoff 滑块会自动生效)。 | ||
| + | |||
| + | 在没有 Dither Transparency 的情况下,如果材质 RenderType 为 {{codeVar|Transparent}} 或 {{codeVar|TreeLeaf}},则 {{codeVar|_Color}} 的 alpha 值会额外修改 Cutoff: | ||
| + | ''finalCutoff = 1 - (1 - cutoff) * alpha'' | ||
| + | |||
| + | 对于彩色透明效果,请使用 [[Manual#Bakery_Light_Filter|Light Filter]] 组件。 | ||
| + | |||
| + | 有关漫反射半透明效果,请参考 [[#Backface GI|Backface GI]] 和 [[subsurface scattering]]。 | ||
| + | |||
| + | ==== Alpha Meta Pass ==== | ||
| + | 从 v1.9 起,Bakery 还支持指定基于自定义着色器的透明度,但这需要使用兼容的着色器。要使用 ''Alpha Meta Pass'',需要执行以下步骤: | ||
| + | |||
| + | * 在着色器中添加一个名为 '''BAKERY_META_ALPHA_ENABLE''' 的属性。例如: | ||
| + | {{code|<nowiki>[HideInInspector] BAKERY_META_ALPHA_ENABLE ("Enable Bakery alpha meta pass", Float) = 1.0</nowiki>}} | ||
| + | * 确保 RenderType 标签设置为上文提到的某个值。 | ||
| + | * 声明一个名为 '''META_BAKERY''' 的 Pass。 | ||
| + | * 在该 Pass 中检查 '''unity_MetaFragmentControl.w''' 是否非零,如果是,则返回计算出的透明度值。 | ||
| + | |||
| + | 示例可参考包内的 ''Baked_Alpha_meta.shader''。 | ||
| + | |||
| + | 注意:当前 Alpha Meta Pass 需要将 Light Probe Mode 设置为 L1 或 L2。 | ||
| + | |||
| + | === Normal mapping === | ||
| + | 自定义表面法线可以与 [[#Baked Normal Maps|烘焙法线贴图]] 模式一起使用。不幸的是,Unity 的 Meta Pass 默认不输出法线信息,因此默认情况下,法线取自名为 {{codeVar|_BumpMap}} 的贴图,并通过 {{codeVar|_MainTex_ST}} 进行额外变换。 | ||
| + | |||
| + | 然而,可以制作完全自定义的着色器,带有高级法线映射功能(例如混合多层法线),并使其兼容烘焙。要实现这一点,需要执行以下步骤: | ||
| + | |||
| + | 1. 在着色器中定义一个 Meta Pass,具体方法请参考 [https://docs.unity3d.com/Manual/MetaPass.html#ExampleMetaPassUnity 文档]。 | ||
| + | |||
| + | 2. 将该 Pass 命名为 {{codeVar|"META_BAKERY"}},而不仅仅是 {{codeVar|"META"}}。 | ||
| + | |||
| + | 3. 包含文件 {{codeVar|"BakeryMetaPass.cginc"}}。 | ||
| + | |||
| + | 4. 添加 {{codeVar|#pragma vertex vert_bakerymt}}。 | ||
| + | |||
| + | 5. 如果 {{codeVar|unity_MetaFragmentControl.z}} 变量不为 0,着色器应返回世界空间法线。返回的法线应使用 {{codeVar|BakeryEncodeNormal}} 函数编码。 | ||
| + | |||
| + | 在 Assets/Bakery/examples/shaders 中包含了两个实现了扩展 Meta Pass 的示例着色器。 | ||
| + | |||
| + | 你也可以复制并修改 BakeryMetaPass.cginc 以满足你的需求,例如从顶点着色器传递额外数据。 | ||
Revision as of 13:38, 5 November 2025
Contents
- 1 系统要求
- 2 前提条件
- 3 安装
- 4 快速开始
- 5 渲染设置
- 6 渲染设置 (Advanced)
- 6.1 Light probe mode
- 6.2 Asset UV Processing
- 6.3 Denoiser
- 6.4 Adjust sample positions
- 6.5 Unload scenes before render
- 6.6 Denoise
- 6.7 Fix Seams
- 6.8 Split by scene
- 6.9 Hole filling
- 6.10 Min resolution
- 6.11 Scale per map type
- 6.12 Checker preview
- 6.13 Emissive boost
- 6.14 Indirect boost
- 6.15 Backface GI
- 6.16 Ambient occlusion
- 6.17 Dither transparency
- 6.18 RTX Mode
- 6.19 Export terrain trees
- 6.20 Terrain optimization
- 6.21 Light Mesh batch limit
- 6.22 Compress volumes
- 6.23 Samples multiplier
- 6.24 Tile size
- 6.25 Temp path
- 6.26 Output path
- 6.27 Use scene named output path
- 6.28 Render Selected Groups
- 6.29 Beep on finish
- 7 渲染设置 (Experimental)
- 8 组件
- 8.1 Bakery Lightmap Group Selector
- 8.2 Bakery Lightmapped Prefab
- 8.3 Bakery Direct Light
- 8.4 Bakery Sky Light
- 8.5 Bakery Light Mesh
- 8.6 Bakery Point Light
- 8.7 Bakery Volume
- 8.8 Bakery Light Filter
- 8.9 Bakery Sector
- 8.10 Bakery Always Render
- 8.11 Bakery Pack As Single Square
- 8.12 Bakery Shared LOD UV
- 9 材质兼容性
系统要求
使用 Bakery 需要:
Windows(7 或更高版本)电脑。
Nvidia 显卡。最低支持型号为 Kepler(GeForce 650 或更新型号,Quadro 显卡请查看规格)。
64 位 Unity 编辑器。Bakery 已在 5.6 到 6 及更高版本上测试过,同时也在 Tuanjie 1.6.7 上通过测试。
前提条件
- 确保你的项目中没有任何脚本编译错误,否则也会导致 Bakery 的脚本无法编译。
- 确保你的显卡驱动是最新版本,如有需要请更新。
请使用 Game-Ready(标准)驱动程序,而不是 “Studio” 驱动。
安装
1. 通过 Asset Store 将 Bakery 导入到你的项目中。
2. Unity 会显示要导入的文件列表。如果这是你第一次使用 Bakery,建议直接 点击 Import(导入)。有经验的用户可以取消选中 examples 文件夹,以进行更轻量的安装。
文件将被导入到 `Assets/Bakery` 和 `Assets/Editor/x64/Bakery` 文件夹中。 这些文件夹之后可以移动。
3. Unity 随后会导入 Bakery 并编译脚本。此时可能会弹出如下窗口:
此时你应点击 “Go Ahead”(继续)。
现在你应该能在编辑器中看到新增的 Bakery 菜单:
快速开始
1. 添加一些模型或基础体,并将其标记为静态(Static)。
用于光照贴图的网格必须具有不重叠的 UV2。如果存在 UV2,则会使用 UV2(否则使用 UV1)。如果你的模型没有为光照贴图进行展开,请在资源中勾选 Generate Lightmap UVs(生成光照贴图 UV)。 Unity 的基础体已经具有正确的 UV2。
2. 选择方向光(Unity 为你创建的那个),并添加 Bakery Direct Light 组件。
3. Bakery Direct Light 有许多可调选项,但你可以轻松将其与 Unity 光源匹配。点击 Match lightmapped to real-time。现在 Bakery 光源的颜色应与 Unity 默认的方向光相同,呈黄色调。
4. 要获得带阴影的环境光,请创建 Skylight(Bakery->Create->Skylight)。
5. 选择 Skylight,为它设置一些偏蓝的颜色,然后点击 Match scene skybox to this light。 这将使场景的 skybox 与光照完全匹配。
6. 点击 Bakery->Render Lightmap。默认情况下,Full Lighting 模式是激活的。它会烘焙所有光源的直接和间接光照贡献。如果你想将实时阴影与烘焙全局光照(GI)结合使用,请将模式更改为 Indirect。
7. 点击 Render。
8. 完成!现在你应该已经得到烘焙的全局光照(GI):
渲染设置
所有渲染设置都可以通过 Bakery->Render Lightmap 访问。设置会为每个场景单独保存。Bakery 窗口顶部的选项允许你在 Simple(简单)、Advanced(高级)和 Experimental(实验)设置之间切换,每个后续模式都会显示更多可调选项。对于大多数场景,Simple 模式已经足够,是入门的好方法。
Render mode
定义要烘焙的光照贴图类型。
Full Lighting
烘焙所有 Bakery 光源的完整直接光和间接光。
Indirect
基础混合模式。它会查看每个光源上的 Baked Contribution 选择器:如果设置为 Direct And Indirect,则光源会像在 Full Lighting 模式下一样被烘焙。如果设置为 Indirect Only,则只会烘焙该光源的间接光照(GI)。在后一种情况下,你应保持对象上的 Unity 光源和 Bakery 光源同时存在,一个提供实时直接光照,另一个提供预计算的全局光照(GI)。
Shadowmask
更高级的混合模式。它通过生成两种类型的光照贴图来工作——一种包含烘焙颜色(如 Indirect 模式),另一种包含静态物体的阴影。它有几个优点:
- 实时阴影只需渲染少量动态对象,而不是整个场景。
- 实时阴影与烘焙阴影可以正确融合。
- 实时光源可以渲染凹凸贴图、高光和其他表面效果,同时仍会被高质量烘焙阴影遮挡。
要启用此行为,你必须在同一对象上同时存在 Unity 光源和 Bakery 光源,并将 Baked Contribution 设置为 Shadowmask and Indirect。未标记的光源将按 Indirect 模式进行烘焙。
Distance Shadowmask
此复选框仅在你选择 Shadowmask 时可见,并且只是切换项目 Quality Settings 中同名的设置。 更多详情
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
与 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
每个世界单位的光照贴图像素(Texels)近似数量。它会影响生成光照贴图的数量和分辨率。
入门示例值:
- 大型户外区域(城市):1 - 5
- 中型户外区域(几条小巷):10 - 20
- 高质量室内场景:100
假设场景比例大约为 1 单位 = 1 米。在 Unity 中使用这种比例通常是推荐的,以便更好地导航和进行物理模拟。如果你的比例不同,请相应地调整 Texels。
请注意,Texels Per Unit 是基础分辨率,但每个对象还可以通过 Mesh Renderer 上的 "Scale in Lightmap" 选项以及 Bakery 窗口中的 "Scale per map type" 进行额外调整。
Max resolution
光照贴图的最大尺寸限制。如果对象无法容纳在单张光照贴图中(根据当前的 Texels Per Unit 值),将会分配额外的光照贴图。同样的四个正方形对象可以使用四张 512x512 的贴图,也可以使用一张 1024x1024 的贴图。
Bounces
定义光线在表面上反弹的次数。通常,对于户外场景(例如城市),较低的反弹次数就足够了,而对于封闭场景(室内、洞穴),则需要较高的反弹次数。
虽然滑块最多限制为 5 次反弹,但可以在数字输入框中输入任意反弹次数。
Samples
影响全局光照(GI)的质量。典型值为 16 到 32。
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
如果启用,将应用去噪算法。
Fix Seams
如果启用,将尝试融合由 UV 不连续造成的缝隙。对平滑几何体很有用,包括 Unity 默认的球体。
Split by scene
如果同时加载多个场景,并且启用此选项,每个场景将拥有自己的一套光照贴图,而不会与其他场景共享。这对于在运行时流式加载场景时限制纹理占用量非常有用。
Hole filling
如果 Atlas Packer 设置为 xatlas,将尝试填充每个孔洞,从而生成更高效的贴图集。对于几何体非常复杂的场景,可能会增加场景导出时间,但通常推荐开启。
Min resolution
光照贴图的最小尺寸限制。可用于在生成大量小而完全填充的光照贴图与少量未完全填充的光照贴图之间进行平衡。
Scale per map type
允许你对颜色贴图、Shadowmask 和方向贴图设置不同的分辨率缩放。例如,常见情况是间接光颜色分辨率较低,但 Shadowmask 分辨率较高。请注意,缩放在光照贴图渲染完成后才应用,因此不会节省烘焙时间。如果启用了 “Adjust UV padding”,间距将基于最低分辨率的贴图,以防止像素泄漏。
Checker preview
如果勾选了 “Show checker” 选项,场景视图将在可见对象上渲染棋盘格图案,以展示光照贴图像素大小。这对于在烘焙前确保 Texels Per Unit 和其他影响分辨率的设置使用合理数值非常有用。
启用 Checker Preview 将强制 Bakery 执行贴图集打包。可能需要一些时间,但通常不会超过几秒钟。在修改场景内容后,按下 “Refresh checker” 可重新打包场景以查看更改。
Checker Preview 还使用随机颜色显示场景将如何被分割到不同的光照贴图中。
Atlas preview
当 Checker Preview 开启时,会显示 Atlas Preview 按钮。点击它将打开一个新窗口,显示未来光照贴图的 UV 布局。点击 "<" 和 ">" 按钮可浏览各个光照贴图。 这对于在烘焙前检查打包质量和光照贴图数量非常有用。
Emissive boost
将任何表面自发光(emission)乘以此数值。
Indirect boost
将所有反弹光照乘以此数值。作用与光源组件上的 Indirect Intensity 相同,但为全局设置。
Backface GI
决定光线通过前面表面到达背面并被全局光照(GI)反弹的程度。这对于薄的半透明表面(如树叶)尤其有用。取值范围为 0-1。
Ambient occlusion
一种简单的非物理环境光遮蔽(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
如果启用(默认),地形将使用独立的光线追踪技术以利用其高程图几何结构。否则,它们将像其他普通网格一样处理。地形优化可以显著减少高分辨率地形所需的内存占用。在某些情况下,它还能加快地形烘焙速度,但在其他情况下(尤其是简单低分辨率地形)可能需要禁用该选项。
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)。
- Default:使用 Unity 标准展开器。Bakery 会为每个具有不同间距参数的网格调用 Unwrapping.GenerateSecondaryUVSet。
- xatlas:使用 jpcy 的 xatlas,这是 Ignacio Castaño 的 thekla_atlas 的修改版。thekla_atlas 曾用于游戏《The Witness》(参见博客文章)。
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。默认设置意味着所有光源影响所有光照贴图。
如果你有一个被分配了“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 生效,光源也必须是同一预制件的一部分。
烘焙后,一个名为 “BakeryPrefabLightmapData” 的对象会被添加到预制件中。该对象包含一个脚本,存储应用光照贴图所需的所有数据。
此外,光照贴图预制件允许保存当前渲染设置,并使用两个按钮将其加载回任意已打开的场景:
- Save current render settings to prefab:在该预制件上存储当前渲染设置的副本。
- Load render settings from prefab:将当前渲染设置设置为预制件中存储的设置。
烘焙光照贴图预制件时,建议检查:
- 预制件已“应用”。在旧版 Unity 中,点击 Inspector 右上角的 “Apply” 按钮。在新版 Unity 中,点击 “Overrides” 列表,然后选择 “Apply All”。
- 预制件组件 UI 不显示任何错误。
- [推荐] 在主窗口启用 “Lightmapped prefab validation” 复选框。点击 Render 时不会显示任何关于预制件的警告对话框。
Bakery Direct Light
无限远方向光(例如太阳)。
- 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 光源。
Bakery Sky Light
无限远的带阴影环境光(天空)。
- Color: 颜色。
- Intensity: 线性色彩倍增。
- Sky texture: 可选的立方体贴图资源,例如 HDRI 全景图,用于从不同方向影响光照颜色。
- 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
任何形状的自发光网格。应与 Mesh Renderer 组件或设置为 Area 模式的 Light 组件一起使用。
- Color:颜色
- Intensity:线性颜色倍增器
- Cutoff:最大光照距离。Bakery 会在接近该限制时额外衰减正确的平方反比衰减。当 Cutoff 值刚好对应物理衰减变得非常暗的位置时效果最佳。Cutoff 可提升烘焙性能,也可以设置为非常高(不可达)的值以保证完全正确性。
- Self Shadow:决定光源网格自身是否投射阴影。此选项同时启用更精确的光照算法。
- Samples Near:影响靠近网格的光照质量。典型值为 16 到 64,仅当 Self Shadow 开启时可用。
- Samples Far:影响远离网格的光照质量。典型值为 4 到 4096。
Bakery 基于光源表面距离混合两种不同的区域光算法。靠近光源时,算法类似 GI,而远处光源被近似为虚拟点光云。
- 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
点光源,没有面积。尽管在物理上不可能,但在游戏中很有用,并且是匹配 Unity 点光源和聚光灯的唯一方式。
- Color: 颜色
- Intensity: 线性色彩倍增
- Shadow spread: 阴影模糊度。虽然点光源没有面积,但通常希望它仍能产生模糊阴影。为此,阴影被模拟为从球形区域光源投射。此参数定义了虚拟球体的半径,直接影响阴影模糊度。
- Physical falloff: 如果启用,将使用正确的平方反比衰减,并在边界附近额外衰减。否则将尝试模拟 Unity 的衰减。
- Falloff min size: 详见 Point Light Attenuation 部分。
- Range: 如果物理衰减被禁用,则等于 Unity 的光源范围;如果启用,只会在边缘轻微衰减物理衰减。
- Samples: 影响阴影质量。典型值为 1 到 512。设置为 0 将使该光源的阴影消失。
- 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 光。
Bakery Volume
体积(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 变换
当 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 上设置旋转:
技术信息
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
将渲染器标记为光过滤器(Light Filter)。过滤器会用其颜色着色所有直接和间接光线,类似于现实中的光学滤镜,从而实现彩色透明效果(例如彩色玻璃)。唯一的参数是用于着色的纹理。
- 光过滤器对象仍然会像其他对象一样接收光照贴图。
- 过滤器不会散射或模糊光线(如需此效果,请尝试 Subsurface Scattering 或 Backface GI)。
- 过滤器可以产生带颜色的阴影。如果灯光使用 Shadowmask 模式,则结果只会保存 R 通道(因为 Unity 仅支持单通道遮罩)。对于完全烘焙的阴影,则没有限制。
Bakery Sector
Bakery Always Render
如果添加到一个物体上,Bakery 在烘焙时将始终考虑该物体,即使它的 Renderer 被禁用。
Bakery Pack As Single Square
如果添加到一个物体上,Bakery 会将该物体及其子物体的 UV 视为单个组合方块,在自动图集打包或 Lightmap Group 的 Pack Atlas 模式下,它们之间永远不会被移动。整个子层级将作为一个整体打包。
如果添加到一个 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。标准着色器会自动设置此值。
不透明度
默认情况下,Bakery 始终从 _MainTex、_BaseColorMap 或 _BaseMap 的 alpha 值获取全分辨率的不透明度,并将其视为 Cutout(1 位透明)。
当启用 Dither Transparency 选项时,半透明值会自动转换为可变蓝噪声,然后被滤波/模糊,产生部分透明效果(以前可以通过自定义手动抖动贴图实现,但从 v1.97 起自动完成)。
为了使不透明度生效,着色器的 RenderType 标签 必须为以下值之一:
- Transparent
- TransparentCutout
- TreeLeaf
如果存在名为 _Cutoff 的属性,它将影响 Cutout(因此 Standard 着色器的 Cutoff 滑块会自动生效)。
在没有 Dither Transparency 的情况下,如果材质 RenderType 为 Transparent 或 TreeLeaf,则 _Color 的 alpha 值会额外修改 Cutoff: finalCutoff = 1 - (1 - cutoff) * alpha
对于彩色透明效果,请使用 Light Filter 组件。
有关漫反射半透明效果,请参考 Backface GI 和 subsurface scattering。
Alpha Meta Pass
从 v1.9 起,Bakery 还支持指定基于自定义着色器的透明度,但这需要使用兼容的着色器。要使用 Alpha Meta Pass,需要执行以下步骤:
- 在着色器中添加一个名为 BAKERY_META_ALPHA_ENABLE 的属性。例如:
- 确保 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 以满足你的需求,例如从顶点着色器传递额外数据。








