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); }