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 представляет источник света в коллекции. В настоящее время Defold поддерживает четыре типа ресурсов освещения:

  • Рассеянный свет (.ambient_light)
  • Направленный свет (.directional_light)
  • Точечный источник света (.point_light)
  • Прожектор (.spot_light)

Ресурсы освещения добавляются к игровым объектам так же, как и другие ресурсы компонентов. Компоненты освещения можно создать непосредственно внутри игрового объекта либо создать ресурс освещения в браузере Assets, а затем добавить его как компонент игрового объекта в представлении Outline.

Defold не применяет освещение ко всем материалам автоматически. Движок собирает источники света и передает их шейдерам через встроенный буфер освещения. Способ использования данных освещения определяется шейдером материала.

В примерах ниже одна и та же сцена используется для демонстрации влияния различных типов источников света на конечный результат:

Сцена без источников света

Свойства источников света

Все цвета источников света задаются значениями RGB. Альфа-канал в ресурсах освещения не используется.

Рассеянный свет

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

Компонент рассеянного света представлен в редакторе значком со стрелками, направленными к центру. Цвет значка совпадает со значением свойства color.

Рассеянный свет с меньшей интенсивностью

Свойства:

color
RGB-цвет рассеянного света.
intensity
Множитель цвета рассеянного света.

Рассеянный свет с большей интенсивностью

Рассеянные источники света суммируются в шейдерном буфере освещения в один цвет light_info.xyz. Они не занимают элементы массива lights[]. Несколько компонентов рассеянного света в сцене дают на выходе только один цвет, представляющий собой смесь всех этих источников.

Направленный свет

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

Компонент направленного света представлен в редакторе цветным значком солнца с трехмерной стрелкой, указывающей его направление.

Направленный свет

Свойства:

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: мировая позиция, 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() и содержит функции диффузного освещения по Ламберту для источников в буфере.

См. также