Unity3D:光照探针和场景加载
推荐:将NSDT场景编辑器加入你的3D工具链
3D工具集:NSDT简石数字孪生
光照探针和场景加载
Unity 会根据您加载或卸载场景的方式而以不同方式更新其光照探针数据。
Unity 使用 LightProbes C# 对象为所有当前加载的场景存储光照探针数据。LightProbes
对象包含一个内部数据结构,称为四面体曲面细分。Unity 在其计算中使用四面体曲面细分来确定光照探针照亮游戏对象的方式。
加载或卸载场景时,Unity 会自动更新 LightProbes
对象,以包含所有当前加载的场景中所有光照探针的位置和系数。但是,Unity 是否更新四面体曲面细分取决于加载或卸载场景的方式。
使用 LoadSceneMode.Single 加载场景时,Unity 会在加载过程中自动更新四面体曲面细分,因为新的光照探针数据会完全替换以前的光照探针数据。
使用 LoadSceneMode.Additive 加载场景或使用 UnloadSceneAsync 卸载场景时,Unity 不会自动更新四面体细分,因为需要重新计算新的或移除的光照探针数据 - 这是一项计算成本高昂的操作,并且在此操作后可能会有后续场景需要加载或卸载。
因此,Unity 为您提供了需求重新四面体化事件,允许您决定何时重新四面体化新的光探针数据。例如,如果要以累加方式加载五个新场景,则不希望将数据重新四面体化五次,在每个场景加载后一次。相反,您只想在所有五个场景都已加载并且所有新的光照探针数据准备就绪后重新四面体化数据。
如果 Unity 使用过时的四面体曲面细分来执行计算,则结果将不会考虑任何新加载或卸载的光照探针。这意味着光照探针可能无法按预期照亮游戏对象,而且对 LightProbes.CalculateInterpolatedLightAndOcclusionProbes() 或 LightProbes.GetInterpolatedProbe() 的调用可能会返回意外结果。
要强制 Unity 更新四面体曲面细分,可以调用 LightProbes.Tetrahedralize 或 LightProbes.TetrahedralizeAsync()。这些函数使 Unity 使用所有当前加载的场景的所有光照探针中的数据来更新四面体曲面细分。
更新四面体曲面细分是一项 CPU 密集型操作,并且随着光照探针数量的增加,CPU 的负载也会增加。如果要加载和卸载多个场景,并且由于更新四面体细分而对性能产生了影响,那么最好是延迟更新:等到加载或卸载了一定量的内容或者等到 CPU 负载不太可能影响应用程序性能时,再进行更新。
由3D建模学习工作室整理翻译,转载请注明出处!
上一篇:Unity3D:光照探针和网格渲染器 (mvrlink.com)
下一篇:Unity3D:Light Probe Proxy Volume component (mvrlink.com)