Alors voilà j'étais en train de coder tranquillement sous OpenGL en voulant mettre un carré en rouge.
Le codage à adopter en rvb était alors 1 0 0.
Vu que ce sont des entiers je me suis dit que j'allais utiliser glColor3i (oui je suis radin j'économise au maximum quand je code)
Et bien je suis tombé sur ce que je crois être un bug d'OpenGL et pendant quelques heures (oui je sais je suis le seul con à utiliser glColor3i) j'ai même cru que ça ne fonctionnait tout simplement pas.
La documentation de ce que j'ai pu en lire spécifie qu'on l'utilise exactement comme glColor3f mais avec des entiers au lieu des flottants. C'est à dire qu'on ne peut mettre que 0 ou 1 pour chacun des composantes.
J'ai donc appelé glColor3i(1, 0, 0);
Le carré apparaît noir... Je me suis alors dit qu'il fallait partir sur une base de 0 à 255 par composante. Même résultat avec glColor3i(255, 0, 0);![]()
J'ai alors pensé que ça venait peut-être de moi ; je me suis lancé dans des recherches de fou (et là j'ai remarqué par la même occasion sur google que personne n'utilisait cette fonction réellement dans son code) et j'en suis venu à la conclusion que la fonction était bugguée et ne servait en fait qu'à faire ce que ferait une simple void glBlack(void);
Mais têtu comme je suis j'ai continué mes tests en récupérant la variable d'environnement glut de la couleur courante.
Cela renvoyait 1 0 0 et 2147483647 soit 2^32 / 2 - 1, c'est-à-dire la limite supérieur des entiers signés !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 glColor3i(2147483647, 0, 0); int couleurs[4]; glGetIntegerv(GL_CURRENT_COLOR, couleurs); printf("couleur : %d %d %d %d\n", couleurs[0], couleurs[1], couleurs[2], couleurs[3]);
La valeur de l'alpha étant par défaut fixée à 1 (totale opacité), je me suis dit qu'en fait glColor3i ne travaillait pas sur un intervalle [0;1] mais sur [0;2^sizeof(int) / 2 - 1]. Je ne vous cache pas que j'ai mis du temps à le comprendre.
Chose étrange, lorsqu'on récupère les paramètres en flottant avec ce code :
J'ai bien 1.000000 0.000000 0.000000 1.000000 qui s'affiche !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 glColor3i(2147483647, 0, 0); float couleurs[4]; glGetFloatv(GL_CURRENT_COLOR, couleurs); printf("couleur : %f %f %f %f\n", couleurs[0], couleurs[1], couleurs[2], couleurs[3]);
J'ai pensé que cela venait de ma machine ou du compilateur (Visual Studio .NET) mais j'ai testé sur une machine complètement différente avec Dev-C++ et version moins récente de GLUT. Le résultat était le même...
On peut appliquer le même raisonnement pour glColor3ui mais avec cette fois un intervalle [0;4294967295] puisque 2^32 - 1 est la borne supérieur des entiers non signés.
Donc c'est vraiment un bug d'OpenGL ou alors quelque chose de non documenté (ce dont je doute puisqu'il n'est pas vraiment pratique pour la machine d'utiliser des si gros nombres). Autre hypothèse : mes drivers nVidia sont buggués mais ça m'étonnerait tout de même.
Si quelqu'un peut me rectifier ou ajouter des choses qu'il n'hésite pas !
Après toutes les heures passées là-dessus je n'ai pas voulu approfondir sur glColor3iv, glColor3uiv, glColor3b, glColor3ub, glColor3bv et glColor3ubv mais il y a fort à parier que le problème soit similaire.
Partager