Skip to main content

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

本指南将介绍如何在 VRChat 中替换烘焙光照贴图。这项技术能帮助你创建昼夜双版本或多种光照效果的世界场景。相较于实时光源或着色叠加层等常见方案,该方法不仅经过优化,还能更精准地呈现光照效果。

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

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

image.png

设置场景

1、创建一个空游戏对象(建议命名为'Static'),将场景中所有需要烘焙的物体放在它的子对象下。

2、创建另一个游戏对象(建议命名为'Dynamic'),用于存放光源实体、反射探针和所有其他非静态对象(例如可通过材质编辑实现夜间变暗效果的水体着色器)等需根据不同光照条件切换材质的对象。

image.png

3、以刚刚搭建好的场景为基础制作第一个光照方案。然后通过 Ctrl+D 复制场景副本,为其他光照条件进行单独调整(副本场景的修改不会影响主场景)。

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

image.png

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

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

image.png

烘焙光照

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

2、在层级窗口(Hierarchy)中复制包含静态游戏对象的‘Static’游戏对象。

3、假设你想为世界制作白天和夜晚版本,请保持‘Day-Static’和‘Day-Dynamic’游戏对象不变,并将新复制的‘Night-Static’和‘Night-Dynamic’游戏对象移动到其下方远处。这样它们就可以以不同方式烘焙。

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

5、烘焙 (Bake) 场景即可。

堆叠几何体

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

image.png

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

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

image.png

更换天空盒

若你希望天空盒能随光照变化动态调整,仅依靠照明设置中的天空盒选项是不够的,可参考以下解决方案:

  1. 为每个光照场景添加一个应用了天空盒材质的倒置球体,并将照明选项卡中的天空盒设置留空。
  2. 也可以使用 Lyuma 的 SkyboxCubemapDual 着色器 —— 该着色器能通过太阳实体的旋转来切换两个天空盒。
  3. 此外,使用程序化天空盒并调整太阳实体旋转,也是可行的方案。

需要特别注意的是,务必确保反射探针(Reflection Probes)完全覆盖场景,因为回退反射数据的来源是照明选项卡中的天空盒(而你可能已将其留空)。

交互设置

完成烘焙并将所有元素堆叠后,如果需要在游戏内切换烘焙版本,不妨创建 Udon 行为(Udon Behaviour)来启用目标版本并禁用其他版本。

image.png

当然,你也可以通过制作动画来控制组件的启用与禁用 —— 这种方式在使用程序化天空盒时格外实用,能同步实现太阳横越天空的动画与烘焙光照贴图的切换,此时只需简单的动画器布尔值切换(Animator Bool Toggle)就能满足需求。

最后且最重要的一步

我想以一个非常重要的说明来结束本指南。

请务必在上传地图前默认启用所有烘焙变体!这一点对 Unity 能否完成所有内容的批处理至关重要。

比如,你可能希望场景从白天版本开始,便在 Unity 中禁用了夜间版本 —— 毕竟眼下似乎用不到它。但这样做会有问题:一旦用户在游戏中切换到夜间版本,该版本就会处于未批处理状态,此前通过这种方法获得的所有性能优势也会因此白费。

正确的做法是:加载时启用所有内容,同时设置一个 OnEnable udon 事件,通过该事件禁用除初始需要启用的版本之外的所有光照变体。这样能确保所有光照变体都被纳入批处理,其带来的差异显著且关键。

a07.jpg

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