Fractal rendering is usually introduced with Mandelbrot or Julia sets, but those are not the only way to generate rich self-similar structure. The MRS fractal is a small iterative system based on three geometric operations:

  • Mirror space across one or more planes.
  • Rotate the point around a fixed axis.
  • Scale and offset the point before the next iteration.

The name is literal; MRS stands for Mirror, Rotate, Scale.

Given a 3D point \(p_0\), we iterate:

\[p_{n+1} = s \cdot R\left(M\left(p_n\right)\right) - o\]

where:

  • \(M\) is a mirror operator.
  • \(R\) is a rotation matrix.
  • \(s > 1\) is a scalar growth factor.
  • \(o\) is a constant offset vector.

This loop folds space back on itself, then expands it. Repeating that process creates nested structure at many scales.

uniform int uPalette;
uniform int uIterations;
uniform float uZoom;
uniform float uRotSpeed;
uniform float uMirrorStart;
uniform float uScaleDecay;

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
  vec2 uv = max(uZoom, 0.0001) * fragCoord.xy / iResolution.y;
  float t = iTime * uRotSpeed;
  float k = cos(t), l = sin(t);

  float s = uMirrorStart;
  int iters = clamp(uIterations, 1, 128);
  for (int i = 0; i < 128; ++i) {
    if (i >= iters) break;
    uv = abs(uv) - s;         // mirror
    uv *= mat2(k, -l, l, k);  // rotate
    s *= uScaleDecay;         // scale decay
  }

  float x = 0.5 + 0.5 * cos(6.28318530718 * 40.0 * length(uv));
  vec3 col = vec3(x);         // palette selection omitted for brevity
  fragColor = vec4(col, 1.0); // vignette/alpha applied in full shader
}