small racing game im working on
Diffstat (limited to 'assets/mats/sky.gdshader')
-rw-r--r--assets/mats/sky.gdshader159
1 files changed, 159 insertions, 0 deletions
diff --git a/assets/mats/sky.gdshader b/assets/mats/sky.gdshader
new file mode 100644
index 0000000..591990b
--- /dev/null
+++ b/assets/mats/sky.gdshader
@@ -0,0 +1,159 @@
+// Shader Code origin from here: https://www.patreon.com/posts/making-stylized-27402644 by MinionsArt
+
+shader_type sky;
+render_mode use_half_res_pass;
+
+// Horizon
+group_uniforms horizon;
+uniform float offset_horizon : hint_range(-1.0, 1.0, 0.001) = 0.236;
+uniform float horizon_intensity : hint_range(-10.0, 5.0, 0.001) = -0.443;
+uniform vec4 sun_set : source_color = vec4(0.56, 0.24, 0.0, 1.0);
+uniform vec4 horizon_color_day : source_color = vec4(0.57, 0.53, 0.26, 1.0);
+uniform vec4 horizon_color_night : source_color = vec4(0.09, 0.16, 0.04, 1.0);
+
+// Sun
+group_uniforms sun;
+uniform vec4 sun_color : source_color = vec4(1.0);
+uniform float sun_radius : hint_range(0.0, 2.0, 0.001) = 0.2;
+uniform bool flat_sun = true;
+
+// Moon
+group_uniforms moon;
+uniform vec4 moon_color : source_color = vec4(1.0);
+uniform float moon_radius : hint_range(0.0, 2.0, 0.01) = 0.05;
+// negative: crescent on right side
+// positive: crescent on left side
+uniform float moon_crescent : hint_range(-0.3, 0.3, 0.001) = -0.024;
+uniform float dark_falloff : hint_range(1.0, 6.0, 0.001) = 3.915;
+
+// Sun and Moon Horizon fade parameters
+group_uniforms sun_moon_fade;
+uniform bool enable_horizon_fade = true;
+uniform float horizon_fade_size = 0.2;
+uniform float horizon_fade_blend = 0.1;
+
+// Day Background Colors
+group_uniforms day_bg_color;
+uniform vec4 day_bottom_color : source_color = vec4(0.4, 1.0, 1.0, 1.0);
+uniform vec4 day_top_color : source_color = vec4(0.0, 0.8, 1.0, 1.0);
+
+// Night Background Colors
+group_uniforms night_bg_color;
+uniform vec4 night_bottom_color : source_color = vec4(0.0, 0.0, 0.2, 1.0);
+uniform vec4 night_top_color : source_color = vec4(0.0, 0.0, 0.0, 1.0);
+
+// stars
+group_uniforms stars;
+uniform sampler2D stars_texture : hint_default_black;
+uniform sampler2D base_noise : hint_default_black;
+uniform float stars_speed : hint_range(0.0, 1.0, 0.001) = 0.2;
+uniform float stars_cutoff : hint_range(0.0, 1.0, 0.001) = 0.702;
+uniform vec4 stars_sky_color : source_color = vec4(0.0, 0.11, 0.05, 1);
+uniform float offset_stars : hint_range(-2.0, 2.0, 0.001) = 0.083;
+uniform float stars_intensity : hint_range(-10.0, 10.0, 0.001) = -2.829;
+uniform float star_falloff : hint_range(1.0, 10.0, 0.001) = 1.79;
+uniform float stars_fade_modulation : hint_range(-1.80, 1.80, 0.001) = 0.91;
+
+// Cloud stuff
+group_uniforms clouds;
+uniform sampler2D cloud_noise1 : hint_default_black;
+uniform sampler2D cloud_noise2 : hint_default_black;
+uniform vec4 cloud_edge_day_color : source_color = vec4(0.9, 0.9, 0.9, 1.0);
+uniform vec4 cloud_main_day_color : source_color = vec4(1.0);
+uniform vec4 cloud_edge_night_color : source_color = vec4(0.15, 0.19, 0.25, 1.0);
+uniform vec4 cloud_main_night_color : source_color = vec4(0.15, 0.16, 0.20, 1.0);
+uniform float cloud_speed_1 = 0.01;
+uniform float cloud_speed_2 = 0.02;
+uniform float cloud_speed_3 = 0.02;
+uniform float cloud_scale_1 = 0.425;
+uniform float cloud_scale_2 = 0.074;
+uniform float cloud_scale_3 = 0.075;
+uniform float cloud_distortion = 1.95;
+uniform float cloud_strength = 1.0;
+uniform float cloud_cutoff = 0.013;
+uniform float cloud_fuzziness = 0.261;
+
+void sky() {
+ // get skyUV to place the sun and the moon
+ vec2 skyUV = EYEDIR.xz / EYEDIR.y;
+
+ // Unused variable? Removing this unneccessary texture sample
+// float base_n = texture(base_noise, (skyUV - TIME) * base_noise_scale).x;
+
+ // get the middle -> abs of the EYEDIR to get the horizon
+ float horizon = abs((EYEDIR.y * horizon_intensity) - offset_horizon);
+ vec3 horizonGlow = clamp((1.0 - horizon * 5.0) * clamp(LIGHT0_DIRECTION.y * 10.0, 0.0, 1.0), 0.0, 1.0) * horizon_color_day.rgb;//
+ vec3 horizonGlowNight = clamp((1.0 - horizon * dark_falloff) * clamp( - LIGHT0_DIRECTION.y * 10.0, 0.0, 1.0), 0.0, 1.0) * horizon_color_night.rgb;//
+ horizonGlow += horizonGlowNight;
+
+ // horizon glow / sunset/ -rise
+ float sunset = clamp((1.0 - horizon) * clamp(LIGHT0_DIRECTION.y * 5.0, 0.0, 1.0), 0.0, 1.0);
+ vec3 sunsetColoured = sunset * sun_set.rgb;
+
+ // sun creation
+ float sun = distance(EYEDIR.xyz, LIGHT0_DIRECTION);
+ float sunDisc = 1.0 - clamp(sun / sun_radius, 0.0, 1.0);
+
+ // option to render flat sun
+// if (flat_sun == true) {
+// sunDisc = roundEven(sunDisc);
+// }
+ // The if statement above is technically part of a single GPU wavefront cycle,
+ // So its a special case where using an if statement doesn't cost too much perf
+ // But using a lerp/mix looks cooler ;)
+ // ...and might be slightly faster too ig, not by much tho
+ sunDisc = mix(sunDisc, roundEven(sunDisc), float(flat_sun));
+
+ // moon creation
+ float moon = distance(EYEDIR.xyz, - LIGHT0_DIRECTION);
+ float crescentMoon = distance(vec3(EYEDIR.x + moon_crescent, EYEDIR.yz), - LIGHT0_DIRECTION);
+ float crescentMoonDisc = 1.0 - (crescentMoon / moon_radius);
+ crescentMoonDisc = clamp(crescentMoonDisc * 50.0, 0.0, 1.0);
+ float moonDisc = 1.0 - (moon / moon_radius);
+ moonDisc = clamp(moonDisc * 50.0, 0.0, 1.0);
+ moonDisc = clamp(moonDisc - crescentMoonDisc, 0.0, 1.0);
+
+ // combine sun and moon
+ float top_mask = step(0.0, EYEDIR.y) * horizon;
+ top_mask = smoothstep(horizon_fade_size, horizon_fade_size + horizon_fade_blend, top_mask);
+ top_mask = mix(1.0, top_mask, float(enable_horizon_fade));
+ vec3 sunAndMoon = (sunDisc * sun_color.rgb) + (moonDisc * moon_color.rgb);
+ sunAndMoon *= top_mask;
+
+ // stars
+ float stars_parameters = abs((EYEDIR.y * stars_intensity) - offset_stars) * step(0.0, EYEDIR.y) * star_falloff;
+ vec3 stars = texture(stars_texture, (skyUV * stars_parameters) + (stars_speed * (TIME / 30.0))).rgb;
+ float stars_zenith = clamp(-LIGHT0_DIRECTION.y, 0.0, 1.0);
+ stars *= stars_zenith + abs(stars_zenith - stars_fade_modulation);
+ stars = step(stars_cutoff, stars);
+ stars += stars_sky_color.rgb;
+
+ //Sky Background Gradient
+ // day color gradient
+ vec3 gradientDay = mix(day_bottom_color.rgb, day_top_color.rgb, clamp(EYEDIR.y, 0.0, 1.0));
+ // night color gradient
+ vec3 gradientNight = mix(night_bottom_color.rgb, night_top_color.rgb, clamp(EYEDIR.y, 0.0, 1.0));
+ vec3 skyGradients = mix(gradientNight, gradientDay, clamp(LIGHT0_DIRECTION.y, 0.0, 1.0));
+
+ vec3 sky = skyGradients + sunAndMoon + sunsetColoured + stars + horizonGlow;
+
+
+ // Clouds
+ // UV space illusion
+ // (I have no idea how MinionsArt learned how to do this but its amazing)
+ vec2 cloud_uv = EYEDIR.xz / EYEDIR.y;
+ // Sample Noise at different levels
+ float bn = texture(base_noise, (cloud_uv - TIME * cloud_speed_1) * cloud_scale_1).r;
+ float cn1 = texture(cloud_noise1, ((cloud_uv + bn * cloud_distortion) - TIME * cloud_speed_2) * cloud_scale_2).r;
+ float cn2 = texture(cloud_noise2, ((cloud_uv + cn1 * cloud_strength) - TIME * cloud_speed_3) * cloud_scale_3).r;
+ // Combine noise and chop it up
+ float fc = clamp(cn1 * cn2, 0.0, 1.0) * clamp(EYEDIR.y, 0.0, 1.0);
+ float cc = smoothstep(cloud_cutoff, cloud_cutoff + cloud_fuzziness, fc);
+ // Mix colors according to time of day
+ vec4 cloud_color_day = mix(cloud_edge_day_color, cloud_main_day_color, cc);
+ vec4 cloud_color_night = mix(cloud_edge_night_color, cloud_main_night_color, cc);
+ float linear_day_to_night = LIGHT0_DIRECTION.y * 0.5 + 0.5;
+ vec4 cloud_color = mix(cloud_color_night, cloud_color_day, linear_day_to_night);
+
+ COLOR = mix(sky, cloud_color.rgb, cc * cloud_color.a);
+} \ No newline at end of file