何三思Unity Shader分享征服Unity3d

【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();
    }
}

如果本文对你有帮助的话,点个赞或者评论一下吧!

上一篇下一篇

猜你喜欢

热点阅读