FAQ OpenGL
FAQ OpenGL Consultez toutes les FAQ
Nombre d'auteurs : 9, nombre de questions : 74, dernière mise à jour : 24 juin 2021
- J'ai un problème avec OpenGL. Comment puis-je avoir plus d'informations dessus ?
- Pourquoi ma lumière n'éclaire-t-elle pas mon polygone quand je lui applique une texture ?
- Mon programme ne passe pas l'édition de liens (« undefined reference to … »), que faire ?
- Pourquoi l'appel à glGetUniformLocation échoue ?
- Comment s'assurer qu'une variable du shader sera effectivement dans le code compilé ?
Les fonctions OpenGL ne retournent pas de code d'erreur. Toutefois, il est possible de savoir si la dernière commande a rencontré une erreur avec la fonction glGetError(). Ainsi, pour chaque appel OpenGL, il est nécessaire d'appeler cette fonction et de vérifier sa valeur de retour afin de savoir si l'un de vos appels a provoqué une erreur.
À travers l'extension KHR_debug, il est possible d'avoir des fonctionnalités avancées pour la détection des erreurs lors de l'exécution. Notamment, cette extension ajoute la possibilité qu'un callback soit appelé lors d'une erreur.
Généralement, c'est que la texture est mise en mode REPLACE au lieu de MODULATE.
En mode REPLACE, OpenGL ne prend en compte lors de l'affichage que la couleur de la texture, alors qu'en mode MODULATE, la couleur de la texture est multipliée par la couleur du polygone.
Pour définir le mode d'utilisation de la texture, il faut utiliser le code suivant :
glBindTexture(/* binding de la texture dont on veut modifier les paramètres */
);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, parametre);
Où parametre vaut GL_REPLACE ou GL_MODULATE, selon ce que l'on veut réaliser.
Comme toute bibliothèque, OpenGL nécessite d'être liée à votre programme si vous souhaitez l'utiliser, sans quoi l'éditeur de liens ne trouvera pas les fonctions correspondantes, et vous jettera à la figure des messages tels que celui-ci :
undefined reference to `glViewport@16'
...
Il faut donc lier avec les bibliothèques que vous utilisez.
Avec Visual C++ : il faut aller dans les propriétés du projet, « édition de liens », « entrée », et y ajouter les fichiers .lib correspondant aux bibliothèques GL que vous utilisez (opengl32.lib pour OpenGL, glu32.lib pour GLU, et glut32.lib pour GLUT). Vous pouvez également lier en ajoutant la directive #pragma comment(lib, « xxx.lib ») dans l'un de vos fichiers source.
Avec MinGW : il faut également aller dans les propriétés du projet, « édition de liens », et ajouter les fichiers adéquats (libopengl32.a pour OpenGL, libglu32.a pour GLU, et libglut32.a pour GLUT). Vous pouvez également ajouter directement à la ligne de commande « -lxxx » pour lier avec la bibliothèque libxxx.a.
À noter que sous Windows vous aurez également besoin de lier avec GDI (libgdi32.a ou gdi32.lib), pour tout ce qui est création du contexte d'affichage.
Avec gcc : de la même manière qu'avec MinGW, il faut ajouter dans la ligne de commande « -lgl », « -lglu » ou « -lglut » pour utiliser ces bibliothèques.
Dernières remarques : vérifiez d'une part que tous ces fichiers sont dans des répertoires prédéfinis de l'éditeur de liens, et d'autre part… assurez-vous que vous les avez bien installés !
La fonction glGetUniformLocation() retourne -1 en cas d'erreur. Tout d'abord, il faut s'assurer que le nom passé en argument est bien identique à celui du code shader.
Si cela est le cas, vérifiez que votre variable est utilisée, ou que son résultat est utilisé dans le shader. En effet, le compilateur optimise et supprime les variables inutiles, faisant que le programme OpenGL ne voit plus celles-ci.
Dans ce cas, référez-vous à la question « Comment s'assurer qu'une variable du shader sera effectivement dans le code compilé ? »
Lien : Comment s'assurer qu'une variable du shader sera effectivement dans le code compilé ?
Lien : Documentation glGetUniformLocation()
Lien : Documentation glGetAttribLocation()
Une variable est supprimée du shader compilé lorsque celle-ci n'est pas utilisée. Cela pourra entraîner des messages d'avertissement dans votre programme C++. C'est pourquoi il est intéressant de forcer la présence de la variable.
La solution pour s'assurer de sa présence est de l'utiliser dans le calcul d'une des variables de sortie (généralement, la couleur).
Afin que cela n'altère pas votre rendu, vous pouvez stocker votre variable dans le canal alpha de la couleur. Ainsi, le code suivant force la présence de la myDummyVariablecelle-ci.
gl_FragColor =
vec4(color.rgb, 1
+
myDummyVariable);
L'utilisation du 1 + permet de s'assurer que dans tous les cas, le canal alpha sera à 1.