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

OpenGL Discussion :

Problème de contexte (il me semble)


Sujet :

OpenGL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 44
    Points
    44
    Par défaut Problème de contexte (il me semble)
    Salut,

    Bon je poste ici parceque je vien juste de détecter un probleme sur mon petit moteur 3D et celle ci m'embète bien et j'espère qu'elle ne m'obligera pas à tout reprendre .....

    Je vais vous donner quelques détails qui paraitrons peut-etre supperflus mais je pense quand même qu'il les faut pour pouvoir cerner le probleme.

    J'ai découver le monde de la 3D l'an dernier pour "m'amuser" et suivant des etude d'info à la FAC les machines fonctionnent là bas sous Linux c'est donc tout naturellement que je me suis tourné vers notre amis OpenGL dont j'ai appris l'utilisation rudimentaire sur le tres bon site : http://www.linuxgraphic.org/

    J'utilisais alors la combinaison avec la librairie de fenètrage GLUT san trop me poser de quesions sur celle-ci et puis l'été venant je me suis décidé à me lancer dans la création d'un petit moteur 3D purement OpenGl (donc non multi api mais ce n'est pas le débat j'étais trop peu expérimenté pour imaginer cela ) Et arrivé à la rentrée il tournait je trouvais assez correctement
    J'ai donc décidé de le proposer pour participer au projet de semestre du groupe, il a donc fallu se débarasser de GLUT puisque le systeme de fenètrage utilisé est QT je me suis donc di que j'allais banir de mon moteur toutes commandes propres à un quelconque GUI de fenètrage et de n'utiliser que des fonctions opengl "native" si j'ose dire ....

    Le moteur est donc maintenant tout-a-fait fonctionnel et toutrne tres bien sur le projet mais il se trouve que hier j'ai voulu le réintégrer à un fenètrage GLUT et j'ai un souci un peu bizard ......

    Mon moteur se présente sous la forme d'une dll et comporte évidemment plusieurs classes :p utilisant les extension VBO j'ai créé les variables externes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // VBO Extension Function Pointers
    PFNGLGENBUFFERSARBPROC DLLIMPORT glGenBuffersARB = NULL;	// VBO Name Generation Procedure
    PFNGLBINDBUFFERARBPROC DLLIMPORT glBindBufferARB = NULL;	// VBO Bind Procedure
    PFNGLBUFFERDATAARBPROC DLLIMPORT glBufferDataARB = NULL;	// VBO Data Loading Procedure
    PFNGLDELETEBUFFERSARBPROC DLLIMPORT glDeleteBuffersARB = NULL; // VBO Deletion Procedure
    Dans une des classes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // VBO Extension Function Pointers
    extern PFNGLGENBUFFERSARBPROC glGenBuffersARB;					// VBO Name Generation Procedure
    extern PFNGLBINDBUFFERARBPROC glBindBufferARB;					// VBO Bind Procedure
    extern PFNGLBUFFERDATAARBPROC glBufferDataARB;					// VBO Data Loading Procedure
    extern PFNGLDELETEBUFFERSARBPROC glDeleteBuffersARB;			// VBO Deletion Procedure
    Dans toutes les autres

    et enfin une initialisation du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) wglGetProcAddress("glGenBuffersARB");
    	glBindBufferARB = (PFNGLBINDBUFFERARBPROC) wglGetProcAddress("glBindBufferARB");
    	glBufferDataARB = (PFNGLBUFFERDATAARBPROC) wglGetProcAddress("glBufferDataARB");
    	glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) wglGetProcAddress("glDeleteBuffersARB");
    au premier appel qui va concerner une de ces fonction

    et bizarement lors de l'utilisation avec glut je me suis retrouvé avec un segfault du au fait que l'un de ces pointeur de fonction était NULL j'ai donc cru qu'il n'étais pas initialisé et qu'il sufissait de le faire ....

    J'ai donc créé une methode initPointersARB qui execute le code ci dessus et je l'apelle si un des pointeur est null

    La phase de création passe donc correctement et mon objet se crée et s'affiche.

    Mais lors de la fermeture, le destructeur bug à nouveau mais pas parceque le pointeur de fonction est null mais parcequ'aparemment les numeros de buffers sont incorrects ....... bizard puisque l'objet a été affiché pendant toute la durée d'execution ^o)

    Voila donc si vous avez une idée d'ou peut venir ce souci ....j'ai pensé qu'il pouvais y avoir un lien avec ke contexte opengl .....je ne sais pas

    J'attends vos suggestions avec impatiences !!!! .. et je continue à faire tourner mon moteur avec QT en attendant :p

    Merci d'avance
    @+
    Seb

  2. #2
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 531
    Points : 5 208
    Points
    5 208
    Par défaut
    Citation Envoyé par Sébastien P
    La phase de création passe donc correctement et mon objet se crée et s'affiche.

    Mais lors de la fermeture, le destructeur bug à nouveau mais pas parceque le pointeur de fonction est null mais parcequ'aparemment les numeros de buffers sont incorrects ....... bizard puisque l'objet a été affiché pendant toute la durée d'execution ^o)

    Voila donc si vous avez une idée d'ou peut venir ce souci ....j'ai pensé qu'il pouvais y avoir un lien avec ke contexte opengl .....je ne sais pas

    J'attends vos suggestions avec impatiences !!!! .. et je continue à faire tourner mon moteur avec QT en attendant :p

    Merci d'avance
    @+
    Seb
    tu peux nous détailler ce que fait ton "destructeur" ?
    globalement que fais tu à la fermeture ?
    tu peux poster du code si tu veux, surtout la partie où ça plante

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 44
    Points
    44
    Par défaut
    En fait oui j'hésitais à le faire mais bon effectivement ca sera surement plus clair pour vous :

    Donc en fait je fournis dans mon moteur la possibilité de créer une "matrice" donc un terrain defformable quoi ....

    donc j'ai créé ma classe matrice qui devrai hériter d'objet 3D d'ailleur mais bon pour le moment la question n'est pas la :p

    donc ma classe contien les parametres suivants :

    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
    class Matrice {
    	private:
                // objet 3D proprement dit
                int		    m_nVertexCount;					// Nombre de sommets
    	    CVert*		m_pVertices;					// Bonnees sommets
    	    CTexCoord*	m_pTexCoords;					// Coordonnees de textures
    	    Color*    m_pColor;                           // Couleur de sommets
     
    	    unsigned int	m_nTextureId;				// ID de texture
     
    	    // Vertex Buffer Object Names
    	    unsigned int	m_nVBOVertices;				// Vertex VBO Name
    	    unsigned int	m_nVBOTexCoords;			// Texture Coordinate VBO Name
    	    unsigned int	m_nVBOColor;						// Couleur VBO Name
     
    	    Position P;            // position d'origine
    	    Couleur C;             // Couleur
    	    Texture* T;            // texture
     
    	    BMPImg *heightmap;     // texture de niveau
    	    GLdouble largeurM, longueurM; // longueur et largeur
    	    GLuint reso;       // découpage
                float *hauteurs; // le tableau des hauteurs
     
                GLdouble proportion; // la proportion de heightmap
    Déja vous remarquerez les vieux reste avec les GLdouble/GLint et les float qui se mélangent mais la femme de ménage n'est pas encore passé par la

    et ensuite la creation :

    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
    .. initialisation des tableaux...
       	// Generate And Bind The Vertex Buffer
    	glGenBuffersARB( 1, &m_nVBOVertices );					// Get A Valid Name
    	glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOVertices ); // Bind The Buffer
    	// Load The Data
    	glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*3*sizeof(float), m_pVertices, GL_STATIC_DRAW_ARB );
     
     
            /*************charge le buffer Couleur*******************/
       	// Generate And Bind The Color Buffer
    	glGenBuffersARB( 1, &m_nVBOColor );					// Get A Valid Name
    	glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOColor ); // Bind The Buffer
    	// Load The Data
    	glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*4*sizeof(float), m_pColor, GL_DYNAMIC_DRAW_ARB );
     
     
    	// Generate And Bind The Texture Coordinate Buffer
    	glGenBuffersARB( 1, &m_nVBOTexCoords );							// Get A Valid Name
    	glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOTexCoords );	    // Bind The Buffer
    	// Load The Data
    	glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*2*sizeof(float), m_pTexCoords, GL_STATIC_DRAW_ARB );
     
    	// Our Copy Of The Data Is No Longer Necessary, It Is Safe In The Graphics Card
    	delete [] m_pTexCoords; m_pTexCoords = NULL;
    Parceque pour le moment je ne réutilise pas les coordonnees de textures :p

    Enfin mon destructeur :

    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
    Matrice::~Matrice() {
     
        if( hauteurs != NULL )
        delete[] hauteurs;
     
    	if(heightmap!=NULL)
    	{delete heightmap;}
     
    	heightmap = NULL;
     
    	T=NULL;
    	largeurM = 0;
        longueurM = 0;
     
        if(m_pVertices != NULL)
    	delete [] m_pVertices;
        m_pVertices = NULL;
     
        if(m_pColor != NULL)
      	delete [] m_pColor;
        m_pColor = NULL;
     
        unsigned int nBuffers[3] = { m_nVBOVertices, m_nVBOTexCoords, m_nVBOColor };
     
        glDeleteBuffersARB( 3, nBuffers );						// Free The Memory
    }
    La encore le code est loin d'etre tres propre masi bon il l'est sufisemment je pense pour que l'erreure ne vienne aps de ca

  4. #4
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 531
    Points : 5 208
    Points
    5 208
    Par défaut
    heightmap ne serait pas un tableau par hazard ?
    auquel cas risque de plantage car appel à la mauvaise forme de delete, corriger par :
    je te conseillerai également de faire appel à glDeleteBuffersARB avant de supprimer tes tableaux
    même si je pense que ça ne crée pas de problème (à tester)

    si ça ne suffit pas, tu sais où ça plante précisément avec un debugger ?

    ps : tu n'est pas obligé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(pointeur != NULL)
       delete pointeur;
    pointeur = NULL;
    tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    delete pointeur;
    pointeur = NULL;

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 44
    Points
    44
    Par défaut
    merci de ton aide mais je vais préciser encore un peu

    pour le delete heightmap en fait je ne met pas les crochet parceque c'est un unique objet (manque de précision dans mes explications je sais )

    En fait je crois vraiment que le probleme vien de la commande : glDeleteBuffersARB car lorseuq je la met en commentaire je n'ai plus mon segfault

    et pour le fait de détruire les tableaux d'abbord j'y ai pensé mais avant je les détruisait directement apres leur passage à opengl puisque je ne les réutilisait pas et je n'ai jamais eu aucun probleme.... ce qui parait normal puisque les données sont censé etre copiée par le
    glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*3*sizeof(float), m_pVertices, GL_STATIC_DRAW_ARB );
    non ??

    voila merci de ta réponse et j'espère que vous pourrez m'aider !!!
    @+
    Seb

  6. #6
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 531
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 531
    Points : 5 208
    Points
    5 208
    Par défaut
    ton destructeur est appelé avant ou après la destruction de la fenêtre opengl ?

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 44
    Points
    44
    Par défaut
    Ahhh bonne question ..... en fait peut-etre bien apres !!!!! puisque j'appelle glutMainLoop(); mais que ma dll fait ses destructions au moment ou elle finit sa vie .... je vais essayer de créer une methode de sortie propre !! je vous tien au courant !

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Points : 44
    Points
    44
    Par défaut
    C'était exactement cela !!!! :o Respect et robustesse !!!
    donc je n'ai plus de problemes si je définit une touche pour quitter qui termine l'api sinon il faudrais que je puisse récupérer l'evennement de fermeture de glut .... Mais ca ne presse pas !!!!

    Merci encore
    Seb

  9. #9
    Rédacteur
    Avatar de bafman
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    2 574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Points : 5 323
    Points
    5 323
    Par défaut
    problème classique : toute création et destruction d'objet OpenGL doivent être faites au cours de la vie d'un context (donc d'une fenetre)...

Discussions similaires

  1. Réponses: 0
    Dernier message: 30/04/2008, 11h23
  2. [EJB3] [Débutant] Problème de Context.lookup
    Par likenoother dans le forum Java EE
    Réponses: 1
    Dernier message: 07/05/2007, 19h34
  3. Problème de contexte
    Par petozak dans le forum Servlets/JSP
    Réponses: 6
    Dernier message: 14/08/2006, 11h52
  4. [Débutant] problème nextFrame (contexte?)
    Par Lethal dans le forum Flash
    Réponses: 1
    Dernier message: 05/06/2006, 21h58
  5. sql server probléme SSPI context
    Par samsih dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 17/12/2005, 12h57

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