Manuals
Manuals




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

Компонент освітлення (Light) представляє джерело світла в колекції (collection). Наразі Defold підтримує чотири типи ресурсів освітлення:

  • Фонове світло (ambient light) (.ambient_light)
  • Спрямоване світло (directional light) (.directional_light)
  • Точкове світло (point light) (.point_light)
  • Прожекторне світло (spot light) (.spot_light)

Ресурси освітлення додаються до ігрових об’єктів (game objects) так само, як інші ресурси компонентів. Ви можете створити компоненти освітлення безпосередньо в ігровому об’єкті або створити ресурс освітлення в браузері Assets, а потім додати його як компонент до ігрового об’єкта в поданні Outline.

Defold не застосовує освітлення автоматично до кожного матеріалу. Рушій збирає джерела світла й надає шейдерам доступ до них через вбудований буфер освітлення. Шейдер вашого матеріалу визначає, як використовувати дані освітлення.

У наведених нижче прикладах використано ту саму сцену, щоб показати, як різні типи світла впливають на кінцевий результат:

Сцена без джерел світла

Властивості освітлення

Усі кольори світла задаються значеннями RGB. Ресурси освітлення не використовують альфа-канал.

Фонове світло

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

Компонент фонового світла відображається в редакторі як піктограма зі стрілками, спрямованими до центру. Колір піктограми відповідає властивості color.

Фонове світло з меншою інтенсивністю

Властивості:

color
Колір фонового світла у форматі RGB.
intensity
Множник кольору фонового світла.

Фонове світло з більшою інтенсивністю

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

Спрямоване світло

Джерела спрямованого світла представляють світло, що надходить з одного напрямку, наприклад сонячне. Вони не використовують позицію чи масштаб ігрового об’єкта, а напрямок світла визначається застосуванням світового повороту ігрового об’єкта до локального напрямку вперед (0, 0, -1).

Компонент спрямованого світла відображається в редакторі як кольорова піктограма сонця з 3D-стрілкою, що вказує його напрямок.

Спрямоване світло

Властивості:

color
Колір спрямованого світла у форматі RGB.
intensity
Множник кольору спрямованого світла.

Спрямоване світло часто поєднують із фоновим, щоб поверхні, відвернуті від джерела спрямованого світла, не ставали цілком темними.

Спрямоване й фонове світло

Точкове світло

Джерела точкового світла випромінюють світло назовні зі світової позиції ігрового об’єкта. Позиція точкового джерела світла визначається світовою позицією ігрового об’єкта.

Компонент точкового світла відображається в редакторі як точка з променями навколо неї, колір якої відповідає властивості color, і коло, що позначає range.

Точкове світло

Властивості:

color
Колір точкового світла у форматі RGB.
intensity
Множник кольору точкового світла.
range
Радіус освітлення у світових одиницях.

Фактичний радіус дії множиться на найменше за модулем значення світового масштабу ігрового об’єкта серед усіх осей.

Радіус дії точкового світла

Зміна кольору світла забарвлює освітлення від точкового джерела, а радіус дії визначає, на яку відстань від джерела поширюється світло.

Радіус дії точкового світла зеленого кольору

Прожекторне світло

Джерела прожекторного світла випромінюють світло конусом зі світової позиції ігрового об’єкта. Напрямок визначається застосуванням світового повороту ігрового об’єкта до (0, 0, -1).

Компонент прожекторного світла відображається в редакторі як кольорова піктограма лампи з напрямними лініями, що показують зовнішній і внутрішній конуси.

Прожекторне світло

Властивості:

color
Колір прожекторного світла у форматі RGB.
intensity
Множник кольору прожекторного світла.
range
Радіус освітлення у світових одиницях.
inner_cone_angle
Кут внутрішнього конуса, заданий у градусах у редакторі. Пікселі всередині цього конуса отримують повний внесок прожекторного освітлення.
outer_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() та функції дифузного освітлення за Ламбертом для джерел світла в буфері.

Див. також