Skip to content

Instantly share code, notes, and snippets.

@jtiai
Created September 26, 2022 20:16
Show Gist options
  • Save jtiai/6fb4a3c40da6e79356503cc7fe02473a to your computer and use it in GitHub Desktop.
Save jtiai/6fb4a3c40da6e79356503cc7fe02473a to your computer and use it in GitHub Desktop.
Conversion of Art of Code starfield shader to Godot shader
shader_type canvas_item;
#define NUM_LAYERS 4.
mat2 rotate(float a) {
float s = sin(a), c = cos(a);
return mat2(vec2(c, -s), vec2(s, c));
}
float star(vec2 uv, float flare) {
float d = length(uv);
float m = .05 / d;
float rays = max(0., 1. - abs(uv.x * uv.y * 1000.));
m += rays * flare;
uv *= rotate(PI / 4.);
rays = max(0., 1. - abs(uv.x * uv.y * 1000.));
m += rays * .3 * flare;
m *= smoothstep(1., .2, d);
return m;
}
float hash21(vec2 p) {
p = fract(p * vec2(123.45, 56.789));
p += dot(p, p + 54.32);
return fract(p.x * p.y);
}
vec3 starlayer(vec2 uv) {
vec3 col = vec3(0);
vec2 gv = fract(uv) - .5;
vec2 id = floor(uv);
for (int y=-1; y<=1; y++) {
for (int x=-1; x <=1; x++) {
vec2 offset = vec2(float(x), float(y));
float n = hash21(id + offset);
float size = fract(n * 345.67);
float star = star(gv - offset - vec2(n, fract(n * 34.)) + .5, smoothstep(.9, 1., size) * .6);
vec3 color = sin(vec3(.2, .3, .9) * fract(n * 2345.6) * 123.2) * .5 + .5;
color = color * vec3(1, .25, 1. + size) + vec3(.2, .2, .1) * 2.;
star *= sin(TIME * 3. + n * 6.2831) * .5 + 1.;
col += star * size * color;
}
}
return col;
}
void fragment() {
vec2 ires = 1. / SCREEN_PIXEL_SIZE;
vec2 uv = (FRAGCOORD.xy - 0.5 * ires.xy) / ires.y;
float t = TIME * .02;
uv *= rotate(t);
uv *= .5;
vec3 col = vec3(0); // Black
for (float i=0.; i<1.; i+=1./NUM_LAYERS) {
float depth = fract(i + t);
float scale = mix(20., .5, depth);
float fade = depth * smoothstep(1., .9, depth);
col += starlayer(uv * scale + i * 435.2) * fade;
}
//col = pow(col, vec3(.4545)); // Gamma
COLOR = vec4(col, 1.);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment