Malevich arrive périodiquement à tout développeur sur OpenGL. Cela se produit de façon inattendue et hardiment, vous commencez simplement le projet et voyez un carré noir au lieu d’un merveilleux rendu:

Aujourd’hui, je décrirai la raison pour laquelle j’ai été visité par un carré noir, les problèmes trouvés à cause de quel OpenGL ne dessine rien à l’écran, et rend parfois même la fenêtre transparente.
Utilisez des outils
Pour le débogage OpenGL, deux outils m’ont aidé: renderdoc et et . RenderDoc & # 8211; Outil pour déboguer le processus de rendu OpenGL, vous pouvez tout voir & # 8211; Vertexes, shaders, textures, messages de la dette du pilote. Apitrace & # 8211; Un outil pour relever les défis d’une API graphique, fait des appels à vidage et affiche des arguments. Il y a aussi une excellente occasion de comparer deux décharges via Wdiff (ou sans, mais pas si pratique)
Vérifiez avec qui vous travaillez
J’ai un système d’exploitation Ubuntu 16.10 avec les anciennes dépendances SDL2, GLM, ASSIMM, GLEW. Dans la dernière version d’Ubuntu 18.04, j’obtiens l’assemblage du jeu Death-Mask qui ne montre rien à l’écran (seulement un carré noir). Lorsque vous utilisez le chroot et l’assemblage à 16.10 I , j’obtiens un assemblage de travail du jeu avec des graphiques .

Il semble que quelque chose soit cassé dans Ubuntu 18.04
LDD a montré le linkka aux bibliothèques identiques SDL2, GL. En conduisant une construction non travaillant dans RenderDoc, j’ai vu des ordures à l’entrée du vertex shader, mais j’avais besoin d’une confirmation plus solide. Afin de comprendre la différence entre les binares, je les ai conduits à tous les deux via apitrace . La comparaison des décharges m’a montré que l’assemblée sur un nouveau Ubunta rompt le programme des prospects dans OpenGL, en réellement des ordures là-bas:

Les matrices se rassemblent dans la bibliothèque GLM. Après avoir copier GLM à partir de 16,04 & # 8211; J’ai à nouveau obtenu la construction de travail du jeu. Le problème était la différence dans l’initialisation d’une seule matrice dans GLM 9.9.0, il est nécessaire d’indiquer clairement l’argument MAT4 (1.0f) dans le constructeur. Ayant changé l’initialisation et en rangeant l’auteur de la bibliothèque, j’ai commencé à faire Teste pour FSGL . Dans le processus d’écriture que j’ai trouvé des défauts dans FSGL, je les décrirai davantage.
Déterminez qui est dans la vie
Pour le bon travail avec OpenGL, vous devez volontairement de force demander le contexte d’une certaine version. Il recherche donc SDL2 (vous devez mettre la version strictement avant d’initialiser le contexte):
sdl_gl_seettrtribute (sdl_gl_context_major_version, 3 );
Sdl_gl_settribute (sdl_gl_context_minor_version, 2 );
Sdl_gl_settribute (sdl_gl_context_profile_mask, sdl_gl_context_profile_core);
Par exemple, RenderDoc ne fonctionne pas avec des contextes inférieurs à 3.2. Je voudrais noter qu’après changer le contexte , il y a une forte probabilité de voir le même écran noir . Pourquoi?
Parce que le contexte d’OpenGL 3.2 doit nécessiter la présence de tampon VAO , sans lesquels 99% des conducteurs graphiques ne fonctionnent pas. Ajoutez-le facile:
glGenverTexArrays ( 1 , & vao);
Glbindvertexaray (vao);
Ne dormez pas, gel
J’ai également rencontré un problème intéressant sur Kubuntu, au lieu d’un carré noir, j’ai été montré transparent, et parfois tout a été rendu correctement. J’ai trouvé la solution à ce problème à Stack Overflow:
https://stackoverflow.com/questions/38411515/sdl2-opengl-window-appears-semi-transparent-sometimes
Le code de rendu de test FSGL était également présent sommeil (2s) ; Donc, sur le Xubuntu et Ubuntu, j’ai reçu le rendu correct et envoyé la demande endormie, mais sur Kubuntu, j’ai reçu un écran transparent dans 80% du lancement de Dolphin et 30% des lancements et du terminal. Pour résoudre ce problème, j’ai ajouté le rendu dans chaque trame, après une enquête SDlevent, comme recommandé dans la documentation.
Code de test:
https://gitlab.com/demensdeum/FSGLtests/blob/master/renderModelTest/
Parlez au conducteur
OpenGL prend en charge le canal de communication entre l’application et le pilote, pour l’activer, vous devez allumer les drapeaux GL_DEBUG_OUTPUT, GL_DEBUG_OUTPUT_SYNCHRONUS, APPIX L’ARTIPE GLDEBUGMESSAGECONTROL et TIE THE CALBACK AUX CLACK CLASS = “PL-PLE-C1” .
Un exemple d’initialisation peut être pris ici:
https://github.com/rock-core/gui-vizkit3d/blob/master/src/EnableGLDebugOperation.cpp