techkaczynski.dev / code

summaryrefslogtreecommitdiff
path: root/res/sdr/sky.fs
diff options
context:
space:
mode:
authortech kaczynski <tk@techkaczynski.dev>2026-09-22 22:38:57 +1000
committertech kaczynski <tk@techkaczynski.dev>2026-09-22 22:38:57 +1000
commit08cb8d6a585dd552b69a488d9db1be123f01467a (patch)
tree77d50ce30bbc102b08486929ba654b5bef70af43 /res/sdr/sky.fs
initial commit.
Diffstat (limited to 'res/sdr/sky.fs')
-rw-r--r--res/sdr/sky.fs72
1 files changed, 72 insertions, 0 deletions
diff --git a/res/sdr/sky.fs b/res/sdr/sky.fs
new file mode 100644
index 0000000..8fde0f2
--- /dev/null
+++ b/res/sdr/sky.fs
@@ -0,0 +1,72 @@
+#version 330
+
+uniform vec2 resolution;
+
+uniform vec3 camera_forward;
+uniform vec3 camera_right;
+uniform vec3 camera_up;
+uniform vec3 sun_direction;
+
+uniform vec3 horizon_colour;
+uniform vec3 zenith_colour;
+
+uniform float day_amount;
+uniform float twilight_amount;
+uniform float tan_half_fovy;
+
+out vec4 finalColor;
+
+void
+main() {
+ vec2 ndc = gl_FragCoord.xy / resolution * 2.0 - 1.0;
+ float aspect_ratio = resolution.x / resolution.y;
+
+ vec3 view_direction = normalize(
+ camera_forward +
+ camera_right * ndc.x * aspect_ratio * tan_half_fovy +
+ camera_up * ndc.y * tan_half_fovy
+ );
+
+ float height = smoothstep(-0.20, 0.80, view_direction.y);
+ float horizon = 1.0 - smoothstep(0.0, 0.35, abs(view_direction.y));
+
+ vec3 sky = mix(horizon_colour, zenith_colour, height);
+
+ float sun_alignment = dot(view_direction, sun_direction);
+ float sun_facing = max(sun_alignment, 0.0);
+ float sun_facing_2 = sun_facing * sun_facing;
+ float sun_facing_4 = sun_facing_2 * sun_facing_2;
+
+ sky += vec3(0.65, 0.16, 0.035) *
+ horizon * twilight_amount * sun_facing_4;
+
+ float sun_wide = smoothstep(0.9510565, 0.9986295, sun_alignment);
+ float sun_core = smoothstep(0.9925462, 0.9998477, sun_alignment);
+
+ float moon_alignment = -sun_alignment;
+ float moon_wide = smoothstep(0.9702957, 0.9993908, moon_alignment);
+ float moon_core = smoothstep(0.9961947, 0.9999619, moon_alignment);
+
+ float sun_visibility = smoothstep(-0.12, 0.04, sun_direction.y);
+ float moon_visibility = smoothstep(-0.10, 0.04, -sun_direction.y);
+
+ vec3 sun_glow_colour = mix(
+ vec3(1.00, 0.82, 0.38),
+ vec3(1.00, 0.25, 0.035),
+ twilight_amount
+ );
+
+ vec3 moon_glow_colour = vec3(0.32, 0.46, 0.82);
+
+ float sun_glow =
+ (sun_wide * 0.13 + sun_core * 0.32) * sun_visibility;
+
+ float moon_glow =
+ (moon_wide * 0.08 + moon_core * 0.17) *
+ moon_visibility * (1.0 - day_amount);
+
+ sky += (1.0 - sky) * sun_glow_colour * sun_glow;
+ sky += (1.0 - sky) * moon_glow_colour * moon_glow;
+
+ finalColor = vec4(clamp(sky, 0.0, 1.0), 1.0);
+}