This translation is community contributed and may not be up to date. We only maintain the English version of the documentation. Read this manual in English
Компонент Light представляет источник света в коллекции. В настоящее время Defold поддерживает четыре типа ресурсов освещения:
.ambient_light).directional_light).point_light).spot_light)Ресурсы освещения добавляются к игровым объектам так же, как и другие ресурсы компонентов. Компоненты освещения можно создать непосредственно внутри игрового объекта либо создать ресурс освещения в браузере Assets, а затем добавить его как компонент игрового объекта в представлении Outline.
Defold не применяет освещение ко всем материалам автоматически. Движок собирает источники света и передает их шейдерам через встроенный буфер освещения. Способ использования данных освещения определяется шейдером материала.
В примерах ниже одна и та же сцена используется для демонстрации влияния различных типов источников света на конечный результат:

Все цвета источников света задаются значениями RGB. Альфа-канал в ресурсах освещения не используется.
Рассеянные источники добавляют в сцену постоянное освещение. Позиция, вращение и масштаб игрового объекта на них не влияют. Их можно использовать, например, для общего фонового освещения или для придания объектам вида, не зависящего от освещения.
Компонент рассеянного света представлен в редакторе значком со стрелками, направленными к центру. Цвет значка совпадает со значением свойства color.

Свойства:
colorintensity
Рассеянные источники света суммируются в шейдерном буфере освещения в один цвет light_info.xyz. Они не занимают элементы массива lights[]. Несколько компонентов рассеянного света в сцене дают на выходе только один цвет, представляющий собой смесь всех этих источников.
Направленные источники представляют свет, идущий с одного направления, например солнечный. Позиция и масштаб игрового объекта для них не используются, а направление света вычисляется путем применения мирового вращения игрового объекта к локальному направлению вперед (0, 0, -1).
Компонент направленного света представлен в редакторе цветным значком солнца с трехмерной стрелкой, указывающей его направление.

Свойства:
colorintensityНаправленный свет часто сочетают с рассеянным, чтобы поверхности, отвернутые от направленного источника, не становились полностью темными.

Точечные источники излучают свет во всех направлениях из мировой позиции игрового объекта. Позиция точечного источника определяется мировой позицией игрового объекта.
Компонент точечного источника представлен в редакторе точкой с исходящими от нее лучами. Цвет значка соответствует свойству color, а окружность обозначает range.

Свойства:
colorintensityrangeЭффективная дальность умножается на наименьший абсолютный компонент мирового масштаба игрового объекта.

Изменение цвета света окрашивает вклад точечного источника, а дальность определяет, насколько далеко от источника распространяется свет.

Прожекторы излучают свет конусом из мировой позиции игрового объекта. Направление вычисляется путем применения мирового вращения игрового объекта к (0, 0, -1).
Компонент прожектора представлен в редакторе цветным значком лампы и направляющими линиями, отображающими внешний и внутренний конусы.

Свойства:
colorintensityrangeinner_cone_angleouter_cone_angleЭффективная дальность умножается на наименьший абсолютный компонент мирового масштаба игрового объекта. Углы конусов редактируются в градусах и преобразуются в радианы в скомпилированном ресурсе освещения.

Конвейер сборки проверяет и нормализует данные ресурсов освещения:
color должен содержать ровно три числа.intensity ограничивается снизу значением 0.range ограничивается снизу значением 0.0..180 градусов.inner_cone_angle ограничивается так, чтобы он никогда не превышал outer_cone_angle.Максимальное количество компонентов освещения задается настройкой проекта light.max_count. Значение по умолчанию — 64.
Рассеянные источники не занимают элементы шейдерного массива lights[], но при этом остаются компонентами Light и учитываются в light.max_count. Активные направленные и точечные источники, а также прожекторы занимают элементы массива lights[].
Если количество компонентов освещения превышает light.max_count, движок сообщит об ошибке переполнения буфера компонентов.
Шейдер может получить доступ к активным источникам света, объявив uniform-блок с именем LightBuffer и встроенной структурой данных. Движок обнаруживает этот блок и автоматически привязывает данные освещения для использующих его материалов и вычислительных программ.

#version 140
#define MAX_LIGHT_COUNT 32
struct Light
{
vec4 position; // xyz: мировая позиция, w: не используется
vec4 color; // rgb: цвет, a: не используется
vec4 direction_range; // xyz: нормализованное мировое направление, w: дальность
vec4 params; // x: тип, y: интенсивность, z: внутренний конус, w: внешний конус
};
uniform LightBuffer
{
// xyz: суммарный цвет рассеянного света, w: количество активных нерассеянных источников
vec4 light_info;
Light lights[MAX_LIGHT_COUNT];
};
Тип источника света хранится в lights[i].params.x:
| Тип | Значение |
|---|---|
| Направленный | 0 |
| Точечный | 1 |
| Прожектор | 2 |
Шейдер может объявить массив lights[] меньшего размера, чем light.max_count, но не большего. Всегда ограничивайте циклы перебора источников света размером объявленного массива:
vec3 apply_lights(vec3 normal)
{
vec3 result = light_info.xyz;
int active_light_count = int(light_info.w);
for (int i = 0; i < MAX_LIGHT_COUNT; ++i)
{
if (i >= active_light_count)
{
break;
}
int type = int(lights[i].params.x);
vec3 light_color = lights[i].color.rgb * lights[i].params.y;
if (type == 0) // Направленный
{
vec3 light_dir = normalize(-lights[i].direction_range.xyz);
result += light_color * max(dot(normal, light_dir), 0.0);
}
else if (type == 1) // Точечный
{
result += light_color;
}
else if (type == 2) // Прожектор
{
result += light_color;
}
}
return result;
}
Приведенный выше пример демонстрирует схему доступа к буферу. В реальном шейдере точечного источника или прожектора также следует вычислить вектор от затеняемой точки к lights[i].position.xyz, применить затухание с расстоянием с использованием lights[i].direction_range.w, а для прожекторов использовать lights[i].params.z и lights[i].params.w в качестве углов конуса в радианах.
Defold содержит вспомогательную шейдерную библиотеку /builtins/materials/lighting.glsl. Определите MAX_LIGHT_COUNT, передайте ожидаемые библиотекой varying-переменные, а затем подключите ее во фрагментном шейдере:
#version 140
#define MAX_LIGHT_COUNT 32
in vec3 var_normal;
in vec4 var_position;
in mat4 var_view;
out vec4 color_out;
#include "/builtins/materials/lighting.glsl"
void main()
{
vec3 normal = normalize(var_normal);
vec3 ambient = ambient_light();
vec3 diffuse = diffuse_lambert(normal, var_position.xyz);
color_out = vec4(ambient + diffuse, 1.0);
}
Вспомогательная библиотека определяет константы LIGHT_DIRECTIONAL, LIGHT_POINT и LIGHT_SPOT, предоставляет функцию ambient_light() и содержит функции диффузного освещения по Ламберту для источников в буфере.