Il est très con.
- last_frame est un compteur de frame mis à jour à chaque frame, tournant en boucle de 0 à 255
- last_update est une texture qui contient le numéro de frame à laquelle a été mis à jour le point en (x,y)
- characters contient des données arbitraires pour le point (x,y)
- toutes les textures font 128x128
- width & height sont des valeurs < 128 correspondant à la portion des textures qui contiennent pour de vrai les données.
- vertex.coordinates contient des valeurs de 0 à 1 (0x0 pour le point en bas à gauch du viewport, 1x1 pour en haut à droite).
- les calculs bizarres avec ipos, c'est pour remettre à l'endroit les textures.
En gros au final, je m'attends à avoir, sur output_image.r la donnée qui vient de characters (je la vois bien), sur output_image.b une valeur valant 1 pour les points qui viennent d'être mis à jour, puis diminuant au fil du temps (là je ne vois rien), et output_image.g est un check pour voir si j'ai effectivement des 0 partout, et c'est bien le cas.
Et si je change ma texture en float et mon sampler en float aussi, tout en chargeant exactement les même bits (last_frame que je convertis en float entre 0 et 1, et last_frame toujours chargé avec le numéro de frame, en byte entre 0 et 255 et est normalizé par OpenGL en valeur flottante entre 0 et 1 quand je le sample).
Code:
#version 330 core
uniform uint width;
uniform uint height;
uniform uint last_frame;
uniform usampler2D last_update;
uniform sampler2D characters;
in vert {
vec2 coordinates;
} vertex;
out vec4 output_image;
void main() {
vec2 size = textureSize(characters, 0);
vec2 pos = vertex.coordinates;
uint maxsize = max(width, height);
pos.x = pos.x * maxsize;
pos.y = (1 - pos.y) * maxsize;
ivec2 ipos = ivec2(pos.y, pos.x);
vec4 c = texelFetch(characters, ipos, 0);
output_image = c;
uvec4 last = texelFetch(last_update, ipos, 0);
output_image.b = (float(last.r) / last_frame) * (float(last.r) / last_frame);
if(last.r == 0u) {
output_image.g = 1.0;
}
}
Et pour la version integer, j'apelle évidemment glTexImage avec:
internalformat = GL_RGB8UI
format = GL_RGB_INTEGER
type = GL_UNSIGNED_BYTE
Pour la version float, je ne sais plus mais ça marche donc c'est pas important.
---------- Post added at 23h55 ---------- Previous post was at 23h49 ----------
Tiens sinon rien à voir mais je suis tombé là dessus, je trouvais ça pas mal:
http://www.iquilezles.org/apps/shadertoy/index.html
(C'est un shader designer pour webGL)