vec3 GetSkyColor(vec3 lightCol, float NdotU, vec3 nViewPos, bool isReflection) { float timeBrightnessInv = 1.0 - timeBrightness; float timeBrightnessInv2 = timeBrightnessInv * timeBrightnessInv; float timeBrightnessInv4 = timeBrightnessInv2 * timeBrightnessInv2; float timeBrightnessInv8 = timeBrightnessInv4 * timeBrightnessInv4; float NdotSp = clamp(dot(nViewPos, sunVec) * 0.5 + 0.5, 0.001, 1.0); float NdotS = NdotSp * NdotSp; NdotS *= NdotS; float absNdotU = abs(NdotU); vec3 skyColor2 = skyColor * skyColor; vec3 sky = mix(sqrt1(skyColor) * 0.47, skyColor2 * 0.9, absNdotU); sky = sky * (0.5 + 0.5 * sunVisibility) * skyMult; #ifdef ONESEVEN sky = vec3(0.812, 0.741, 0.674) * 0.5; #endif float horizon = 1.0 - max(NdotU + 0.1, 0.0) * (1.0 - 0.25 * NdotS * sunVisibility); horizon = min(horizon, 0.9); horizon *= horizon; float lightmix = NdotS * max(1.0 - absNdotU * 2.0, 0.0) * 0.5 + horizon + 0.05; lightmix *= sunVisibility * (1.0 - rainStrengthS) * timeBrightnessInv8; sky *= 2.0 - 0.5 * timeBrightnessInv4; sky *= mix(SKY_NOON, SKY_DAY, timeBrightnessInv4); float mult = 0.1 * (1.0 + rainStrengthS) + horizon * (0.3 + 0.1 * sunVisibility); float meFactorP = min((1.0 - min(moonBrightness, 0.6) / 0.6) * 0.115, 0.075); float meNdotU = 1.0 - absNdotU; float meFactor = meFactorP * meNdotU * meNdotU * 15.0 * max(timeBrightnessInv4 - rainStrengthS, 0.0); vec3 meColor = mix(lightMorning, lightEvening, mefade); meColor *= meColor; meColor *= meColor; meColor *= meFactor * meFactor * NdotS; vec3 finalSky = mix(sky * (1.0 - pow2(lightmix)), lightCol * sqrt(lightCol), lightmix); vec3 nightSky = ambientNight * ambientNight * (3.25 + 2.25 * max(sqrt1(NdotU), 0.0)); nightSky *= mix(SKY_NIGHT, 1.0, sunVisibility); finalSky += nightSky; finalSky *= max(1.0 - length(meColor) * 0.5, 0.0); finalSky += meColor * 0.8; if (isReflection) { float invNdotU = max(-NdotU, 0.0); float groundFactor = 0.5 * (11.0 * rainStrengthS + 1.0) * (-5.0 * sunVisibility + 6.0); float ground = exp(-groundFactor / (invNdotU * 6.0)); ground = smoothstep(0.0, 1.0, ground); mult *= (1.0 - ground); } //duplicate 98765 vec3 weatherSky = weatherCol * weatherCol; weatherSky *= GetLuminance(ambientCol / (weatherSky)) * 1.4; weatherSky *= mix(SKY_RAIN_NIGHT, SKY_RAIN_DAY, sunVisibility); weatherSky = max(weatherSky, skyColor2 * 0.75); // Lightning Sky Color weatherSky *= rainStrengthS; finalSky = mix(finalSky, weatherSky, rainStrengthS) * mult; finalSky = pow(finalSky, vec3(1.125)); return finalSky; }