Les erreurs types à ne pas commettre OpenGL Carina Portella Jean-Philippe Reynier DESS TNI – IDI Année
Introduction
Calcul des normales pour les surfaces Problème: glScalef() et normales Solutions: 1. glEnable(GL_NORMALIZE); 1. glEnable(GL_NORMALIZE);glEnable(GL_RESCALE_NORMAL); 2. Ne pas utiliser glScalef() 2. Ne pas utiliser glScalef() Calculs manuels Calculs manuels 3. Modifier les normales avant dappliquer le glscalef() 3. Modifier les normales avant dappliquer le glscalef()
Éclairage et tesselation Problème: éclairage peu nuancé dû au faible nombre de points Solution: réaliser une meilleure tesselation en augmentant le nombre de points de lobjet géométrique
Opérations et matrice courante Problème: résultat inattendu dune opération appliquée sur une matrice Solution: modifier la matrice courante avant dappliquer lopération (possibilité de vérifier la matrice actuelle avec glGetIntegerv() )
Débordement des piles de matrices Problème: glPushMatrix() nest pas pris en compte Solution: vérifier le nombre de matrices empilées grâce à glGetIntegerv()
Définition de tous les niveaux de mipmap Problème: texture de faible qualité 1. tous les niveaux de détail nont pas été définis 2. définition incorrecte des niveaux ne respectant pas le fait que chaque niveau de détail doit correspondre à la moitié du niveau précédent Solution: définir correctement tous les niveaux de detail ou employer gluBuild2DMipmaps()
Récupération de la luminosité dun pixel Problème: mauvaise correspondance entre la version couleur et la version en niveaux de gris ; cette correspondance étant calculée grâce à la luminosité du pixel Solution: - glPixelTransferf(GL_{R,G,B}_SCALE, coeff); - suppression dune couleur - ré-évalution du poids dune couleur glPixelTransferf(GL_RED_BIAS, 0.1); glPixelTransferf(GL_RED_BIAS, 0.1);
Etat des primitives Problème: - temps de traitement relativement long - comportement inattendu à lécran Solution: après utilisation dune primitive, ne pas oublier de la remettre à son état précédent
Récupérer létat dun pixel Problème: le changement de létat dune variable écrase létat précédent Solution 1: - créer des variables temporaires pour récupérer les états des variables avec glGetIntegerv() - modifier les états qui nous intéressent grâce à glPixelStorei() - Réaffecter les anciennes valeurs avec glPixelStorei() en utilisant les variables temporaires
Récupérer létat dun pixel Problème: le changement de létat dune variable écrase létat précédent Solution 2: - faire un glPushClientAttrib() pour effectuer une copie de lensemble des attributs des variables courantes - faire les modifications souhaitées - faire un glPopClientAttrib() pour récupérer les anciens états
Réglage de la couleur du raster Problème: tout changement de couleur après un glRasterPos2i nest pas pris en compte Solution: refaire un raster après chaque changement de couleur (glBitmap utilisant le raster)
Position de lorigine du dessin Problème: le dessin napparaît pas à la position souhaitée Solution: le comportement dOpenGl diffère de celui des autres API 2D (origine en haut à gauche) et 3D (en bas à gauche)
Buffer secondaire Problème: le buffer secondaire nest pas pris en compte par lapplication Solution: ne pas oublier de déclarer lutilisation dun buffer secondaire auprès dOpenGL