Skip to content

Instantly share code, notes, and snippets.

@keijiro
Last active June 4, 2022 13:05
  • Star 12 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save keijiro/7e5468f26161b63849e590b8078c6266 to your computer and use it in GitHub Desktop.
KodeLife fragment shader sketch
#version 150
uniform float time;
uniform sampler2D prevFrame;
uniform vec2 resolution;
uniform vec3 spectrum;
out vec4 fragColor;
vec3 fade(vec3 x) { return x * x * x * (x * (x * 6 - 15) + 10); }
vec3 phash(vec3 p)
{
p = fract(mat3(1.2989833, 7.8233198, 2.3562332,
6.7598192, 3.4857334, 8.2837193,
2.9175399, 2.9884245, 5.4987265) * p);
p = ((2384.2345 * p - 1324.3438) * p + 3884.2243) * p - 4921.2354;
return normalize(fract(p) * 2 - 1);
}
float cnoise(vec3 p)
{
vec3 ip = floor(p);
vec3 fp = fract(p);
float d000 = dot(phash(ip), fp);
float d001 = dot(phash(ip + vec3(0, 0, 1)), fp - vec3(0, 0, 1));
float d010 = dot(phash(ip + vec3(0, 1, 0)), fp - vec3(0, 1, 0));
float d011 = dot(phash(ip + vec3(0, 1, 1)), fp - vec3(0, 1, 1));
float d100 = dot(phash(ip + vec3(1, 0, 0)), fp - vec3(1, 0, 0));
float d101 = dot(phash(ip + vec3(1, 0, 1)), fp - vec3(1, 0, 1));
float d110 = dot(phash(ip + vec3(1, 1, 0)), fp - vec3(1, 1, 0));
float d111 = dot(phash(ip + vec3(1, 1, 1)), fp - vec3(1, 1, 1));
fp = fade(fp);
return mix(mix(mix(d000, d001, fp.z), mix(d010, d011, fp.z), fp.y),
mix(mix(d100, d101, fp.z), mix(d110, d111, fp.z), fp.y), fp.x);
}
void main(void)
{
vec2 uv = gl_FragCoord.xy / resolution;
vec2 p = (uv - 0.5) * vec2(resolution.x / resolution.y, 1);
float amp = spectrum.x + 0.1;
// source (arc)
float d = distance(p, vec2(0, -0.5));
float c = clamp(amp - 4.5 * d, 0, 1);
// source (noise)
float nf = cnoise(vec3(p * 7, time * 8));
c += step(0.6 - 0.3 * amp, nf);
// displacement
uv += vec2(
cnoise(vec3(p * 9, time * 3)) * 0.05 * amp,
cnoise(vec3(p * -5, time * -3)) * 0.2 * amp
);
uv.y -= 0.05 * amp;
// feedback
c += texture(prevFrame, uv).r * min(1, 0.8 + amp);
// color gradient
float c1 = 0.5 + sin(c * 11.12 + time * 1.11) * 0.5;
float c2 = 0.5 + sin(c * 10.33 + time * 1.73) * 0.5;
fragColor = vec4(1, c1, c2, 0) * c;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment