在现实世界中,光线会在远处淡化,而且昏暗的光线比明亮的光线具有更低的有效范围。“衰减”一词是指光淡化的速率。除了 Unity 的默认衰减光照行为外,还可以使用自定义衰减设置。
渐进光照贴图 (Progressive Lightmapper) 提供自定义衰减预设,您可以通过脚本来实现这些预设。请参阅表下方的图像以查看这些预设的工作原理的可视化表示,并参阅图像下方的代码示例来了解此功能的用法示例。
有关更多信息,请参阅 FalloffType。
注意:以下代码示例仅在使用烘焙 (Baked) 或混合 (Mixed) 光源时适用于渐进光照贴图程序。要将代码示例与实时光源结合使用,请使用 Enlighten 实时全局光照 (Realtime Global Illumination)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Experimental.GlobalIllumination;
using UnityEngine.SceneManagement;
[ExecuteInEditMode]
public class ExtractFalloff : MonoBehaviour
{
public void OnEnable()
{
Lightmapping.RequestLightsDelegate testDel = (Light[] requests, Unity.Collections.NativeArray<LightDataGI> lightsOutput) =>
{
DirectionalLight dLight = new DirectionalLight();
PointLight point = new PointLight();
SpotLight spot = new SpotLight();
RectangleLight rect = new RectangleLight();
DiscLight disc = new DiscLight();
Cookie cookie = new Cookie();
LightDataGI ld = new LightDataGI();
for (int i = 0; i < requests.Length; i++)
{
Light l = requests[i];
switch (l.type)
{
case UnityEngine.LightType.Directional: LightmapperUtils.Extract(l, ref dLight); LightmapperUtils.Extract(l, out cookie); ld.Init(ref dLight, ref cookie); break;
case UnityEngine.LightType.Point: LightmapperUtils.Extract(l, ref point); LightmapperUtils.Extract(l, out cookie); ld.Init(ref point, ref cookie); break;
case UnityEngine.LightType.Spot: LightmapperUtils.Extract(l, ref spot); LightmapperUtils.Extract(l, out cookie); ld.Init(ref spot, ref cookie); break;
case UnityEngine.LightType.Rectangle: LightmapperUtils.Extract(l, ref rect); LightmapperUtils.Extract(l, out cookie); ld.Init(ref rect, ref cookie); break;
case UnityEngine.LightType.Disc: LightmapperUtils.Extract(l, ref disc); LightmapperUtils.Extract(l, out cookie); ld.Init(ref disc, ref cookie); break;
default: ld.InitNoBake(l.GetInstanceID()); break;
}
ld.cookieID = l.cookie?.GetInstanceID() ?? 0;
ld.falloff = FalloffType.InverseSquared;
lightsOutput[i] = ld;
}
};
Lightmapping.SetDelegate(testDel);
}
void OnDisable()
{
Lightmapping.ResetDelegate();
}
}
注意:以上示例中的所有代码都是让自定义衰减产生效果所必需的;但是,您可以更改行 ld.falloff = FalloffType.InverseSquared; 中的 InverseSquared 以使用任何预设。
在 2018.1 NewIn20181 版中添加了渐进光照贴图程序
2018–03–28