自定義衰減
在現(xiàn)實(shí)世界中,光線會(huì)在遠(yuǎn)處消失,而且昏暗的光線比明亮的光線具有更低的有效范圍?!八p”一詞是指光衰速率。除了 Unity 的默認(rèn)衰減光照行為外,還可以使用自定義衰減設(shè)置。
漸進(jìn)式光照貼圖 (Progressive Lightmapper) 提供自定義衰減預(yù)設(shè),您可以通過腳本來實(shí)現(xiàn)這些預(yù)設(shè)。請參閱表下方的圖像以查看這些預(yù)設(shè)的工作原理的可視化表示,并參閱圖像下方的代碼示例來了解此功能的用法示例。
屬性????????????????????????????????????????????????????????????????????功能
InverseSquared????????????
應(yīng)用距離平方倒數(shù)法衰減模型。意味著,光照強(qiáng)度與位置到光源的距離的平方成反比減小。有關(guān)更多信息,請參閱 Wikipedia:平方反比定律 (Inverse-Square law)。此選項(xiàng)在物理上是最準(zhǔn)確的。
InverseSquaredNoRangeAttenuation? ?
應(yīng)用距離平方倒數(shù)法衰減模型,但沒有平滑范圍衰減。此選項(xiàng)的原理與?Inversesquared
?此相同,但光照系統(tǒng)不考慮準(zhǔn)時(shí)光源(即點(diǎn)光源和聚光燈)的范圍參數(shù)的衰減。
Legacy????????????????
應(yīng)用二次衰減模型。該模型將光衰減基于光源的范圍。隨著光線遠(yuǎn)離光源,強(qiáng)度會(huì)減弱,但衰減會(huì)有非常明顯且不自然的下降,視覺效果也不太現(xiàn)實(shí)。
Linear????????????????
應(yīng)用線性衰減模型。在此模型中,衰減與距光源的距離成反比,且衰減以固定的速率從光源開始減弱。

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