46 lines
1.5 KiB
GLSL
46 lines
1.5 KiB
GLSL
#version 330 core
|
||
|
||
out vec4 FragColor;
|
||
|
||
in vec3 FragPos;
|
||
in vec3 Normal;
|
||
|
||
uniform float height;
|
||
uniform float sunElevation;
|
||
uniform float sunIntensity;
|
||
|
||
void main()
|
||
{
|
||
// Константы - цвета неба
|
||
vec3 C_strato = vec3(0x05, 0x0F, 0x1F) / 255.0; // #050F1F
|
||
vec3 C_sea = vec3(0x87, 0xBD, 0xFF) / 255.0; // #87BDFF
|
||
vec3 C_warm = vec3(0xFF, 0xF2, 0xD9) / 255.0; // #FFF2D9
|
||
vec3 C_sunset = vec3(0xFF, 0x8C, 0x4D) / 255.0; // #FF8C4D
|
||
|
||
// 1. Зависимость цвета от высоты наблюдателя
|
||
float H = 8000.0;
|
||
float t = clamp(exp(-height / H), 0.0, 1.0);
|
||
|
||
// C_base - линейная интерполяция от C_strato до C_sea с параметром t
|
||
vec3 C_base = mix(C_strato, C_sea, t);
|
||
|
||
// 2. Параметры положения Солнца
|
||
float d = smoothstep(0.0, 0.6, sunElevation);
|
||
float s = clamp(sunIntensity, 0.0, 1.0);
|
||
|
||
// 3. Тёплая добавка при низком Солнце
|
||
// C_tint - линейная интерполяция от C_sunset до C_warm с параметром d
|
||
vec3 C_tint = mix(C_sunset, C_warm, d);
|
||
|
||
// Коэффициент тёплой добавки
|
||
float alpha = 0.6 * s * (1.0 - d) * t;
|
||
|
||
// 4. Итоговый цвет неба
|
||
vec3 C_lit = C_base * (0.55 + 0.45 * s * d) + alpha * C_tint;
|
||
|
||
// Финальный цвет с ограничением
|
||
vec3 C_out = clamp(C_lit, 0.0, 1.0);
|
||
|
||
FragColor = vec4(C_out, 1.0);
|
||
}
|