void main() {
vec2 uv = (gl_FragCoord.xy
- uResolution * 0.5)
/ uResolution.y;
vec2 c = uMouse;
vec2 z = uv;
float i = 0.0;
for (int n = 0; n < 256; n++) {
if (dot(z, z) > 4.0) break;
z = vec2(z.x*z.x - z.y*z.y,
2.0*z.x*z.y) + c;
i++;
}
float d = sqrt(i / 64.0);
vec3 col = palette(d);
gl_FragColor = vec4(col, 1.0);
}
Full fragment shader source:
precision mediump float;
uniform float uTime;
uniform vec2 uResolution;
uniform vec2 uMouse;
uniform float uZoom;
vec3 palette(float t) {
vec3 a = vec3(0.0, 1.0, 1.0); // cyan
vec3 b = vec3(1.0, 0.0, 1.0); // magenta
vec3 c = vec3(1.0, 0.84, 0.0); // gold
vec3 d = vec3(0.54, 0.17, 0.89); // violet
return a + b * cos(6.28318 * (c * t + d + uTime * 0.1));
}
void main() {
vec2 uv = (gl_FragCoord.xy - uResolution * 0.5) / uResolution.y;
vec2 c = uMouse;
vec2 z = uv * uZoom;
float i = 0.0;
for (int n = 0; n < 256; n++) {
if (dot(z, z) > 4.0) break;
z = vec2(z.x*z.x - z.y*z.y, 2.0*z.x*z.y) + c;
i += 1.0;
}
float d = sqrt(i / 64.0);
vec3 col = palette(d);
gl_FragColor = vec4(col, 1.0);
}