Bonjour,
aujourd'hui je me pose une question existentielle... sur l'opérateur modulo de GLSL
dans l'exemple OF "ShaderExample" le développeur utilise modulo pour n'afficher qu'un pixel sur deux en x et un pixel sur 4 en y, jusqu'ici tout va bien. Par contre il teste le résultat du modulo sur 0.5 ???
float xVal = gl_FragCoord.x;
if( mod(xVal,2.0) == 0.5 ){
...
}
si je fais le teste avec == 0.0 je n'ai jamais rien. Dans tous les autres langages de programmation j'ai toujours comparé un modulo avec "0" pour effectuer des "alternances" ya un truc que j'ai pas pigé ?
Hors ligne
non mais, si tu testes avec ==0 tu rentres jamais dans le if...
c'est ça que je comprends pas.
Hors ligne
Si tu prends l'aide de chez opengl : http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml
ils annoncent ça : x - y * floor(x/y)
donc moi j'en déduis :
12.0 - ( 2.0 * floor( 12.0 / 2.0) ) == 0.0 // true !
13.0 - ( 2.0 * floor( 13.0 / 2.0) ) == 0.0 // false ! ( 1.0 )
14.0 - ( 2.0 * floor( 14.0 / 2.0) ) == 0.0 // true !
etc...
Hors ligne
salut, suggestion comme ça, pas testé :
tu as essayé avec 0 et non 0.0 (floor cherche des int et non des float)
Hors ligne
Bon testé avec Gem, alors le modulo c'est chouette pour créer un espèce d'effets 'scanlines'
par contre même truc que toi turbo, le if s'execute pas si == 0.0
zarbi...
c'est pas juste le if qui serait en cause ici ?? (et pas le modulo qui en fait retournerait quelque chose de correct mais qui serait pas interprété comme on le veut ??)
Hors ligne
testé, dslé, j'ai dit une connerie
Hors ligne
et dans le même genre, avec :
float tintin = mod(gl_FragCoord.y , 2.0);
if (tintin != 0.0){
gl_FragColor = vec4(1., 1., 1., 0.);
}
me fait une image toute transparente... donc oui apparemment le mod() retourné n'égale jamais 0...
et je saurais pas dire pourquoi
Hors ligne
En fait il semblerait que tester des égalités strictes sur des floats soit une mauvaise idée. En gros faut pas tester == 0.0 mais < 0.2.
ça laisse une bonne marge d'erreur.
Hors ligne
Question subsidiaire bonus à 12 000 points,
ya moyen que le background d'of (ofBackground) soit aussi pris en compte par le frag shader ?
Hors ligne
Pour infos, j'ai trouvé le pourquoi du 0,5 ! en fait les coordonnées retournées par gl_fragCoord ne sont pas entière !
citation :
gl_FragCoord may be redeclared with the additional layout qualifier identifiers origin_upper_left or pixel_center_integer. By default, gl_FragCoord assumes a lower-left origin for window coordinates and assumes pixel centers are located at half-pixel centers. For example, the (x, y) location (0.5, 0.5) is returned for the lower-left-most pixel in a window. The origin of gl_FragCoord may be changed by redeclaring gl_FragCoord with the origin_upper_left identifier. The values returned can also be shifted by half a pixel in both x and y by pixel_center_integer so it appears the pixels are centered at whole number pixel offsets. This moves the (x, y) value returned by gl_FragCoord of (0.5, 0.5) by default to (0.0, 0.0) with pixel_center_integer.
la doc précise qu'a moind d'essayer de faire un truc compatible avec DirectX ya pas besoin de changer ça... ouf, ça me rassure de comprendre, j'aime pas les "flous artisitiques"
Hors ligne
pourquoi un modulo sur des floats devrait renvoyer un entier ?
En fait sur les anciennes versions de gcc, le compilateur plantait.
Hors ligne