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);
}