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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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

  8. #8
    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];
    
        }

+ 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