Forum Programmation.c++ [RESOLU]Pas de swapBuffers quand lancé depuis la console (OpenGL, glut,zsh,debian)

Posté par  .
Étiquettes :
1
7
mai
2011

Bonjour,
J'ai commencé un projet en C/C++, et je suis confronté à un problème:
J'utilise les librairies OpenGL/GLut pour l'affichage, et tout va bien; mis à part quand je lance le programme depuis la console (ce qui est ennuyeux, j'ai besoin de lui passer des arguments).

Le symptôme est le suivant: quand je lance lance mon programme, les fenêtre s'affichent, mais avec pour seules couleurs ce qui était affiché derrière elles au lancement, j'entends mon arrière plan ou une autre fenêtre déjà ouverte. Je pencherais pour un problème de buffer qui ne s'échange pas (j'utilise l'option double buffer). Etonnemant, même quand je désactive l'option, le problème persiste.

A chaque click dans cette fenêtre, ou à chaque redimensionnement, je peux apercevoir l'image telle qu'elle devrait apparaître, mais seulement pendant une fraction de seconde.

Je suis sous debian Squeeze, et j'utilise zsh.

Quand je lance mon programme depuis le navigateur, aucun problème. Idem quand je lance de ALT+F2 (dans ce cas je peux passer des arguments, mais c'n'est pas très pratique)

Si vous avez des idées, je suis preneur!

Cowcow

  • # glutSwapBuffers

    Posté par  . Évalué à 1.

    N'aurais-tu pas tout simplement oublié d'appeler cette fonction afin de déclencher la permutation de buffers ?

    • [^] # Re: glutSwapBuffers

      Posté par  . Évalué à 1.

      Non, certain. Comme je l'ai dit, aucun problème si je lance mon programme via double-click.

      • [^] # Re: glutSwapBuffers

        Posté par  . Évalué à 1.

        As-tu la possibilité de tester avec une autre machine ? Un autre OS (genre un livecd) ? À la rigueur, ton code source serait-il accessible ? Histoire de voir si ça se produit sur une autre machine/OS ?

        Une autre solution serait de prendre comme base pour ton programme le code source d'un tutoriel qui marche chez toi.

        • [^] # Re: glutSwapBuffers

          Posté par  . Évalué à 1.

          J'ai pu essayer avec une ubuntu 32bits -> aucun problème. Le code source peut être accessible ; ce serait n'importe quel code source contenant des appels à glut (je pense que le problème vient plus de glut qu'opengl). J'ai déjà essayé avec un code source minimaliste de tutoriel, même problème. Je me répète, mais ce n'est vraiment que si je lance le programme depuis la console.

          • [^] # Re: glutSwapBuffers

            Posté par  . Évalué à 1.

            La dernière ligne n'est pas claire:
            Le code compile, et marche parfaitement.

            Par contre, aimeriez-vous le makefile? Les commandes de link?

  • # Environnement

    Posté par  . Évalué à 2.

    Un différence au niveau de l’environnement ? Genre si t'a plusieurs bibliothèques OpenGL sur ton système.

    Si tu lance ton programme dans gdb t'a le bug ?

    • [^] # Re: Environnement

      Posté par  (site web personnel) . Évalué à 2.

      Un différence au niveau de l’environnement?

      C'est certainement la première piste à explorer. La commande env permet de démarrer un programme dans un environnement vierge, grâce à l'option -i. Ça change quelque chose?

      • [^] # Re: Environnement

        Posté par  . Évalué à 1.

        J'irais aussi dans ce sens. Je n'ai pas mon ordinateur jusqu'à demain, je posterai les résultats. J'ai essayé depuis gdb, en faisant tout bêtement :
        $gbd prog.x
        $run

        Même problème. Le problème pourrait-il venir, d'une façon ou d'une autre, de zsh?
        Bonne nuit!

        • [^] # Re: Environnement

          Posté par  . Évalué à 0.

          Possible même si j'ai du mal à en comprendre la raison, le plus simple serait de lancer des terminaux avec d'autres shells, bash, dash, tcsh, etc. et de voir ce qu'il se passe...

          Tu parlais plus haut d'un test sous Ubuntu 32 bits qui n'avait pas le problème. Je suppose que ta Squeeze est une 64 bits ? Il serait alors pas mal de voir si ça marche aussi sous une Ubuntu 64 bits.

          Au passage, as-tu comparé les versions de X11, glut, driver OpenGL, etc entre ta Squeeze et ta Ubuntu ? Car ça pourrait aussi être une origine de ton pb (genre un bug dans une de tes lib sous Squeeze).

      • [^] # Re: Environnement

        Posté par  . Évalué à 0.

        $env -i ./prog.x
        freeglut (./prog.x): failed to open display ''

        Voilà pour env. Est-ce que ça aide ?

        • [^] # Re: Environnement

          Posté par  . Évalué à 0.

          Pas de changement avec bash, et j'ai réinstallé toutes mes librairies.
          J'ai fait un petit test avec un
          system("echo $PATH > x");
          avec x = console ou x = navig.

          J'ai eu :
          navig
          /usr/local/bin:/usr/bin:/bin:/usr/games

          console
          /usr/local/bin:/usr/local/sbin:/bin:/usr/bin:/usr/sbin:/usr/bin/X11:/usr/X11R6/bin:/usr/games:/sbin:/home/cowcow/bin

          Je vois bien la différence, mais je ne sais pas du tout si c'est utile...

        • [^] # Re: Environnement

          Posté par  (site web personnel) . Évalué à 1.

          Essaie

          env -i DISPLAY="$DISPLAY" HOME="$HOME" PATH="$PATH" ./prog.x
          
          • [^] # Re: Environnement

            Posté par  . Évalué à 0.

            A peine changé, mais changé quand même :
            > No protocol specified
            > freeglut (./projet.x): failed to open display ':0.0'

        • [^] # Re: Environnement

          Posté par  (site web personnel) . Évalué à 1.

          Tu peux aussi ajouter un

          system("env | sort > $DUMPTAG.dumpenv");
          

          vers le début de ta fonction main et tu lances une fois le programme dans ton Alt+F2 en mettant env DUMPTAG=interface devant le nom de ton programme et une fois depuis le terminal en faisant env DUMPTAG=terminal avant ton programme. Tu obtiens deux fichiers interface.dumpenv et terminal.dumpenv qui correspondent aux environnements des deux éxécutions. Ensuite tu les diff pour voir la différence. Tu vois quelque chose d'intéressant?

          • [^] # Re: Environnement

            Posté par  . Évalué à 0.

            Voilà une (parmis d'autres) ligne qui n'apparaît que dans terminal.dumpenv
            > LIBGL_ALWAYS_INDIRECT=1

            J'ai donc tapé ça dans google, et suis tombé sur ça:
            http://forum.ubuntu-fr.org/viewtopic.php?id=220098

            Ah! Il en rougit, le traître!

            après un
            > unset LIGL_ALWAYS_INDIRECT
            le programme se lance comme un charme depuis le terminal :) Par contre, il semblerait que ce ne soit pas permanent.

            Merci pour l'aide :)

            • [^] # Re: Environnement

              Posté par  (site web personnel) . Évalué à 1.

              Soit tu encapsules l'appelle à ton programme dans un court script shell qui modifie l'environnement comme tu le souhaites, soit tu édites l'environnement depuis ton programme (avant d'initialiser OpenGL). La première solution est un peu plus propre si tu as en vue la portabilité de ton programme.

              Si ton programme plante sans rien te dire lorsque LIBGL_ALWAYS_INDIRECT=1 c'est que tu ne testes pas correctememnt la valeur de retour de la procédure initialisation, il me semble.

              De rien pour l'aide!

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.