70 lines
2.7 KiB
GLSL
70 lines
2.7 KiB
GLSL
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;
|
|
} |