IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

wxWidgets Discussion :

wxWidgets Opengl Linux


Sujet :

wxWidgets

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut wxWidgets Opengl Linux
    Bonjour,

    J'ai fait un programme avec wxWidgets et Opengl qui affiche un cube. Le programme fonctionne très bien sur Windows mais pas sur Linux

    Je ne sais vraiment pas où poster vu que je ne sais pas d'où vient le problème : Linux, WxWidgets ou Opengl ?! Donc je poste ici

    Sur Linux, le programme m'affiche une fenetre avec un fond gris (ou une fenetre qui semble vide si vous préférez)

    D'après quelques tests que j'ai fait:
    -L'openGL fonctionne sur mon linux (j'arrive à lancer Blender et le programme de test de ATI : fgl_glxgears)
    -La fonction OnIdle est bien éxécuté en permanence (voir code en-dessous)
    -Dans la fonction OnSize : height et width contiennent les bonnes valeurs.

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    #include "main.h"
     
    myFrameMain::myFrameMain() : wxFrame(NULL, -1, "Hello GL World", wxPoint(-1, -1), wxSize(1024,790), wxDEFAULT_FRAME_STYLE)
     
    {
    	glCanvas = new myGLCanvas(this);
    	wxSizer *sizer = new wxBoxSizer(wxHORIZONTAL);
    	sizer->Add(glCanvas, 1, wxALL|wxEXPAND, 0);
     
    	this->SetSizer(sizer);
    	this->SetAutoLayout(true);
    	this->Layout();
    	this->ShowFullScreen(false);
    }
     
    myGLCanvas::myGLCanvas(wxWindow *parent) : wxGLCanvas(parent, -1, wxPoint(0,0))
    {
    	this->parent=(wxFrame*)parent;
    	fullScreen=false;
     
    	glShadeModel(GL_SMOOTH);
    	glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    	glClearDepth(1.0f);
    	glEnable(GL_DEPTH_TEST);
    	glDepthFunc(GL_LEQUAL);
    	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
     
    	this->SetCurrent();
    }
     
    void myGLCanvas::onIdle(wxIdleEvent &event)
    {
    	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    	glLoadIdentity();
    	glTranslatef(0.0f,0.0f,-6.0f);
     
    	GLubyte indices[]={
    		4, 5, 6, 7, //front
    		1, 2, 6, 5, //right
    		0, 1, 5, 4, //bottom
    		0, 3, 2, 1, //back
    		0, 4, 7, 3, //left
    		2, 3, 7, 6, //top		
    	};
     
    	const GLfloat sommets[]={
    		-1.0, -1.0, -1.0,	//0
    		1.0, -1.0, -1.0, 	//1
    		1.0, 1.0, -1.0, 	//2
    		-1.0, 1.0, -1.0, 	//3
    		-1.0, -1.0, 1.0,	//4
    		1.0, -1.0, 1.0,		//5
    		1.0, 1.0, 1.0,		//6
    		-1.0, 1.0, 1.0,		//7		
    	};
     
    	glEnableClientState(GL_VERTEX_ARRAY);
    	glVertexPointer(3, GL_FLOAT, 0, sommets);
     
    	glEnable(GL_CULL_FACE);
    	glCullFace(GL_BACK);
     
    	glColor3f(0.0f,1.0f,0.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[0]);
    	glColor3f(1.0f,0.5f,0.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[4]);
    	glColor3f(1.0f,0.0f,0.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[8]);
    	glColor3f(1.0f,1.0f,0.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[12]);
    	glColor3f(0.0f,0.0f,1.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[16]);
    	glColor3f(1.0f,0.0f,1.0f);
    	glDrawElements(GL_QUADS, 4, GL_UNSIGNED_BYTE, &indices[20]);
     
    	glFlush();
    	this->SwapBuffers();
    	event.RequestMore();
    }
     
    void myGLCanvas::onKey(wxKeyEvent &event)
    {
    	int key = event.GetKeyCode();
     
    	if(key==WXK_ESCAPE)
    	{
    		parent->Destroy();
    	}else if (key==WXK_F1)
    	{
    		fullScreen=!fullScreen;
    		parent->ShowFullScreen(fullScreen);
    	}
    }
     
    void myGLCanvas::onSize(wxSizeEvent &event)
    {
    	this->Layout();
    	this->GetSize(&width, &height);
    	glViewport(0, 0, width, height);
     
    	glMatrixMode(GL_PROJECTION);	
    	glLoadIdentity();
     
    	gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f);
    	glMatrixMode(GL_MODELVIEW);
    }
     
    BEGIN_EVENT_TABLE(myGLCanvas, wxGLCanvas)
    	EVT_KEY_DOWN(myGLCanvas::onKey)
    	EVT_IDLE(myGLCanvas::onIdle)
    	EVT_SIZE(myGLCanvas::onSize)
    END_EVENT_TABLE()
     
    IMPLEMENT_APP(Ini);
     
    bool Ini::OnInit()
    {
    	myFrameMain *frame = new myFrameMain();
    	frame->Show(TRUE);
     
    	return true;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #ifndef WXRAD_MAIN_H
    #define WXRAD_MAIN_H
     
    #include <math.h>
    #include <stdio.h>
     
    #include <wx/wx.h>
    #include <wx/glcanvas.h>
     
    class Ini : public wxApp
    {
    	public:
    		virtual bool OnInit();
    };
     
    class myGLCanvas : public wxGLCanvas
    {
    	public:
    		myGLCanvas(wxWindow *);
    		void onIdle(wxIdleEvent &);
    		void onKey(wxKeyEvent &);
    		void onSize(wxSizeEvent &);
    	private:
    		bool fullScreen;
    		wxFrame *parent;
    		int width, height;
    	protected:
    		DECLARE_EVENT_TABLE()
    };
     
    class myFrameMain : public wxFrame
    {
    	public:
    		myFrameMain();
    	private:
    		myGLCanvas *glCanvas;
    };
     
    DECLARE_APP(Ini);
     
    #endif
    Merci...

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Re,

    J'ai rajouté "this->SetCurrent();" au début de la fonction "onIdle" et j'ai eu le droit à un écran noir

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Re 2,

    J'ai trouvé quelques différences entre Windows et Linux dans l'ordre d'éxécution des fonctions lors du démarrage du programme:

    Sur Windows:
    1) Il éxécute "glCanvas = new myGLCanvas(this);"
    2) Ensuite il exécute le constructeur de myGLCanvas
    3) Il éxecute la fonction onSize
    4) Il achève l'éxécution du constructeur myFrameMain
    5) Et pour finir il éxécute la fonction onIdle

    Sur Linux:
    1) Il éxécute "glCanvas = new myGLCanvas(this);"
    2) Ensuite il exécute le constructeur de myGLCanvas
    3) Il achève l'éxécution du constructeur myFrameMain
    4) Il éxecute la fonction onSize
    5) Il éxecute à nouveau la fonction onSize !
    6) Et pour finir il éxécute la fonction onIdle

    - Si je modifie la taille de la fenetre mon cube s'affiche correctement sur Linux.
    - Si j'ajoute se code au début de onIdle, la cube s'affiche :
    "wxSizeEvent var;
    this->onSize(var);" (mais ce n'est pas très propre je trouve)

    Pourquoi tant de différence et comment faire un programme compatible Windows/Linux ?

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Pourquoi tant de différence et comment faire un programme compatible Windows/Linux ?
    Les diffrences s'expliquent par plusieurs fait:
    - Les architecture des OS n'est pas la même
    - Les versions de wxWidgets ne sont pas maintenus par les mêmes personnes, par conséquent l'ordre des opérations n'est peut être pas le même.

    Sous mac, j'ai les mêmes problèmes (ça ne sont pas des problèmes mais des fonctionnalités différentes, le tout est de le savoir).

    Il faut absolument que tu précises SetCurrent au début de ta fonction d'affichage (c'est décrit dans la doc et sur le wiki) Sinon, tu auras des problèmes.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Merci de ta réponse.

    Oui j'ai bien rajouter setCurrent() au début de ma fonction d'affichage mais je ne voie toujours pas mon cube tourner...

    Pour voir mon cube tourner je doit soit changer la taille de la fenetre ou mettre ceci dans ma fonction d'affichage (onIdle):
    wxSizeEvent var;
    this->onSize(var);

    Pas très beau et pas performant dutout : quelqu'un aurait une meilleur solution ?

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Et bien , en fait, il faut que tu crées et que tu places ta fenêtre de vue dès le début de ta fonction d'affichage. (en fait, c'est ton appel à onSize ), car sinon, ta fenêtre n'est pas affichée comme il faut, elle n'a pas de paramètre d'affichage.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    heu...j'ai pas trop compris !

    Pourrais-tu réexpliquer en peu plus en détail, stp ? Et qu'entend-tu par "fenêtre de vue" ? Le wxFrame de mon programme ?

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Pourrais-tu réexpliquer en peu plus en détail, stp ?
    Que veux tu savoir de plus ? Ou que n'as-tu pas compris ?

    Et qu'entend-tu par "fenêtre de vue" ?
    C'est le paramètrage de ta fenêtre OpenGL , paramètrage de la caméra, gestion des projections..., en gros toutes les fonctions de GL_PROJECTION.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Si j'ai bien compris (ce que je doute) : je doit mettre le code suivant dans ma fonction onIdle (la fonction qui affiche la scène) ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45.0f, (GLfloat)width/(GLfloat)height, 0.1f, 100.0f);
    glMatrixMode(GL_MODELVIEW);
    Bon ok ça va fonctionner mais question performance c'est pas le top...le code va être appellé à chaque fois que la scene se redessine (c'est à dire plusieur fois par seconde) ....alors que sur Windows le code est appelé une fois au démarrage du programme et à chaque fois que l'ont redimensionne la fenêtre !

  10. #10
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Tu peux peut être ruser en utilisant une variable intermédiaire pour savoir si tu dois appeler cette fonction ou pas. Ca te coutera un test.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Bon bin je vais faire comme ça alors...mais bon pas très cool qu'une condition soit vérifié plus de 100 fois par seconde alors que sur Windows j'arrive à eviter ça !

    Si quelqu'un à une meilleur solution : qu'il n'ésite pas

    Merci PRomu@ld pour toutes tes réponses.

  12. #12
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Bon bin je vais faire comme ça alors...mais bon pas très cool qu'une condition soit vérifié plus de 100 fois par seconde alors que sur Windows j'arrive à eviter ça !
    C'est pas très grave, le coût de la condition est relativement faible par rapport au coût du redessin de la fenêtre.

    De plus, as tu mesuré l'impact de ceci sous windows ?

    Est ce que tu pourrais tester d'afficher ton application sous windows, la faire passer en arrière plan (sans redimenssionnement) et la remettre à l'écran (histoire de voir ce qui se passe, pour voir si tout est bien affiché). Et ceci sans effectuer la modif avec le test (bref comme tout était avant).

    Je n'ai pas windows sous la main (et pas avant un petit moment), et j'aimerai voir ce que ça donne. (si la fenêtre garde les paramètres de projection ou pas, car s'il ne les garde pas, la solution de la condition me parait presque obligée)

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    216
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 216
    Points : 74
    Points
    74
    Par défaut
    Oui c'est vrai que le condition ne doit pas me faire perdre beaucoup de fps...

    Je vien de tester sur windows ce que tu m'a démandé et mon ancien programme fonctionne très bien !

  14. #14
    Membre éclairé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    948
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 948
    Points : 719
    Points
    719
    Par défaut
    je suis nul en C, mais t'a pas des balises du genre (juste du genre )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #IFlinux
    ...
    ...
    ...
    ...
    #endIF
    comme ca, a la compilation, ca changerait la presence ou pas du test, non?

  15. #15
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Oui, c'est de la compilation conditionnelle, ça offre la plus grande souplesse et les plus grandes performances, mais ça nécessite de penser à tous les cas de figure (au moins être sur que le cas par défaut fonctionne partout).

    Néanmoins, ça surcharge assez lourdement le code, et il faudrait vérifier le rapport cout/performance de cette solution. (le coup d'un test est de quelques cycles d'horlage en fait ...)

    Pour la construction c'est comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #ifdef _LINUX_
    /* code a exécuter si tu es sous linux. */
    #endif
    A la compilation, il suffit de rajouter ceci : -D_LINUX_ si tu es sous linux et le tour est joué. si tu n'es pas sous linux, tu ne rajoute rien et le code du dessus ne sera pas rajouté.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Creer une fenetre opengl linux sans lib externe
    Par maitrelame2 dans le forum OpenGL
    Réponses: 1
    Dernier message: 31/12/2007, 14h37
  2. installer wxWidget sur Linux
    Par [Hugo] dans le forum Linux
    Réponses: 7
    Dernier message: 27/10/2007, 11h58
  3. wxWidget + OpenGL
    Par shenron666 dans le forum OpenGL
    Réponses: 2
    Dernier message: 23/02/2006, 17h40
  4. ATI+OPENGL+LINUX = :evilred:
    Par vincho dans le forum OpenGL
    Réponses: 3
    Dernier message: 31/01/2006, 15h09
  5. Commencer l'openGL??? (Linux)
    Par kacedda dans le forum OpenGL
    Réponses: 7
    Dernier message: 03/06/2005, 09h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo