Skip to main content

如何为不同的光照条件切换对应的烘焙光照贴图

这是一个用于在本指南将展示如何在 VRChat 中切换光照贴图,虽简单但痛苦漫长的方法。而将这场噩梦提供给大家的办法,就是献祭你的的san值。中替换烘焙光照贴图。这项技术能帮助你创建昼夜双版本世界或实现多种光照场景。相较于实时光源或着色叠加层等常见方案,该方法不仅经过优化,还能更精准地呈现光照效果。

此方法背后的核心原理是通过将同一静态网格体的多个副本置于场景不同位置进行差异化烘焙(烘焙多个不同版本的光照贴图),随后将它们堆叠至同一坐标点。由于 VRChat 不允许直接修改光照贴图,此操作成为必要实现手段。

注:四年前我曾制作过视频教程,但本指南所有图片均已重新拍摄,内容也经过全面重制。

image.png

设置场景

首先,创建一个空游戏对象(建议命名为"static"),将场景中所有需要烘焙的物体放在它的子集下。

您可以通过这个视频(Youtube)的时间线来跳转到不同章节。创建另一个游戏对象(建议命名为"dynamics"),用于存放光源实体、反射探针和所有其他非静态对象等需根据不同光照条件切换材质的非静态物体(例如可通过材质编辑实现夜间变暗效果的水体着色器)。

image.png

以上述场景为基础调整首个光照方案。然后通过Ctrl+D复制场景副本,为其他光照条件进行单独调整(副本场景的修改不会影响主场景)。

调整照明时请注意,最终仅允许存在一个方向光(Directional Light)。你可以使用不同层级(Layers)隔离让多个方向光影响不同网格,但更简单的方法是用聚光灯(Spot Light)替代额外方向光。

image.png

如图所示,一个放置在远处的聚光灯会是一个很好的替代方案。

在开放世界,比如拥有烘焙昼夜版本的《以太环礁》(Atoll of Ether) 上,你可以使用一个设置为“仅阴影”(shadows only) 的大型平面,来阻挡用于白天版本的方向光渗入夜间版本。

image.png

烘焙光照

在你心满意足地设置好不同的光照场景后,将包含非静态物体和其他物体以及光源实体(之前称为“dynamics”游戏对象)的游戏对象复制到你的主场景中。

然后在您的层级结构(hierarchy)中复制您的“static”游戏对象,该对象包含您的静态游戏对象。

假设您想为您的世界制作一个白天和夜晚版本,请保持您的 Day-static(白天-静态)和 Day-dynamic(白天-动态)游戏对象不变,并将新复制的 Night-static(夜晚-静态)和 Night-dynamic(夜晚-动态)游戏对象移到其下方远处。这样它们就可以以不同的方式烘焙。

使用前面提到的设置为“shadows only”(仅阴影)的大型平面来分隔这两者,以使光照保持分离。

现在烘焙 (Bake) 您的场景。

堆叠几何体

将每个场景中的物体整理在2个游戏对象内的原因,是为了在此步骤中便于操作。

image.png

如图所示,烘焙后你将获得两个间隔很远的不同光照条件。请确保你同时烘焙了光照探针(Lightprobes)和反射探针(Reflection probes)。现在只需将这些版本全部置于相同坐标上 —— 将相关游戏对象("static"组和"dynamic"组)的坐标设为0,0,0即可。

请注意:Unity 无法烘焙两个以上版本的光照探针,因此请选择最具有普适性的光照场景的那组探针。您也可以选择仅用无阴影的实时光源照亮虚拟形象,但这会带来较大的性能开销。

image.png

更换天空盒

如果您希望随光照更换天空盒,不能仅依赖照明设置中的单一天空盒。

请为每个光照场景添加一个应用了天空盒材质的倒置球体,并将照明选项卡中的天空盒留空。

或者,您可使用 Lyuma 的 SkyboxCubemapDual 着色器(通过太阳实体旋转切换两个天空盒)。

使用程序化天空盒并调整太阳实体旋转也是良好解决方案。

务必确保反射探针(Reflection Probes)完全覆盖场景,因为回退反射探针数据源自照明选项卡的天空盒(您可能已将其留空)。

交互设置

完成烘焙并堆叠所有元素后,您可能需要在游戏内切换烘焙版本。

为此,只需创建 Udon 行为(udon behaviour)来启用一个版本并禁用其他版本:

image.png

或者,你也可以通过制作动画来控制组件的启用/禁用。

若使用程序化天空盒并希望同步实现太阳横越天空的动画与烘焙光照贴图切换,此方法尤为实用。

此时,简单的动画器布尔值切换(Animator Bool Toggle)即可满足需求。

最后且最重要的一步

我想以一个非常重要的说明来结束本指南。
请确保在加载时默认启用所有烘焙变体! 这对于 Unity 能够批处理所有内容非常重要。
假设您希望您的世界从白天版本开始,并在 Unity 中禁用夜间版本,因为它目前似乎不需要。如果您这样做,而用户在游戏中切换到夜间版本,它将使夜间版本处于未批处理状态,这意味着通过此方法获得的所有性能优势都将化为乌有。

相反,请在加载时启用所有内容,设置一个 OnEnable udon 事件,并让该事件禁用除您希望生成时启用的版本之外的所有光照变体。这将确保所有光照变体都被批处理。这样做带来的差异是巨大且关键的。

a07.jpg

替换烘焙光照具有很大的性能优势,并且比使用实时光或带色调的相机覆盖层感觉更自然。目前很少有世界使用这种技术,本指南中展示的是《以太环礁》(Atoll of Ether),但 VRChat Home(VRChat 主页)也会替换烘焙光照。