learn GLSL from zero
ToolsCrea con shadersShader MakerCrea shaders gratis en líneaToolkitObras de shaders listas para tu webSketcher LabPinta el hero de tu landing con shaders3D StudioEl editor Three.js en tu navegador
GamesJuega con shadersOnomatoShaderEscribe una palabra y explótalaThe WatcherUn ojo que te sigueAetherVidrio líquido con un ojo adentroBloomcoreUna palabra hace crecer un jardín de luzPyrokineAvienta fuego a la paredVoltaicLa pirámide lanza rayosSurfSurfea un océano de shader

Lección 6 de 10 · Fractales en GLSL

Julia

Fija c, suelta z. Filamentos por todas partes.

Mandelbrot arranca z = 0 y deja que c sea el frag. El conjunto de Julia hace lo contrario: c es una constante fija y z arranca en el frag. Misma ecuación, papeles invertidos, otra criatura.

Cada c genera un Julia distinto. (-0.8, 0.16) da filamentos finos y conectados. Cambia un decimal y muta toda la galaxia.

vec2 c = vec2(-0.8, 0.16)La constante de Julia. La parte real -0.8 y la imaginaria 0.16 definen la forma completa. Es el ADN: misma iteración para toda la pantalla, una sola semilla decide si tienes espirales, polvo o ramas.
PruebaCambia vec2 c=vec2(-0.8, 0.16) a vec2(0.285, 0.01) para espirales clásicas, o a vec2(-0.4, 0.6) para un dragón. Mueve zoom para acercarte a los filamentos.

El código

precision highp float;
void main(){
  vec2 uv=(gl_FragCoord.xy*2.0 - R)/R.y;
  float zoom=1.5;
  vec2 z=uv*zoom;
  vec2 c=vec2(-0.8, 0.16);
  float n=0.0; bool esc=false;
  const int IT=150;
  for(int i=0;i<IT;i++){
    z=vec2(z.x*z.x-z.y*z.y, 2.0*z.x*z.y)+c;
    if(dot(z,z)>256.0){ n=float(i); esc=true; break; }
  }
  float sn=esc ? (n - log2(log2(dot(z,z))) + 4.0) : 0.0;
  float band=sn * 0.5;
  vec3 col=0.5+0.5*cos(0.35*band + vec3(0.4,1.6,3.4));
  col=esc ? col : vec3(0.03,0.0,0.05);
  gl_FragColor=vec4(col,1.0);
}
close