В реальном мире свет тускнеет с расстоянием, а тусклые источники света имеют меньший радиус действия, чем яркие. Термин «падение» относится к скорости затухания света. Наряду с поведением спадающего освещения Unity по умолчанию вы также можете использовать пользовательские настройки спадающего света.
Прогрессивный LightmapperИнструмент в Unity, который запекает карты освещения в соответствии с расположением источников света и геометрией в вашей сцене. Подробнее
См. в Словарь содержит настраиваемые пресеты спада, которые можно реализовать с помощью скрипта. . На изображении под таблицей показано, как они работают, а в примере кода под изображением показано, как использовать эту функцию.
Свойства | Функции |
---|---|
InverseSquared |
Примените модель спада расстояния обратных квадратов. Это означает, что интенсивность света уменьшается обратно пропорционально квадрату расстояния от местоположения до источника света. Для получения дополнительной информации см. Википедия: Закон обратных квадратов. Этот вариант наиболее физически точен. |
InverseSquaredNoRangeAttenuation |
Примените модель спада расстояния обратных квадратов без плавного затухания диапазона. Это работает так же, как InverseSquared , но система освещения не учитывает затухание для параметра диапазона точечных источников света (то есть точечных источников света и прожекторов). |
Legacy |
Примените квадратичную модель спада. Эта модель основывает затухание света на диапазоне источника света. Интенсивность уменьшается по мере удаления света от источника, но наблюдается очень резкое и неестественное падение затухания, и визуальный эффект нереалистичен. |
Linear |
Примените линейную модель спада. В этой модели затухание обратно пропорционально расстоянию от источника света, а спад уменьшается с фиксированной скоростью от его источника. |
Примечание. Приведенный ниже пример кода работает только с Progressive Lightmapper, когда вы используете запеченное или смешанное освещение. Чтобы использовать пример кода с освещением в реальном временикомпоненты освещения, для свойства Mode которых задано значение Realtime. Unity рассчитывает и обновляет освещение Realtime Lights каждый кадр во время выполнения. Никакие источники света в реальном времени не рассчитываются заранее. Подробнее
См. в Словарь, используйте Enlighten 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 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.Area: 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();
}
}
Примечание. Весь код в приведенном выше примере необходим для работы пользовательского спада; однако вы можете изменить InverseSquared
в строке ld.falloff = FalloffType.InverseSquared;
, чтобы использовать любой из пресеты, описанные выше.
Добавлен Progressive Lightmapper в 2018.1