Files
Modularity/Resources/Shaders/skybox_frag.glsl
sonakrie ec1610443c
Some checks failed
Build C++ Project with Fedora Container and Create Release / build (push) Has been cancelled
Add everything.
2025-11-30 23:02:25 +01:00

98 lines
3.3 KiB
GLSL
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#version 330 core
out vec4 FragColor;
in vec3 fragPos;
uniform float timeOfDay; // 0..1 (0.0 = midnight)
float hash(vec3 p) {
p = fract(p * 0.3183099 + 0.1);
p *= 17.0;
return fract(p.x * p.y * p.z * (p.x + p.y + p.z));
}
vec3 getSkyColor(vec3 dir, float tod) {
float height = dir.y;
// Continuous rotation no midnight jump
float t = fract(tod);
float angle = t * 6.28318530718;
vec3 sunDir = normalize(vec3(cos(angle), sin(angle) * 0.5, sin(angle)));
float sunDot = max(dot(dir, sunDir), 0.0);
// Your original colors (unchanged)
vec3 nightTop = vec3(0.01, 0.01, 0.05);
vec3 nightHorizon = vec3(0.05, 0.05, 0.15);
vec3 dayTop = vec3(0.3, 0.5, 0.9);
vec3 dayHorizon = vec3(0.6, 0.7, 0.9);
vec3 sunriseTop = vec3(0.4, 0.3, 0.5);
vec3 sunriseHorizon= vec3(1.0, 0.5, 0.3);
vec3 sunsetTop = vec3(0.5, 0.3, 0.4);
vec3 sunsetHorizon = vec3(1.0, 0.4, 0.2);
// Same 4-phase interpolation as you had
vec3 skyTop, skyHorizon;
if (t < 0.25) {
float f = t * 4.0;
skyTop = mix(nightTop, sunriseTop, f);
skyHorizon = mix(nightHorizon, sunriseHorizon, f);
} else if (t < 0.5) {
float f = (t-0.25)*4.0;
skyTop = mix(sunriseTop, dayTop, f);
skyHorizon = mix(sunriseHorizon, dayHorizon, f);
} else if (t < 0.75) {
float f = (t-0.5)*4.0;
skyTop = mix(dayTop, sunsetTop, f);
skyHorizon = mix(dayHorizon, sunsetHorizon, f);
} else {
float f = (t-0.75)*4.0;
skyTop = mix(sunsetTop, nightTop, f);
skyHorizon = mix(sunsetHorizon, nightHorizon, f);
}
vec3 skyColor = mix(skyHorizon, skyTop, smoothstep(-0.3, 0.3, height));
// Sun (exactly like yours)
vec3 sunCol = vec3(1.0, 0.95, 0.8);
float sunGlow = pow(sunDot, 128.0) * 2.0;
float sunDisc = smoothstep(0.9995, 0.9998, sunDot);
float atmGlow = pow(sunDot, 8.0) * 0.5;
float sunVisibility = smoothstep(-0.12, 0.15, sunDir.y); // smooth fade in/out
skyColor += sunCol * (sunDisc + atmGlow + sunGlow*0.3) * sunVisibility;
// ——— STARS: now actually visible and pretty ———
float night = 1.0 - sunVisibility;
if (night > 0.0) {
vec3 p = dir * 160.0; // denser grid
vec3 i = floor(p);
vec3 f = fract(p);
float stars = 0.0;
for (int z=-1; z<=1; z++)
for (int y=-1; y<=1; y++)
for (int x=-1; x<=1; x++) {
vec3 o = vec3(x,y,z);
vec3 pos = i + o;
float h = hash(pos);
if (h > 0.99) { // only the brightest 1%
vec3 center = o + 0.5 + (hash(pos+vec3(7,13,21))-0.5)*0.8;
float d = length(f - center);
float star = 1.0 - smoothstep(0.0, 0.12, d); // tiny sharp dot
star *= (h - 0.99)*100.0; // brightness variation
stars += star;
}
}
stars = pow(stars, 1.4);
stars *= night;
stars *= smoothstep(-0.1, 0.25, height); // fade near horizon
skyColor += vec3(1.0, 0.95, 0.9) * stars * 2.5;
}
return skyColor;
}
void main() {
vec3 dir = normalize(fragPos);
vec3 col = getSkyColor(dir, timeOfDay);
FragColor = vec4(col, 1.0);
}