const static char * fragmentShader= \
"void main() {"
"vec2 resolution = vec2(800.,600.);"
"vec2 uPos = ( gl_FragCoord.xy / resolution.y ); //normalize wrt y axis"
"uPos -= vec2((resolution.x/resolution.y)/2.0, 0.5); //shift origin to center"
"float time = gl_Color.x; // The time sent by color"
"float multiplier = 0.005; // Grosseur"
"const float step = 0.2; //segmentation"
"const float loop = 100.0; //Longueur"
"const float timeSCale = 1.05; // Vitesse"
"vec3 blueGodColor = vec3(0.0);"
"float i = 0.0;"
"for(i=1.0;i<loop;i++){ "
" float t = time*timeSCale-step*i;"
"vec2 point = vec2(0.75*sin(t), 0.5*sin(t*.02));"
"point += vec2(0.75*cos(t*0.1), 0.5*sin(t*0.3));"
"point /= 4. * sin(i);"
"float componentColor= multiplier/((uPos.x-point.x)*(uPos.x-point.x) + (uPos.y-point.y)*(uPos.y-point.y))/i;"
"blueGodColor += vec3(componentColor/2.0, componentColor/3.0, componentColor);"
"}"
"vec3 color = vec3(0,0,0);"
"color += pow(blueGodColor,vec3(1.1,1.1,0.8));"
"gl_FragColor = vec4(1.0,0.0,1.0, 1.0);"
"}" ;
Y29uc3Qgc3RhdGljIGNoYXIgKmZyYWdtZW50U2hhZGVyPVwKCSJ2b2lkIG1haW4oKSB7IgoJInZlYzIgcmVzb2x1dGlvbiA9IHZlYzIoODAwLiw2MDAuKTsiCgkidmVjMiB1UG9zID0gKCBnbF9GcmFnQ29vcmQueHkgLyByZXNvbHV0aW9uLnkgKTsgLy9ub3JtYWxpemUgd3J0IHkgYXhpcyIKCSJ1UG9zIC09IHZlYzIoKHJlc29sdXRpb24ueC9yZXNvbHV0aW9uLnkpLzIuMCwgMC41KTsgLy9zaGlmdCBvcmlnaW4gdG8gY2VudGVyIgoJImZsb2F0IHRpbWUgPSBnbF9Db2xvci54OyAvLyBUaGUgdGltZSBzZW50IGJ5IGNvbG9yIgoJImZsb2F0IG11bHRpcGxpZXIgPSAwLjAwNTsgLy8gR3Jvc3NldXIiCgkiY29uc3QgZmxvYXQgc3RlcCA9IDAuMjsgLy9zZWdtZW50YXRpb24iCgkiY29uc3QgZmxvYXQgbG9vcCA9IDEwMC4wOyAvL0xvbmd1ZXVyIgoJImNvbnN0IGZsb2F0IHRpbWVTQ2FsZSA9IDEuMDU7IC8vIFZpdGVzc2UiCgkKCSJ2ZWMzIGJsdWVHb2RDb2xvciA9IHZlYzMoMC4wKTsiCgkiZmxvYXQgaSA9IDAuMDsiCgkiZm9yKGk9MS4wO2k8bG9vcDtpKyspewkiCQoJIglmbG9hdCB0ID0gdGltZSp0aW1lU0NhbGUtc3RlcCppOyIKCQkidmVjMiBwb2ludCA9IHZlYzIoMC43NSpzaW4odCksIDAuNSpzaW4odCouMDIpKTsiCgkJInBvaW50ICs9IHZlYzIoMC43NSpjb3ModCowLjEpLCAwLjUqc2luKHQqMC4zKSk7IgoJCSJwb2ludCAvPSA0LiAqIHNpbihpKTsiCgkJImZsb2F0IGNvbXBvbmVudENvbG9yPSBtdWx0aXBsaWVyLygodVBvcy54LXBvaW50LngpKih1UG9zLngtcG9pbnQueCkgKyAodVBvcy55LXBvaW50LnkpKih1UG9zLnktcG9pbnQueSkpL2k7IgoJCSJibHVlR29kQ29sb3IgKz0gdmVjMyhjb21wb25lbnRDb2xvci8yLjAsIGNvbXBvbmVudENvbG9yLzMuMCwgY29tcG9uZW50Q29sb3IpOyIKCSJ9IgoJCgkKCSJ2ZWMzIGNvbG9yID0gdmVjMygwLDAsMCk7IgoJImNvbG9yICs9IHBvdyhibHVlR29kQ29sb3IsdmVjMygxLjEsMS4xLDAuOCkpOyIKICAgCgkKCSJnbF9GcmFnQ29sb3IgPSB2ZWM0KDEuMCwwLjAsMS4wLCAxLjApOyIKIn0iOw==