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 Rémi Hérilier . É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 cowcow . Évalué à 1.
Non, certain. Comme je l'ai dit, aucun problème si je lance mon programme via double-click.
[^] # Re: glutSwapBuffers
Posté par Rémi Hérilier . É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 cowcow . É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 cowcow . É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 Tonton Benoit . É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 Michaël (site web personnel) . Évalué à 2.
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 cowcow . É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 Rémi Hérilier . É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 cowcow . É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 cowcow . É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 Michaël (site web personnel) . Évalué à 1.
Essaie
[^] # Re: Environnement
Posté par cowcow . É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 Michaël (site web personnel) . Évalué à 1.
Tu peux aussi ajouter un
vers le début de ta fonction
main
et tu lances une fois le programme dans ton Alt+F2 en mettantenv DUMPTAG=interface
devant le nom de ton programme et une fois depuis le terminal en faisantenv DUMPTAG=terminal
avant ton programme. Tu obtiens deux fichiersinterface.dumpenv
etterminal.dumpenv
qui correspondent aux environnements des deux éxécutions. Ensuite tu lesdiff
pour voir la différence. Tu vois quelque chose d'intéressant?[^] # Re: Environnement
Posté par cowcow . É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 Michaël (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.