转载自: http://glslsandbox.com/e#43790.1
#ifdef GL_ES
precision mediump float;
#endif
#extension GL_OES_standard_derivatives : enable
uniform float time;
uniform vec2 mouse;
uniform vec2 resolution;
float nMax = 1000.0;
void main( void ) {
float n = ((cos(time)+1.0)/2.0)*nMax; // Ici, on définit n en fonction du temps pour qu'il oscille entre 0 et nMax
if (gl_FragCoord.x > resolution.x*0.9) { // Sert à afficher la barre à droite
float hr = gl_FragCoord.y/resolution.y;
float nr = n/nMax;
if (hr<nr+0.01 && hr>nr-0.01) {
gl_FragColor = vec4(1.0);
} else {
gl_FragColor = vec4(0.0);
}
return;
}
vec3 color; // on définit la couleur, représentée par un vecteur 3D (x, y, et z correspondent au rouge, vert, bleu, et sont entre 0.0 et 1.0) (pour l'instant il est initialisé à [0,0,0] donc noir)
float a = gl_FragCoord.x;
float b = gl_FragCoord.y;
float r1 = mod(a, n); // on définit r1 et r2 les restes respectifs de "a mod n" et "b mod n"
float r2 = mod(b, n);
if (r1 < r2+1.0 && r1 > r2-1.0) { // Si r1 et r2 sont égaux (et donc que a et b sont congruents mod n) (marge d'erreur de 1)
color = vec3(r1/n, 1.0-r1/n, 0.0); // alors on affiche de la couleur : plus de rouge si le reste se rapproche de n, et plus de vert si le reste se rapproche de 0
}
gl_FragColor = vec4(color, 1.0);
}