This is a video feedback loop. That means, in the shader code, you can process the previous frame. Minimal action here: An interactive circle cursor and a fadeout of 2% per frame. This will not be my…
_=' Eb,c,d=3616f=3553,h~k~l,m,n;document.onmousemove=(eGb=:X/Q;c=1-:Y/Q}; p(e,rGl=eshadJSource(l,rcompilel&turn l}m= q$3,"Hu 3 bPosi=Wb,^u=(b.xy+^)/2.;q s$2,"p&cision highp floH;z 2 pz samplJ` s;FgColM=t`(s,u)*.98+Wclamp(^-length(u-p)*9.,0.,^))+W1slKkmusemB<,B()bDHa< [3,3]N35044enableV#(0fM(vPoKr(26,8,01048576%h[a]=0;fM(E0;2%=F(N.EO(O!.apixelSto&iZ317,1xImage`!?,?6 h)1,||@fO`(d,36064,f,.a,0 jeGactiveOZ3984+nO!k[n].a@edw#s(4,3)}E1;( u(Gn=1-a;z1is"Nnz2fp"Nb,cviewpMj0jjnullEn;&questAnimaFR(u)})(c&aRbnifMmextu&xPaRri!1024tionShadJ( ,new FloH32#((getULoca(m,",Qk[a]N;yKg 2 u;Progm(void maK(Ggl_);bKduffJfunc0,}"Htachm,vecJxAtrag.tevar-1,!(f,#Ary$=pZ563%>a;a++)&re:e.page<Z4962?6408@F(d,Ea=G){HatJerKinMorN),OTQ512RmeW4(Z(3^1.`2Djt(zu|9729~=[],trib';for(Y in $='~|zj`^ZWRQONMKJHGE@?<:&%$#! ')with(_.split($[Y]))_=join(pop());eval(_)
Xz0nHiBFF2IsYyxkPTM2MTYXZj0zNTUzLGh+a35sLG0sbjtkb2N1bWVudC5vbm1vdXNlbW92ZT0WKGVHYj06WC9RO2M9MS06WS9RfTsWIHAoZSxyR2w9AghlAXNoYWRKU291cmNlKGwscgFjb21waWxlCGwTJnR1cm4gbH1tPQIREx4gcSQzLCJIf3UdIBkzIGIQElBvc2kHPVdiLF4TdT0oYi54eSteKS8yLjsYcRMeIHMkMiwicCZjaXNpb24gaGlnaHAgZmxvSDt6IBkyIHAQeiBzYW1wbEpgIHM7EkYbZ0NvbE09dAVgKHMsdSkqLjk4K1djbGFtcCheLWxlbmd0aCh1LXApKjkuLDAuLF4pKStXFxcXMRMYcwFsS2sRbQF1c2URbQEUQhU8LAJCFSgpAWIVREhhPAlbHx8zLB8fM11OMzUwNDQBZW5hYmxlVhojKDATZk0oHHYaUG9LHXIoFzIMNiwXOCwwEzEwNDg1NzYlaFthXT0wO2ZNKEUwOzIlDj0CRgMoTg4uRQJPKA8UTyEOLmEPcGl4ZWxTdG8maVozMTcsMQ8deEltYWdlYCE/DCw/NgloKQYxLHwGF3wPQA4PZgNPYChkLDM2MDY0LGYsDi5hLDATFiBqZUccYWN0aXZlT1ozOTg0K24BFE8ha1tuXS5hAUBlAWQbdyNzKDQsFzMpfUUxOygWIHUoR249MS1hOxx6MWkLcyJObgF6MmYLcCJOYixjAXZpZXdwTWoXMAwME2oOE2pudWxsE0VuOyZxdWVzdEFuaW1hB0ZSKHUpfSkoEwETHAIcYyZhHQNSYhUEbmlmTW0FZXh0dSYGDx14UGFSHXJpITEwMjQHdGlvbghTaGFkSigJLG5ldyBGbG9IMzIjKAsoHGdldFUETG9jYQcobSwiDCxRDmtbYV0PThwQOx55S2cgGTIgdTsRUHJvZxttKBJ2b2lkIG1hSyhHZ2xfEyk7FGJLZBV1ZmZKFmZ1bmMHFzAsGH0iAUh0YWNoCG0sGXZlYxpKHXhBdH8bcmEcZy4ddGUedmFyHy0xLCEoZiwjQXIbeSQ9cFo1NjMlPmE7YSsrKSZyZTplLnBhZ2U8WjQ5NjI/FzY0MDgMQBRGAyhkLEVhPUcpe0hhdEplcktpbk1vck4pLE9UBVE1MTJSG21lVxk0KFooM14xLmAyRGp0KHp1BHw5NzI5fj1bXSx/dHJpYic7Zm9yKFkgaW4gJD0nf358empgXlpXUlFPTk1LSkhHRUA/PDomJSQjIR8eHRwbGhkYFxYVFBMSERAPDgwLCQgHBgUEAwIBJyl3aXRoKF8uc3BsaXQoJFtZXSkpXz1qb2luKHBvcCgpKTtldmFsKF8p
var w = 512, h = w, i = 0, x, y,
B = 36160,
T = 3553,
F = 9729,
C = 6408,
A = 34962,
N = 5126,
t = [],
f = [],
s, p, j;
document.onmousemove = function (b, c) {
x = b.pageX / w;
y = 1 - b.pageY / h;
};
function S(b, c) {
s = g.createShader(b);
g.shaderSource(s, c);
g.compileShader(s);
return s;
}
function D(b,c) {
g.attachShader(p, b);
}
function E(b, c) {
g.bindFramebuffer(B, b);
}
function P(b, c) {
g.texParameteri(T,b,F);
}
p = g.createProgram();
D(S(35633, "attribute vec3 b;varying vec2 u;void main(){gl_Position=vec4(b,1.);u=(b.xy+1.)/2.;}"));
D(S(35632, "precision highp float;uniform vec2 p;varying vec2 u;uniform sampler2D s;void main(){gl_FragColor=texture2D(s,u)*.98+vec4(clamp(1.-length(u-p)*9.,0.,1.))+vec4(0,0,0,1);}"));
g.linkProgram(p);
g.useProgram(p);
g.bindBuffer(A, g.createBuffer());
g.bufferData(A, new Float32Array([-1, -1, 3, -1, -1, 3]), 35044);
g.enableVertexAttribArray(0);
g.vertexAttribPointer(0, 2, N, 0, 8, 0);
for (; i < w * h * 4; i++) t[i] = 0;
for (i = 0; i < 2; i++) {
f[i] = g.createFramebuffer();
f[i].t = g.createTexture();
g.bindTexture(T, f[i].t);
g.pixelStorei(3317, 1);
g.texImage2D(T, 0, C, w, h, 0, C, N, new Float32Array(t));
P(10241);
P(10240);
E(f[i]);
g.framebufferTexture2D(B, 36064, T, f[i].t, 0);
}
function R(b,c) {
g.activeTexture(33984 + j);
g.bindTexture(T, f[j].t);
E(b);
g.drawArrays(4, 0, 3);
}
i = 1;
(function $() {
j = 1-i;
g.uniform1i(g.getUniformLocation(p, "s"), j);
g.uniform2f(g.getUniformLocation(p, "p"), x, y);
g.viewport(0, 0, w, h);
R(f[i]);
R(null);
i = j;
requestAnimationFrame($);
})();