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) представляє джерело світла в колекції (collection). Наразі Defold підтримує чотири типи ресурсів освітлення:
.ambient_light).directional_light).point_light).spot_light)Ресурси освітлення додаються до ігрових об’єктів (game objects) так само, як інші ресурси компонентів. Ви можете створити компоненти освітлення безпосередньо в ігровому об’єкті або створити ресурс освітлення в браузері Assets, а потім додати його як компонент до ігрового об’єкта в поданні Outline.
Defold не застосовує освітлення автоматично до кожного матеріалу. Рушій збирає джерела світла й надає шейдерам доступ до них через вбудований буфер освітлення. Шейдер вашого матеріалу визначає, як використовувати дані освітлення.
У наведених нижче прикладах використано ту саму сцену, щоб показати, як різні типи світла впливають на кінцевий результат:

Усі кольори світла задаються значеннями RGB. Ресурси освітлення не використовують альфа-канал.
Джерела фонового світла додають постійне освітлення до сцени. Позиція, поворот і масштаб ігрового об’єкта на них не впливають. Їх можна використовувати, наприклад, для загального фонового освітлення або щоб об’єкти мали вигляд без освітлення.
Компонент фонового світла відображається в редакторі як піктограма зі стрілками, спрямованими до центру. Колір піктограми відповідає властивості color.

Властивості:
colorintensity
Джерела фонового світла накопичуються в одному фоновому кольорі light_info.xyz у буфері освітлення шейдера. Вони не займають елементів у масиві lights[]. Кілька компонентів фонового світла в сцені утворюють лише один вихідний колір, що є сумішшю їх усіх.
Джерела спрямованого світла представляють світло, що надходить з одного напрямку, наприклад сонячне. Вони не використовують позицію чи масштаб ігрового об’єкта, а напрямок світла визначається застосуванням світового повороту ігрового об’єкта до локального напрямку вперед (0, 0, -1).
Компонент спрямованого світла відображається в редакторі як кольорова піктограма сонця з 3D-стрілкою, що вказує його напрямок.

Властивості:
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: world position, w: unused
vec4 color; // rgb: color, a: unused
vec4 direction_range; // xyz: normalized world direction, w: range
vec4 params; // x: type, y: intensity, z: inner cone, w: outer cone
};
uniform LightBuffer
{
// xyz: accumulated ambient color, w: active non-ambient light count
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) // Directional
{
vec3 light_dir = normalize(-lights[i].direction_range.xyz);
result += light_color * max(dot(normal, light_dir), 0.0);
}
else if (type == 1) // Point
{
result += light_color;
}
else if (type == 2) // Spot
{
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, надайте інтерпольовані змінні (varyings), які очікує цей код, а потім включіть його у свій фрагментний шейдер:
#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() та функції дифузного освітлення за Ламбертом для джерел світла в буфері.