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 :

[C++][Qt] Problème opengl avec glBindTexture


Sujet :

OpenGL

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 46
    Par défaut [C++][Qt] Problème opengl avec glBindTexture
    Bonjour à tous,

    Voilà j'ai un petit(voire gros ...) avec l'applications des textures sur openGL

    En fait, je recode un programme que j'avais fait, mais en utilisant une nouvelle structure de code afin d'encapsuler au maximum.
    J'utilisait de l'opengl dans une interface QT.
    Mon problème et que mon application s'ARRETTE au premier appel de la méthode Paint de opengl.
    Elle s'arrete exactement à l'appel de la fonction 'glBindTexture'!
    J'ai donc essayé de l'encadrer d'un try-catch, mais la aussi je ne detecte rien ni dans le catch, ni après le try...
    Si j'enlève cet fonction, tout marche, mais bien sur, il n'y a plus de texture.

    Je suis désolé, mais je ne pourrai pas vous donner les sources car il ya une trentaine de fichiers.. et surtout, je ne suis pas sur mon ordi! Mais je peux vous les faires passer ulterieurement si vous le désirez.

    J'aimerais juste savoir si par hasard quelqu'un connaitrai ce genre de prob, et quelles en sont les causes.. il est fort possible que QT y soit pour quelque chose..

    Precision sur la structure de mon prog; ma classe contenant mon widget(FXPOpenglWidget) opengl appelle à l'évenement paint la classe controle parente(FXPOpenglControle) qui elle appelle la méthode draw() de ma classe carte(FXPOpenglCarte). Ces appels fonctionnent parfaitement car si je fais dessiner un simple carré ça marche...

    merci d'avance.

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 577
    Par défaut
    tu as vérifié ton paramètre passé à glBindTexture ?
    tu as un glGenTextures appelé quelque part qui fonctionne ?
    et un glTexImage2D qui paramètre cette texture ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 46
    Par défaut
    Je vous fais parvenir le bout de code concerné, jé viré toute les initialisations de variable et les calculs pour que ce soit plus court..
    Tous ce que tu m'a di shenron666 je pense que je l'ai fais...

    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
    #include "GL\glu.h"
     
    #include "FXPOpenglCarte.h"
    #include "FXPPpmImage\FXPPpmImage.h"
     
    void FXPOpenglCarte::loadTextures(void){
        char n[4],uri[70];
        for (int i=0; i<N_MAX_IMG; i++)
        {
            sprintf(n,"%d",(i+1));
            strcpy(uri, URI_BASE);
            strcat(uri, n);
            strcat(uri, ".ppm");
            images[i] = new FXPPpmImage(uri);
        }
     
     
        glGenTextures(N_MAX_IMG+1, texName); //2
     
        for (int i=0; i<N_MAX_IMG; i++){
            glBindTexture(GL_TEXTURE_2D, texName[i]);
            glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
            gluBuild2DMipmaps(GL_TEXTURE_2D, 3, images[i]->sizeX, images[i]->sizeY,
                  GL_RGB, GL_UNSIGNED_BYTE, images[i]->data);
            glEnable(GL_TEXTURE_2D);
            glShadeModel(GL_FLAT);
            delete images[i];
     
        }
    }
     
    void FXPOpenglCarte::draw(GLfloat x, GLfloat y, GLfloat z){
        /**************************
            .... initialisation des variables ....
        **************************/
         for (i=0; i<N_MAX_IMG; i++){
     
            /*******************************
                .... Calcul des positions variables diverses ...
            ********************************/
            //Le Prob est ici
            //Si on enleve ce glBindTexture, tout fonctionne mais sans texture
            glBindTexture(GL_TEXTURE_2D, this->texName[i]);
            glBegin(GL_QUADS);
            glTexCoord2f(1.0, 0.0); glVertex2d(cxd, cyh);  //HD
            glTexCoord2f(0.0, 0.0); glVertex2d(cxg, cyh); //HG
            glTexCoord2f(0.0, 1.0); glVertex2d(cxg, cyb); //BG
            glTexCoord2f(1.0, 1.0); glVertex2d(cxd, cyb);  //BD
            glEnd();
     
           /***************************
            .. et on continue des calculs ici
            ****************************/
        }//fin du for
    }
     
    FXPOpenglCarte::FXPOpenglCarte(FXPOpenglControle* ctrl_parent):FXPOpenglElement(ctrl_parent){
        this->loadTextures();
    }
    FXPOpenglCarte::~FXPOpenglCarte(){
        for(int i=0;i<N_MAX_IMG;i++){
            delete images[i];
        }
    }
    Petit résumé sur l'utilité de ce code:
    Ce code charge(methode loadTextures())168images de 256x256 pour afficher(methode draw()) une image fianle de 3370x2877px.

    voilà.

  4. #4
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Déjà, je mettrais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glEnable(GL_TEXTURE_2D);
    avant le chargement des textures... Mais cela ne devrait pas faire
    planter ton programme.

    Est-ce qu'on peut voir la déclaration et l'initialisation de tes
    tableaux images et texName.

    Et je suppose que N_MAX_IMG vaut 168

    Sinon je ne vois pas d'erreur grossière...

    Jc

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu peux faire un programme minimal avec cette erreur ? Ca m'étonnerait que Qt ait un souci avec ça, il y a un example dans Qt4 avec des textures et ça marche - essaie-le une fois, enfin, essaie-les -. Normalement, Qt ne doit s'occuper que de créer l'environnement dont OpenGL a besoin et ensuite c'est ce dernier qui dessine, sans que Qt ait son mot à dire. Du moins normalement.

  6. #6
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 46
    Par défaut
    Bien sur:
    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
    #ifndef __FXPOPENGLCARTE
    #define __FXPOPENGLCARTE
     
    #include "FXPOpenglElement.h"
     
    #define URI_BASE "IGN_DATA_41\\tx_74(512)_256x256\\FORAGE BLOIS_75_2-1_"
    #define N_MAX_IMG 168
    #define D_IMG 256
    #define D_MAX_X_CARTE 3370
    #define D_MAX_Y_CARTE 2877
    #define WIN_R 1
    class FXPPpmImage;
    class FXPOpenglCarte:public FXPOpenglElement{
        private :
            FXPPpmImage *images[N_MAX_IMG+1];
            GLuint texName[N_MAX_IMG+1];
     
            void loadTextures(void);
     
        public :
            void draw(GLfloat x=0, GLfloat y=0, GLfloat z=0);
            FXPOpenglCarte(FXPOpenglControle* ctrl_parent=0);
            virtual ~FXPOpenglCarte();
    };
     
    #endif
    Bon d'accord mes #define ne font pas très pro mé il datent de l'ancienne version, il sont là que pour les test..

    Le problème c'est surtout que l'ancienne version marche avec le meme code!, seule difference dans l'ancienne version, tout se fesai directement dans lévenement paint de QT. Maintenant, l'évenement est renvoyé à un Controleur qui appelle d'autres classes suivant ce qu'il y a a afficher.
    l'appel dans le controleur se resume à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void FXPOpenglControle::draw(void){
        //dessin de la carte
        carte->draw();
        //Et autre appel d'objets du genre....
     
    }
    Voilà

  7. #7
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 46
    Par défaut
    Citation Envoyé par fearyourself
    Déjà, je mettrais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glEnable(GL_TEXTURE_2D);
    Juste pour dire que je l'ai mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    for (int i=0; i<N_MAX_IMG; i++){
            glBindTexture(GL_TEXTURE_2D, texName[i]);
            glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
            gluBuild2DMipmaps(GL_TEXTURE_2D, 3, images[i]->sizeX, images[i]->sizeY,
                  GL_RGB, GL_UNSIGNED_BYTE, images[i]->data);
            glEnable(GL_TEXTURE_2D);
            glShadeModel(GL_FLAT);
            delete images[i];
    
        }

  8. #8
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Je vois deux problèmes potentiels, un qui n'a rien avoir pour le moment:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        for(int i=0;i<N_MAX_IMG;i++){
            delete images[i];
        }
    Or tu les as déjà désalloué. D'ailleurs, je ne vois pas l'intérêt de les avoir
    mis dans la classe vu que tu les désalloues...

    Ensuite, tu ne vérifies pas que ton chargement se fait bien. Il n'y a aucun test après
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    images[i] = new FXPPpmImage(uri);
    En principe si cela plante, le constructeur renverrai quoi?

    Parce que vu le double delete qu'il y a après, est-ce possible que tes images soit NULL?

    Jc

  9. #9
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 46
    Par défaut
    Sniff, ça ne marche toujours pas...

    j'ai viré ma double destruction et j'ai mis un test pour savoir s'il étai null, mais apparement non, et j'ai toujours les mêmes problèmes...

  10. #10
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 46
    Par défaut
    Bon je viens de changer de méthode de test, au lieu de faire un simple test avec un If, jaffiche directement la valeur dans une messagebox et là oh surprise, j'ai 0!!

    Bon donc je pense que il y a vraiment un prob quand à l'initialisation de ce tableau de textures... Je vais me pencher davantage sur ce problème

    Je vais tenter de résoudre ce problème et si sa marche pas, vous inquietez pas, je reviendrai à la charge!

    Merci de votre aide.

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 46
    Par défaut
    Bon, ça m'énerve!!

    En fait après analyse recompilation, analyse, modification, recompilation,....
    Enfin bref on se demerde comme on peux, je me suis apercu que le chargement de l'image se passe très bien, par contre la creation des texture par opengl, j'ai 0 à chaque fois dans mon tableau TexName!
    J'en déduit donc que le fautif est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glGenTextures(N_MAX_IMG+1, this->texName);
    J'ai essayé ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    glGenTextures(N_MAX_IMG+1, &texName[0]);
    et là, oh surprise après compilation, quand j'execute mon appli une première fois, elle ne se referme pas(gros progrès) mais ma carte est sans texture. Puis après je la ferme et je la relance et là elle se referme toute seule, c'est a n'y rien comprendre... et precision mes noms de textures ne se gènère pas non plus avec la 2ème méthode
    Que ce passe-t-il? Pourquoi il ne me génère pas de nom de texture??

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

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 577
    Par défaut
    peut-etre que N_MAX_IMG est une valeur trop importante pour ton système ? (j'en doute mais sait-on jamais ?)

    glGetError devrait pouvoir t'aider à identifier le problème
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  13. #13
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 46
    Par défaut
    Non je pense pas que mon nombre est trop grand, la preuve sa marchais avant..

    Par contre, du coté de glGetError, j'obtient "Opération non Valide" ...
    Et n'importe ou que je mette mon appel de glGetError, j'ai le même message..
    quelqu'un sait a quoi sa signifie? et que dois-je faire????

  14. #14
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Premièrement, pour le glEnable(GL_TEXTURE_2D), j'ai dit de le mettre avant le chargement des images et avant toute opération sur les texture. Je ne suis plus sûr si c'est nécessaire pour le chargement des textures...

    Ensuite:

    Citation Envoyé par quantik-revolution
    Non je pense pas que mon nombre est trop grand, la preuve sa marchais avant..
    Je suis d'accord avec toi mais tu pourrais en afficher que 10 sur tes 168 pour voir...

    et precision mes noms de textures ne se gènère pas non plus avec la 2ème méthode
    Que ce passe-t-il? Pourquoi il ne me génère pas de nom de texture??
    Tu peux être plus précis? Ce que tu pourrais faire est ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            sprintf(n,"%d",(i+1));
            strcpy(uri, URI_BASE);
            strcat(uri, n);
            strcat(uri, ".ppm");
            ìfstream in(uri);
            if(in==NULL)
              {
              std::cerr << "C'est quoi ce ...." << std::endl;
              }
     
            images[i] = new FXPPpmImage(uri);
    pour voir s'il trouve le fichier... Mais je pense que c'est
    un problème de corruption mémoire... Je remarque que le chargement
    se fait appeler dans le constructeur, es-tu sûr d'avoir ouvert la fenêtre
    avant que cet objet soit créé?

    Jc

  15. #15
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Janvier 2006
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2006
    Messages : 46
    Par défaut
    Ayé j'ai trouvé le pourquoi du comment de la chose...

    En fait dans mon controleur, je créais mon objet Opengl, et parès je créais mon object carte avec texture et tout, seul problème, pour une raison que j'ignore, lors de sa création, l'objet opengl ne s'initialise pas dessuite.. du coup a l'init de opengl, j'appelle une fonction du controleur qui va creer ma carte, et la sa marche...

    Merci à tous de vous etres penchés sur mon prob.

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

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 2 574
    Par défaut
    ca ne viendrais pas d'une histoire de thread ?
    par exemple, tu lance la creation de la fenetre, et il te la lance sur un thread séparé ou autre, ce qui fait que ton code continu à s'executer alors que la création de la fenetre n'est pas finie...
    * Il est infiniment plus simple de faire rapidement un code qui marche que de faire un code rapide qui marche
    * pour faciliter les recherches, n'oubliez pas de voter pour les réponses pertinentes
    Mes articles

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

Discussions similaires

  1. OpenGl avec Java: Problème de lourdeur d'exécution
    Par choko83 dans le forum OpenGL
    Réponses: 12
    Dernier message: 13/06/2008, 18h36
  2. Problème avec glBindTexture
    Par Flaie dans le forum OpenGL
    Réponses: 7
    Dernier message: 10/10/2007, 20h48
  3. Textures : problème avec glBindTexture
    Par Xander51 dans le forum OpenGL
    Réponses: 14
    Dernier message: 24/05/2007, 02h52
  4. Réponses: 2
    Dernier message: 11/05/2005, 13h23
  5. Réponses: 5
    Dernier message: 18/03/2005, 20h10

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