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
Komponent Light reprezentuje źródło światła w kolekcji. Silnik Defold obsługuje obecnie cztery typy zasobów świateł:
.ambient_light).directional_light).point_light).spot_light)Zasoby świateł dodaje się do obiektów gry tak samo jak inne zasoby komponentów. Komponenty Light można tworzyć bezpośrednio w obiekcie gry albo utworzyć zasób światła w przeglądarce Assets, a następnie dodać go jako komponent do obiektu gry w widoku Outline.
Silnik Defold nie stosuje oświetlenia automatycznie do każdego materiału. Silnik zbiera światła i udostępnia je shaderom przez wbudowany bufor świateł. To shader materiału decyduje, jak wykorzystać dane świateł.
Poniższe przykłady używają tej samej sceny, aby pokazać wpływ różnych typów świateł na wynik końcowy:

Wszystkie kolory świateł są wartościami RGB. Kanał alfa nie jest używany przez zasoby świateł.
Światła otoczenia dodają do sceny stałe oświetlenie. Nie wpływa na nie pozycja, obrót ani skala obiektu gry. Można ich używać na przykład jako ogólnego oświetlenia tła albo do nadania obiektom wyglądu bez cieniowania.
Komponent światła otoczenia jest przedstawiany w edytorze ikoną ze strzałkami skierowanymi ku środkowi. Kolor ikony jest taki sam jak wartość właściwości color.

Właściwości:
colorintensity
Światła otoczenia są sumowane w buforze świateł shadera do pojedynczego koloru otoczenia light_info.xyz. Nie zajmują pozycji w tablicy lights[]. Wiele komponentów światła otoczenia w scenie daje tylko jeden kolor wynikowy, będący połączeniem kolorów wszystkich tych komponentów.
Światła kierunkowe reprezentują światło padające z jednego kierunku, na przykład światło słoneczne. Nie wykorzystują pozycji ani skali obiektu gry, ale kierunek światła jest wyznaczany na podstawie obrotu obiektu gry w przestrzeni świata, zastosowanego do lokalnego kierunku do przodu (0, 0, -1).
Komponent światła kierunkowego jest przedstawiany w edytorze kolorową ikoną słońca z trójwymiarową strzałką wskazującą jego kierunek.

Właściwości:
colorintensityŚwiatła kierunkowe często łączy się ze światłem otoczenia, aby powierzchnie odwrócone od światła kierunkowego nie stawały się całkowicie ciemne.

Światła punktowe emitują światło na zewnątrz z pozycji obiektu gry w przestrzeni świata. Pozycja światła punktowego pochodzi z pozycji obiektu gry w przestrzeni świata.
Komponent światła punktowego jest przedstawiany w edytorze punktem z rozchodzącymi się wokół niego promieniami. Jego kolor odpowiada właściwości color, a okrąg przedstawia range.

Właściwości:
colorintensityrangeEfektywny zasięg jest mnożony przez najmniejszą z wartości bezwzględnych składowych skali obiektu gry w przestrzeni świata.

Zmiana koloru światła zabarwia udział światła punktowego w oświetleniu, natomiast zasięg określa, jak daleko od źródła dociera światło.

Światła reflektorowe emitują światło w stożku z pozycji obiektu gry w przestrzeni świata. Kierunek jest wyznaczany na podstawie obrotu obiektu gry w przestrzeni świata, zastosowanego do (0, 0, -1).
Komponent światła reflektorowego jest przedstawiany w edytorze kolorową ikoną lampy oraz liniami pomocniczymi pokazującymi stożek zewnętrzny i wewnętrzny.

Właściwości:
colorintensityrangeinner_cone_angleouter_cone_angleEfektywny zasięg jest mnożony przez najmniejszą z wartości bezwzględnych składowych skali obiektu gry w przestrzeni świata. Kąty stożków edytuje się w stopniach, a w skompilowanym zasobie światła są przeliczane na radiany.

Proces budowania sprawdza i normalizuje dane zasobów świateł:
color musi zawierać dokładnie trzy liczby.intensity jest ograniczane od dołu do 0.range jest ograniczane od dołu do 0 dla świateł punktowych i reflektorowych.0..180 stopni.inner_cone_angle jest ograniczany tak, aby nigdy nie przekraczał outer_cone_angle.Maksymalną liczbą komponentów Light steruje ustawienie projektu light.max_count. Jego domyślna wartość to 64.
Światła otoczenia nie zajmują pozycji w tablicy lights[] shadera, ale nadal są komponentami Light i wliczają się do light.max_count. Aktywne światła kierunkowe, punktowe i reflektorowe zajmują pozycje w lights[].
Jeśli liczba komponentów Light przekroczy light.max_count, silnik zgłosi błąd przepełnienia bufora komponentów.
Shader może uzyskać dostęp do aktywnych świateł, deklarując blok uniformów o nazwie LightBuffer z wbudowanym układem. Silnik wykrywa ten blok i automatycznie wiąże dane świateł z materiałami i programami obliczeniowymi, które go używają.

#version 140
#define MAX_LIGHT_COUNT 32
struct Light
{
vec4 position; // xyz: pozycja w przestrzeni świata, w: nieużywane
vec4 color; // rgb: kolor, a: nieużywane
vec4 direction_range; // xyz: znormalizowany kierunek w przestrzeni świata, w: zasięg
vec4 params; // x: typ, y: intensywność, z: stożek wewnętrzny, w: stożek zewnętrzny
};
uniform LightBuffer
{
// xyz: zsumowany kolor otoczenia, w: liczba aktywnych świateł innych niż światła otoczenia
vec4 light_info;
Light lights[MAX_LIGHT_COUNT];
};
Typ światła jest zapisany w lights[i].params.x:
| Typ | Wartość |
|---|---|
| Kierunkowe | 0 |
| Punktowe | 1 |
| Reflektorowe | 2 |
Shader może zadeklarować tablicę lights[] mniejszą niż light.max_count, ale nie większą. Pętle przetwarzające światła należy zawsze ograniczać do zadeklarowanego rozmiaru tablicy:
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) // Kierunkowe
{
vec3 light_dir = normalize(-lights[i].direction_range.xyz);
result += light_color * max(dot(normal, light_dir), 0.0);
}
else if (type == 1) // Punktowe
{
result += light_color;
}
else if (type == 2) // Reflektorowe
{
result += light_color;
}
}
return result;
}
Powyższy przykład pokazuje sposób uzyskiwania dostępu do bufora. Rzeczywisty shader światła punktowego lub reflektorowego powinien również obliczać wektor od cieniowanego punktu do lights[i].position.xyz, stosować tłumienie wraz z odległością przy użyciu lights[i].direction_range.w, a dla świateł reflektorowych używać lights[i].params.z oraz lights[i].params.w jako kątów stożka w radianach.
Silnik Defold zawiera plik z funkcjami pomocniczymi shadera w /builtins/materials/lighting.glsl. Zdefiniuj MAX_LIGHT_COUNT, udostępnij oczekiwane przez te funkcje zmienne varying, a następnie dołącz plik w shaderze fragmentów:
#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);
}
Plik pomocniczy definiuje stałe LIGHT_DIRECTIONAL, LIGHT_POINT i LIGHT_SPOT, udostępnia funkcję ambient_light() oraz zawiera funkcje rozproszonego oświetlenia Lamberta dla świateł w buforze.