problème d'OpenGL

problème d'OpenGL - C++ - Programmation

Marsh Posté le 04-10-2002 à 18:12:09    

Y'a un truc ke je capte vraiment pas avec l'OpenGL c'est ce ke fait "glutMainLoop"  :??:  
Je pense ke si k'el k'un répond à la kestion ki suit, il m'éclairera deja pas mal... :  
 

Code :
  1. ... c'est juste ce bout ci ki nous interaisse; j'ai donc pas tout mis ...
  2. int OpenWindow(int argc, char** argv)
  3. {
  4. glutInit(&argc, argv);
  5. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  6. glutInitWindowSize(600 , 600);
  7. glutInitWindowPosition(100 , 100);
  8. glutCreateWindow("Labyrinth" );
  9. init();
  10. glutDisplayFunc(display);
  11. glutMouseFunc(mouse);
  12. glutMainLoop();
  13. return 0;
  14. }
  15. int main(int argc, char** argv)
  16. {
  17.         cout << "1"<< endl;
  18. cout<<OpenWindow(argc, argv)<<endl;
  19.         cout << "2"
  20. return 0;
  21. }


 
ça compile, ouvre la fenetre OpenGL, fait ce k'y a à faire mais revien jamais à la fonction appelante  :heink:  
 
Pourkoi le "2" n'est jamais affiché??
Comment fair pour l'afficher??
 
thx!!
 :bounce:  
 

Reply

Marsh Posté le 04-10-2002 à 18:12:09   

Reply

Marsh Posté le 04-10-2002 à 18:45:19    

évidement après le 2y'a un ";"   :ange:  

Reply

Marsh Posté le 04-10-2002 à 19:03:42    

peak a écrit a écrit :

Y'a un truc ke je capte vraiment pas avec l'OpenGL c'est ce ke fait "glutMainLoop"  :??:  
Je pense ke si k'el k'un répond à la kestion ki suit, il m'éclairera deja pas mal... :  
 

Code :
  1. ... c'est juste ce bout ci ki nous interaisse; j'ai donc pas tout mis ...
  2. int OpenWindow(int argc, char** argv)
  3. {
  4. glutInit(&argc, argv);
  5. glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  6. glutInitWindowSize(600 , 600);
  7. glutInitWindowPosition(100 , 100);
  8. glutCreateWindow("Labyrinth" );
  9. init();
  10. glutDisplayFunc(display);
  11. glutMouseFunc(mouse);
  12. glutMainLoop();
  13. return 0;
  14. }
  15. int main(int argc, char** argv)
  16. {
  17.         cout << "1"<< endl;
  18. cout<<OpenWindow(argc, argv)<<endl;
  19.         cout << "2"
  20. return 0;
  21. }


 
ça compile, ouvre la fenetre OpenGL, fait ce k'y a à faire mais revien jamais à la fonction appelante  :heink:  
 
Pourkoi le "2" n'est jamais affiché??
Comment fair pour l'afficher??
 
thx!!
 :bounce:  
 
 




 
 
glutmainloop, c'est le main ;-)
 
en fait dans glutmainloop, ca regarde la file des messages du systemes d'exploitation et ca agit en conséquence

Reply

Marsh Posté le 05-10-2002 à 00:50:23    

hum, y'aurai moyen d'être un peu plus precis??
"regarde la file des messages du systemes d'exploitation et agit en conséquence"
-La fille des messages du systemes d'exploitation. càd??
-Agit en conséquence. comment? type de message->conséquence? (...exemples...)
 
-Comment afficher le "2"??????????????????
 
c'est cool de répondre; merci!  
mais je suis pas plus avancé!  

Reply

Marsh Posté le 05-10-2002 à 01:26:09    

Glu main loop en tres gros c'est egal a  
 
while(1)
;  
 

Reply

Marsh Posté le 05-10-2002 à 08:27:03    

en gros quand tu appuye sur le clavier, bouges la souris, redimensionne la fenetre, donne le focus a la fenetre, etc, windows (ou tout systeme d'exploitation, pusique glu c'est portable) génere des messages, qu'il transmet à l'application concernée.
 
gluMainloop regarde cette pile
 
gluDisplayFunc et gluMousFunc en fait ca correspond au des poiteurs de fonctions, qui seront appelées quand "détectées" dans les messages du systeme d'exploitation...
 
 
si tu as fais du javascript, gluMouseFunc, ca correspond à "onMousequesquechose"
 

Reply

Marsh Posté le 05-10-2002 à 14:44:54    

ok, je vois! :D  
Mais comment je fait pour sortir de la fonction???

Reply

Marsh Posté le 05-10-2002 à 20:04:53    

ducon, t'en sort pas ! :D
 
t'as un évenement "OnExit"

Reply

Marsh Posté le 06-10-2002 à 19:25:42    

OK, merci!!! :jap:  (même si ça m'arrange pô...)
 
En fait mon prob c'est ke je voudrai afficher des resultats d'un algo. dans une fenetre OpenGL et une fois ces resultats affiché continuer à executer mon algo.  
 
Est-ce k'y a une solution? (aller tapper mon code dans le while(1) de glutMainLoop() :heink: )  :??:  
 

Reply

Marsh Posté le 06-10-2002 à 21:52:11    

tu voudrais que ta fenetre affiche le résultat d'un algo ?
 
en fait ca dépend de ce qu'est l'algo et quel affichage tu en fait

Reply

Marsh Posté le 06-10-2002 à 21:52:11   

Reply

Marsh Posté le 08-10-2002 à 18:55:08    

En fait ce ke j'ai essayé de faire c'est sindé mon algo. en étape de manière à ce ke les resultats soient:
calculé(avec éventuellement des I/O (p.e.: cin>> cout<< ) - renvoyés(vers la fonction appelante- ki elle rappelera une fonction pour afficher les resultats(en OpengGL)-revenire dans fct appelante - réappeler algo() - recalculer - ........
mais comme je sais pas kitter la fonction glutMainLoop() pas moyen de revenir à ma fonction appelante pas moyen de refaire des cin>> cout<<  :??:  
 
(à la base;  j'aurai aimé calculer tout d'un coup tout en affichant ((cin>> cout<< ) + OpenGL) =>(void algo())  
 

Reply

Marsh Posté le 08-10-2002 à 19:40:30    

il faut que tu comprennes qu'on travaille avec un systeme d'exploitation qui détecte des évènement, et que l'affichage est géré indifféremment du reste de ton programme

Reply

Marsh Posté le 09-10-2002 à 15:24:54    

ok, en fait je croit ke c'est justement ça ki me pose problème; j'ai trop l'habitude des algo. itératif...
Je croit ke j'ai plus ou moins capté :)  
 
thx!

Reply

Marsh Posté le 09-10-2002 à 16:53:36    

le systeme il travaille evec des process, des threads au sein d'un mêm e programme.... po penser différemment

Reply

Marsh Posté le 09-10-2002 à 21:45:19    

glutDisplayFunc(display);  
Normalement entre chaque affichage il doit passer dans la fonction "display"
 
 

Code :
  1. void display(void)
  2. {
  3. //fait tes calcul ici et tes input
  4. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  5. //dessine en opengl
  6. glFlush(); //affiche tout
  7. }


---------------
Ils veulent la jouer hard, on va la jouer hard  
Reply

Marsh Posté le 09-10-2002 à 22:58:19    

oui, mais...
 
 glutDisplayFunc(display);    
 
ca c le systeme qui l'appelle quand il dessine la fenetre.
 
si on met des calculs, ca doit etre des "petits calculs" nécéssaire a l'affichage

Reply

Marsh Posté le 10-10-2002 à 08:18:28    

si c'est entre les affichages pil poil ,il n'y a que ca,
 sinon il y a glutIdleFunc(idle) qui s'execute en permanence.


---------------
Ils veulent la jouer hard, on va la jouer hard  
Reply

Marsh Posté le 10-10-2002 à 11:02:43    

y'a aussi les timers si je me souviens bien. Mais le truc c'est effectivement de tout mettre dans la fonction idle avec un test du temps passé.


---------------
Kiss the boot of shiny, shiny leather...
Reply

Marsh Posté le 10-10-2002 à 11:25:46    

Petite question en passant:
 
on peut trouver des livres ou des cours online sur OpenGL ?

Reply

Marsh Posté le 10-10-2002 à 12:16:49    

la tu te boulaytises.....
 
www.google.fr
 
 
masi attention, la on parle de glu, c'est pas tellement de l'opengl, masi plus de la "programmation systeme"


Message édité par farib le 10-10-2002 à 12:17:56
Reply

Marsh Posté le 11-10-2002 à 04:10:54    

Hercule a écrit a écrit :

si c'est entre les affichages pil poil ,il n'y a que ca,
 sinon il y a glutIdleFunc(idle) qui s'execute en permanence.




 
en fait il ne s'execute pas en permanence seulement
quand l'appli est idle. (ie pas de messages dans la file des messages). Ce qui fait qu'il peut etre "affame", c'est a dire ne pas avoir de temps pour s'executer pendant un temps certain surtout si tes autres appels de fonction sont gros.
 
De plus comme il s'execute dans le thread principal (comme toutes les autres foncions), il est indispensable qu'il retourne rapidement (pas de gros calculs), ou l'application semblera ne pas repondre a windows.
 
POur faire des gros calculs et continuer a gerer l'affichage, il faut soit reussir a decouper le calcul en morceaux micro-gerables, soit le faire tourner dans un thread separe et laisser le systeme d'exploitation ou le systeme de thread gerer la repartition du temps.
 
Ceci dit je ne vois pas encore trop ce que tu veux faire.
 
LeGreg

Reply

Marsh Posté le 11-10-2002 à 08:58:56    

legreg a écrit a écrit :

 
 
en fait il ne s'execute pas en permanence seulement
quand l'appli est idle. (ie pas de messages dans la file des messages). Ce qui fait qu'il peut etre "affame", c'est a dire ne pas avoir de temps pour s'executer pendant un temps certain surtout si tes autres appels de fonction sont gros.
 
De plus comme il s'execute dans le thread principal (comme toutes les autres foncions), il est indispensable qu'il retourne rapidement (pas de gros calculs), ou l'application semblera ne pas repondre a windows.
 
POur faire des gros calculs et continuer a gerer l'affichage, il faut soit reussir a decouper le calcul en morceaux micro-gerables, soit le faire tourner dans un thread separe et laisser le systeme d'exploitation ou le systeme de thread gerer la repartition du temps.
 
Ceci dit je ne vois pas encore trop ce que tu veux faire.
 
LeGreg




 
+1

Reply

Marsh Posté le 11-10-2002 à 09:10:11    

S'il arrive à être affamé, c'est que t'as un problème autre part...
Par contre qu'il affame, ca c'est certain, et dans notre cas, ca a pas d'importance.
 
"calculé(avec éventuellement des I/O (p.e.: cin>> cout<< ) - renvoyés(vers la fonction appelante- ki elle rappelera une fonction pour afficher les resultats(en
OpengGL)-revenire dans fct appelante - réappeler algo() - recalculer - ........  
 
Tu met ta fonction dans display (et idle ca marche aussi), et tout va bien, mais ca n'aller pas pour certains.
 
Si pour toi la solution thread, parait plus simple pour un débutant ...
Qu'il fasse dans display si ca marche, il peut toujours l'améliorer après, mais si c'est juste une image fixe type graphique, c'est exactement ce qu'il faut.


Message édité par Hercule le 11-10-2002 à 09:12:45

---------------
Ils veulent la jouer hard, on va la jouer hard  
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed