【Unity3D技术文档翻译】第3.6.2.4篇 自定义光衰减(
2018-08-01 本文已影响1人
何三思
Unity3D技术文档翻译
每种自定义光衰减预设的视觉效果。
上一章:【Unity3D技术文档翻译】第3.6.2.3篇 UV重叠结果(UV overlap feedback))
本章原文所在章节:【Unity Manual】→【Graphics】→【Graphics Overview】→【Lighting】→【Global Illumination】→【Progressive Lightmapper】→【Custom fall-off】
自定义光衰减(Custom fall-off)
在真实世界中,光随着距离增加而淡出,而且昏暗的光要比明亮的光范围更低。属于“衰减(fall-off)”指的就是光的淡出速率。在 Unity 中,除了默认的光照衰减效果,你还可以使用自定义的衰减设置。
渐进式光照贴图提供了自定义的衰减预设,你可以通过脚本来控制。下图展示了它们的运行效果,图片下面则贴出了一个使用该功能的脚本例子。
属性 | 作用 |
---|---|
InverseSquared(平方反比) | 应用一个平方反比距离衰减模型。这意味着,灯光的强度与距离光源的距离成反比例衰减。该选项在物理上是最精确的。 |
InverseSquaredNoRangeAttenuation(平方反比,但没有衰减范围) | 应用一个平方反比距离衰减模型,但是没有平滑的衰减范围。工作方式与 InverseSquared 相同,但是不是随着距离参数衰减(比如:点光源和聚光灯)。 |
Legacy(遗留模型) | 应用一个平方衰减模型。该模型的灯光衰减基于距离光源的距离,但是具有一个强烈而不自然的急速衰减,该模型的视觉效果不真实。 |
Linear(线性) | 应用一个线性衰减模型。在该模型下,衰减与距离成平方反比,衰减程度由光源的一个混合速率(fixed rate)决定。 |
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();
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); ld.Init(ref dLight); break;
case UnityEngine.LightType.Point: LightmapperUtils.Extract(l, ref point); ld.Init(ref point); break;
case UnityEngine.LightType.Spot: LightmapperUtils.Extract(l, ref spot); ld.Init(ref spot); break;
case UnityEngine.LightType.Area: LightmapperUtils.Extract(l, ref rect); ld.Init(ref rect); break;
default: ld.InitNoBake(l.GetInstanceID()); break;
}
ld.falloff = FalloffType.InverseSquared;
lightsOutput[i] = ld;
}
};
Lightmapping.SetDelegate(testDel);
}
void OnDisable()
{
Lightmapping.ResetDelegate();
}
}
如果本文对你有帮助的话,点个赞或者评论一下吧!