36 lines
1.5 KiB
Plaintext
36 lines
1.5 KiB
Plaintext
uniform samplerCube Texture;
|
|
uniform float skyPercent;
|
|
uniform float uPlayerLightFactor; // Глобальный фактор дня/ночи для позиции игрока
|
|
uniform vec3 uSkyColor;
|
|
|
|
varying vec3 vViewDir;
|
|
|
|
void main() {
|
|
vec3 viewDir = normalize(vViewDir);
|
|
|
|
// 1. Получаем звезды
|
|
vec4 starsColor = textureCube(Texture, viewDir);
|
|
|
|
// 2. Цвета атмосферы
|
|
vec3 dayColor = uSkyColor;
|
|
vec3 nightColor = vec3(0.01, 0.01, 0.04);
|
|
|
|
// 3. Теперь всё небо окрашивается одинаково в зависимости от положения игрока
|
|
// Мы плавно смешиваем ночной и дневной купол
|
|
vec3 atmosphericColor = mix(nightColor, dayColor, uPlayerLightFactor);
|
|
|
|
// 4. Логика видимости звезд
|
|
// Звезды видны в космосе (skyPercent=0)
|
|
// И в атмосфере, если сейчас ночь (uPlayerLightFactor -> 0)
|
|
float starsVisibility = (1.0 - skyPercent) + (skyPercent * (1.0 - uPlayerLightFactor));
|
|
|
|
// Делаем звезды чуть ярче на ночном небе
|
|
starsVisibility = pow(starsVisibility, 1.5);
|
|
|
|
// 5. Итоговый цвет
|
|
// Добавляем слой атмосферы к звездам
|
|
vec3 skyLayer = atmosphericColor * skyPercent;
|
|
vec3 finalColor = (starsColor.rgb * starsVisibility) + skyLayer;
|
|
|
|
gl_FragColor = vec4(finalColor, 1.0);
|
|
} |