xxxxxxxxxx
// Author: Sol Sarratea
// Title: Computando las órbitas para f(z) = pow(z) + c
precision mediump float;
uniform float u_time;
uniform vec2 u_resolution;
uniform vec2 u_mouse;
uniform sampler2D u_buffer0;
uniform sampler2D u_buffer1;
uniform sampler2D u_buffer2;
vec2 uv(){
/* Devuelve las posiciones del canvas en rango [-1.,1.]x[-1.,1.] */
vec2 pos = gl_FragCoord.xy/u_resolution;
pos = pos *2.-1.;
return pos;
}
vec2 multC(vec2 a, vec2 b){
float re = a.x*b.x - a.y*b.y;
float im = a.x*b.y + a.y*b.x;
return vec2(re,im);
}
vec2 f(vec2 zn, vec2 c){
return multC(zn,zn)+vec2(c);
}
void main() {
vec3 color = vec3(0.);
vec2 pos = uv();
vec2 posN = gl_FragCoord.xy/u_resolution;
vec2 c = vec2(-0.210,-0.780);
//Sugerencia: agregar funcion que dependa de u_time para explorar el espacio de parametros dinamicamente
//c = vec2(-0.700,mix(-0.210,0.210,fract(u_time*0.2)));
// Leo la última posición actualizada
vec2 z = texture2D(u_buffer2,posN).xy;
//BUFFER 0: Mezcla el frame anterior con el valor calculado
vec3 prev = texture2D(u_buffer1, posN).xyz;
float cir = smoothstep(0.02,0.,length(pos-z)-0.01);
cir -= smoothstep(0.02,0.1,length(pos-z));
color = max(prev,cir);
if (color.r>0.1){
color -=0.001;
}
//BUFFER 1: Almacena el ultimo frame
color = texture2D(u_buffer0, posN+vec2(0.0,0.)).rgb;
//BUFFER 2: Calcula la k-esima iteracion de f(z)
vec2 nuevo_z = f(z,c);
color.rg = nuevo_z;
//Finalmente,rendereamos a la escena principal
color = texture2D(u_buffer1, posN).rgb;
gl_FragColor = vec4(color, 1.0);
}