如何为不同的光照条件切换对应的烘焙光照贴图
本指南将展示如何在本指南将介绍如何在 VRChat 中替换烘焙光照贴图。这项技术能帮助你创建昼夜双版本世界或实现多种光照场景。这项技术能帮助你创建昼夜双版本或多种光照效果的世界场景。相较于实时光源或着色叠加层等常见方案,该方法不仅经过优化,还能更精准地呈现光照效果。
此方法背后的核心原理是通过将同一静态网格体的多个副本置于场景不同位置进行差异化烘焙(烘焙多个不同版本的光照贴图)此方法的核心原理是通过将同一静态网格体的多个副本置于场景中不同位置进行差异化烘焙(即烘焙多个不同版本的光照贴图),随后将它们堆叠至同一坐标点。由于 VRChat 不允许直接修改光照贴图,此操作成为必要实现手段。这一操作成为必要的实现手段。
注:四年前我曾制作过视频教程,但本指南所有图片均已重新拍摄,内容也经过全面重制。
设置场景
首先,1、创建一个空游戏对象(建议命名为"static"建议命名为'Static
'),将场景中所有需要烘焙的物体放在它的子集下。将场景中所有需要烘焙的物体放在它的子对象下。
2、创建另一个游戏对象(建议命名为"dynamics"建议命名为'Dynamic
'),用于存放光源实体、反射探针和所有其他非静态对象等需根据不同光照条件切换材质的非静态物体(反射探针和所有其他非静态对象(例如可通过材质编辑实现夜间变暗效果的水体着色器)。等需根据不同光照条件切换材质的对象。
以上述场景为基础调整首个光照方案。然后通过Ctrl+D复制场景副本,3、以刚刚搭建好的场景为基础制作第一个光照方案。然后通过 Ctrl+D 复制场景副本,为其他光照条件进行单独调整(副本场景的修改不会影响主场景)。
调整照明时请注意,最终仅允许存在一个方向光(最终仅允许存在一个方向光(Directional Light)。你可以使用不同层级(您可以使用不同层级(Layers)隔离让多个方向光影响不同网格,隔离多个方向光,使它们影响不同网格,但更简单的方法是用聚光灯(Spot Light)替代额外方向光。替代额外的方向光。
如图所示,一个放置在远处的聚光灯会是一个很好的替代方案。
在开放世界,比如拥有烘焙昼夜版本的《以太环礁》(Atoll of Ether) 上,你可以使用一个设置为“仅阴影”(shadows only) 的大型平面,来阻挡用于白天版本的方向光渗入夜间版本。
烘焙光照
1、在你心满意足地设置好不同的光照场景后,将包含非静态物体和其他物体以及光源实体(之前称为“dynamics”将包含非静态物体、其他物体以及光源实体(之前称为‘Dynamics’游戏对象)的游戏对象复制到你的主场景中。的游戏对象复制到主场景中。
然后在您的层级结构(hierarchy)中复制您的“static”游戏对象,该对象包含您的静态游戏对象。2、在层级窗口(Hierarchy)中复制包含静态游戏对象的‘Static’游戏对象。
假设您想为您的世界制作一个白天和夜晚版本,请保持您的 3、假设你想为世界制作白天和夜晚版本,请保持‘Day-static(白天-静态)和 Static’和‘Day-dynamic(白天-动态)Dynamic’游戏对象不变,并将新复制的 并将新复制的‘Night-static(夜晚-静态)和 Static’和‘Night-dynamic(夜晚-动态)游戏对象移到其下方远处。这样它们就可以以不同的方式烘焙。Dynamic’游戏对象移动到其下方远处。这样它们就可以以不同方式烘焙。
4、使用前面提到的设置为“shadows only”(仅阴影)的大型平面来分隔这两者,以使光照保持分离。
现在烘焙5、烘焙 (Bake) 您的场景。场景即可。
堆叠几何体
将每个场景中的物体整理在2个游戏对象内的原因,是为了在此步骤中便于操作。
如图所示,烘焙后你将获得两个间隔很远的不同光照条件。请确保你同时烘焙了光照探针(Lightprobes)和反射探针(Reflection probes)。现在只需将这些版本全部置于相同坐标上 —— 将相关游戏对象("static"组和"dynamic"组)的坐标设为0,0,0即可。
请注意:Unity 无法烘焙两个以上版本的光照探针,因此请选择最具有普适性的光照场景的那组探针。您也可以选择仅用无阴影的实时光源照亮虚拟形象,但这会带来较大的性能开销。
更换天空盒
如果您希望随光照更换天空盒,不能仅依赖照明设置中的单一天空盒。若你希望天空盒能随光照变化动态调整,仅依靠照明设置中的天空盒选项是不够的,可参考以下解决方案:
请为每个光照场景添加一个应用了天空盒材质的倒置球体,并将照明选项卡中的天空盒留空。
- 为每个光照场景添加一个应用了天空盒材质的倒置球体,并将照明选项卡中的天空盒设置留空。
- 也可以使用 Lyuma 的 SkyboxCubemapDual
着色器着色(通过太阳实体旋转切换两个天空盒)。器 —— 该着色器能通过太阳实体的旋转来切换两个天空盒。 - 此外,使用程序化天空盒并调整太阳实体旋转,也是可行的方案。
或者,您可使用
使用程序化天空盒并调整太阳实体旋转也是良好解决方案。
需要特别注意的是,务必确保反射探针(Reflection Probes)完全覆盖场景,因为回退反射探针数据源自照明选项卡的天空盒(您可能已将其留空)完全覆盖场景,因为回退反射数据的来源是照明选项卡中的天空盒(而你可能已将其留空)。
交互设置
完成烘焙并堆叠所有元素后,您可能需要在游戏内切换烘焙版本。
为此,只需创建 Udon 行为(udon行为(Udon behaviour)来启用一个版本并禁用其他版本:Behaviour)来启用目标版本并禁用其他版本。
或者,你也可以通过制作动画来控制组件的启用/禁用。
若使用程序化天空盒并希望同步实现太阳横越天空的动画与烘焙光照贴图切换,此方法尤为实用。
此时,简单的动画器布尔值切换(这种方式在使用程序化天空盒时格外实用,能同步实现太阳横越天空的动画与烘焙光照贴图的切换,此时只需简单的动画器布尔值切换(Animator Bool Toggle)即可满足需求。就能满足需求。
最后且最重要的一步
我想以一个非常重要的说明来结束本指南。
请确保在加载时默认启用所有烘焙变体!请务必在上传地图前默认启用所有烘焙变体! 这对于这一点对 Unity 能够批处理所有内容非常重要。假设您希望您的世界从白天版本开始,并在能否完成所有内容的批处理至关重要。
比如,你可能希望场景从白天版本开始,便在 Unity 中禁用夜间版本,因为它目前似乎不需要。如果您这样做,而用户在游戏中切换到夜间版本,它将使夜间版本处于未批处理状态,这意味着通过此方法获得的所有性能优势都将化为乌有。中禁用了夜间版本 —— 毕竟眼下似乎用不到它。但这样做会有问题:一旦用户在游戏中切换到夜间版本,该版本就会处于未批处理状态,此前通过这种方法获得的所有性能优势也会因此白费。
相反,请在加载时启用所有内容,设置一个正确的做法是:加载时启用所有内容,同时设置一个 OnEnable udon 事件,并让该事件禁用除您希望生成时启用的版本之外的所有光照变体。这将确保所有光照变体都被批处理。这样做带来的差异是巨大且关键的。通过该事件禁用除初始需要启用的版本之外的所有光照变体。这样能确保所有光照变体都被纳入批处理,其带来的差异显著且关键。
替换烘焙光照具有很大的性能优势,并且比使用实时光或带色调的相机覆盖层感觉更自然。目前很少有世界使用这种技术,本指南中展示的是《以太环礁》(Atoll of Ether),但 VRChat Home(VRChat 主页)也会替换烘焙光照。