Je développe mon jeu la plupart du temps sous ArchLinux. Jai récemment décidé de lessayer sur Ubuntu 16.04. La situation que jai rencontrée était vraiment étrange:
- Aucun
glGetError()
du tout. - Aucune erreur, aucun avertissement, rien de grave dans la sortie de débogage gl.
- Toutes les affirmations que jai faites pour toutes les mauvaises situations ne se sont pas déclenchées.
-
glClear
a réussi à effacer les tampons I spécifié, mais: -
glDraw*
na rien dessiné.
Heureusement, jai trouvé une solution qui devait définir glViewport
. Cependant, je ne comprends pas très bien, pourquoi est-il nécessaire de dessiner dans Ubuntu mais pas nécessaire dans ArchLinux? La différence est également entre les adaptateurs graphiques: sur archlinux jutilise NVIDIA 1060, sur Ubuntu jutilise des graphiques HD intégrés P530 (Skylake GT 2 ).
Si cest important, jutilise SDL2 avec opengl 4.4.
Commentaires
- It ' est important pour que vous vous rendiez compte que le système dexploitation nest pas pertinent ici; OpenGL est implémenté par votre fournisseur de GPU dans leurs pilotes, donc les facteurs importants sont vos GPU et leurs pilotes. Là où le système dexploitation peut être intéressant est si votre fournisseur de GPU a des bases de code différentes pour différents systèmes dexploitation, mais sinon, les informations ' ne sont pas utiles.
- @MaximusMinimus cela pourrait être la réponse à la question.
Réponse
Vous avez déjà deux bonnes réponses, mais elles peuvent être difficiles à comprendre pour un débutant donc je « Je vais vous dire pourquoi avons-nous vraiment besoin de .
Dans un rendu typique, cela peut sembler insensé – vous créez simplement une fenêtre ou une cible de rendu et dessinez dessus, nest-ce pas? Je dirais que plus de 95% des applications fonctionnent de cette façon.
Mais disons que vous écrivez une application comme 3DS MAX, où vous avez une fenêtre divisée en 4 rendus distincts. Vous vous souvenez de votre la position de division actuelle et vous gérez les événements de la souris. Ainsi, lorsque vous survolez la barre de division, vous pouvez changer le curseur de la souris pour en redimensionner une, etc. Lorsque vous faites glisser votre barre de division, vous vous souvenez de sa nouvelle position et ainsi de suite.
Lorsque vous souhaitez rendre vos vues 3D, vous callez glViewport avec la position et la taille de votre première sous-fenêtre 3D et exécutez des commandes GL typiques pour dessiner ici. OpenGL redimensionnera automatiquement le rendu afin quil tienne dans la fenêtre donnée. Vous faites de même pour le reste de vos fenêtres et à la fin, vous obtenez une fenêtre avec quelques rendus différents, chacun avec ses propres paramètres. De cette façon, vous pouvez avoir autant de rendus distincts sur une seule fenêtre / cible de rendu que vous le souhaitez.
Pourquoi cela na pas fonctionné sur une machine?
Les GPU et leurs pilotes ont beaucoup détails de mise en œuvre et différences, vous devez donc vous habituer à de tels problèmes. Un exemple simple: dans le shader GLSL, vous pouvez créer un vecteur nul 2D comme celui-ci: vec2(0.0,0.0)
, vous pouvez également essayer décrire une valeur: vec2(0.0)
et avec ce code, certains pilotes la traiteront comme la version précédente tandis que dautres renverront une erreur et ne rendront rien. Gardez à lesprit que les pilotes de deux fournisseurs différeront davantage que deux versions du même pilote, cest donc une bonne idée de tester votre code sur les GPU nVidia, ATI et Intel. Dans ce cas précis, je soupçonne que dans les pilotes nVidia, lorsque vous ne définissez pas le port de vie par vous-même, ils supposent que vous souhaitez utiliser lintégralité de la cible de rendu, alors que les pilotes Intel ne le font pas.
Answer
glViewport permet à opengl de savoir comment mapper les coordonnées NDC aux coordonnées du framebuffer.
Par défaut, il est défini sur la taille totale du buffer décran. Vous navez donc besoin de lappeler que lorsque la fenêtre est redimensionné ou vous voulez réellement le changer.
Commentaires
- Ou lors du rendu dans un framebuffer, en supposant que la taille de la fenêtre est différente.
Réponse
glViewport spécifie la transformation affine de xx et yy des coordonnées normalisées de lappareil en coordonnées de la fenêtre. Soit (xnd , ynd) xndynd être coordonnée de périphérique normalisée inates. Ensuite, les coordonnées de la fenêtre (xw, yw) xwyw sont calculées comme suit:
- « xw = (xnd + 1) (width2) + xxw = xnd + 1width2 + x »
- « yw = (ynd + 1) (height2) + yyw = ynd + 1height2 + y »
La largeur et la hauteur de la fenêtre sont silencieusement fixées à une plage qui dépend de la mise en oeuvre. Pour interroger cette plage, appelez glGet avec largument « GL_MAX_VIEWPORT_DIMS »
Les paramètres x et y spécifient le coin inférieur gauche de la fenêtre en pixels, tandis que largeur et hauteur spécifient la largeur et la hauteur de la fenêtre