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 :

glNewList et boucle


Sujet :

OpenGL

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut glNewList et boucle
    Bonjour à tous,

    Je viens en ce jour vers vous car je rencontre un petit problème avec le glNewList(). J'explique mon problème.
    J'ai une application où je crée, par l'intermédiaire de tessellations, l'intersection entre un quadrillage et une surface quelconque. Chaque carré du quadrillage dispose d'une texture parmi une liste de plusieurs textures ce qui fait que je dois faire une tessellation pour chaque petit carré du quadrillage (J'espère que c'est compréhensible).

    Commençons par le commencement avec l'appel de mes listes dans mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     Tesselation *t = new Tesselation();
            glEnable(GL_TEXTURE_2D);
            GLuint list = t->Tracer_Sol(PtsS, xmin, xmax, ymin, ymax);
            glBindTexture(GL_TEXTURE_2D, texture[0]);
            glCallList(list);
            glBindTexture(GL_TEXTURE_2D, texture[2]);
            glCallList(list+1);
            glBindTexture(GL_TEXTURE_2D, texture[3]);
            glCallList(list+2);
            glDisable(GL_TEXTURE_2D);
    Pts est un tableau contenant les points de la surface. xmin, xmax, ymin, ymax sont les dimensions du quadrillage qui englobe la surface créée. Ces variables ne sont pas importantes.

    Code dans le fichier Tesselation.cpp
    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
    id = glGenLists(4);  // create a display list
        if(!id) return id;          // failed to create a list, return 0
     
        GLUtesselator *tess = gluNewTess(); // create a tessellator
        if(!tess) return 0;  // failed to create tessellation object, return 0
     
        // register callback functions
        gluTessCallback(tess, GLU_TESS_BEGIN,  (void (__stdcall *)(void))tessBeginCB);
        gluTessCallback(tess, GLU_TESS_END,    (void (__stdcall *)(void))tessEndCB);
        gluTessCallback(tess, GLU_TESS_ERROR,  (void (__stdcall *)(void))tessErrorCB);
        gluTessCallback(tess, GLU_TESS_VERTEX, (void (__stdcall *)(void))tessVertexCB);
        gluTessCallback(tess, GLU_TESS_COMBINE,(void (__stdcall *)(void))tessCombineCB);
     
            glNewList(id, GL_COMPILE); /// NOUVELLE LISTE
            glColor3f(1,1,1);
            gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ABS_GEQ_TWO );
            gluTessBeginPolygon(tess, 0);
     
                gluTessBeginContour(tess);
                    [...]
                gluTessEndContour(tess);
     
            gluTessBeginContour(tess);
                 [...]
            gluTessEndContour(tess);
     
            gluTessEndPolygon(tess);
            glEndList(); /// END DE LA LISTE
     
    glNewList(id + 1, GL_COMPILE); /// NOUVELLE LISTE
     
            [CODE IDENTIQUE]
     
            glEndList(); /// END DE LA LISTE
     
    glNewList(id + 2, GL_COMPILE); /// NOUVELLE LISTE
     
            [CODE IDENTIQUE]
     
            glEndList(); /// END DE LA LISTE
     
            gluDeleteTess(tess);
     
            return id;
    Avec le code ci-dessus je n'ai aucun problème comme le montre l'image qui va suivre mais dès que je mets le tout dans une boucle "for" ça me fait une erreur lors du rendu.

    Code avec la boucle for :
    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
    for(loop = 0; loop < 4; loop++){
            glNewList(id + loop, GL_COMPILE);/// NOUVELLE LISTE
            glColor3f(1,1,1);
            gluTessProperty(tess, GLU_TESS_WINDING_RULE, GLU_TESS_WINDING_ABS_GEQ_TWO );
            gluTessBeginPolygon(tess, 0);
                gluTessBeginContour(tess);
                    .....
                gluTessEndContour(tess);
     
     
            gluTessBeginContour(tess);
                        ....
            gluTessEndContour(tess);
     
            gluTessEndPolygon(tess);
            glEndList(); /// END DE LA LISTE
        }

    Rendu sans la boucle for (à la barbare) :
    La création des 3 textures se fait de gauche à droite.

    Nom : 111111111111.png
Affichages : 192
Taille : 11,3 Ko

    Rendu avec la boucle for :

    Nom : 2222222.png
Affichages : 194
Taille : 2,2 Ko
    (Les textures et le contour de ma surface en bleu ne sont pas sur le même plan Z, donc c'est normal le micro décalage)

    Je parie que ça doit être une erreur toute bête mais je n'arrive pas à trouver la solution, c'est pour cela que j'implore votre aide en vous en remerciant par avance

    PS : Pour information je code sous QT 5 / OpenGL.

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Salut,

    C'est vrai que ton problème semble étrange. Je remarque cependant une petite différence entre la version sans boucle est avec: dans la version sans boucle, tu t'arrêtes à id+2 et avec la boucle à id+3. Ce n'est sans doute qu'un problème de copier/coller mais c'est-on jamais.

    Sinon, as-tu récupéré les erreurs renvoyées par OpenGL? Cela t'indiquera plus facilement le problème qui existe.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Oui ce n'est qu'une erreur lors du copier/coller, le résultat reste le même.

    Par l'intermédiaire du glGetError() ? Il m'affiche aucune erreur.

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    J'ai trouvé d'où venait le problème. En fait avant ma première Tesselation dans ma boucle "for", pour créer la case qui allait faire l'intersection avec la surface, je faisais de la façon suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static GLuint quad1[4][3] = {xmin + C, ymin + (loop%nbLigne), 0.1, xmin + C, ymin + (loop%nbLigne) + 1, 0.1 (...)};
    gluTessBeginContour(tess);
            gluTessVertex(tess, quad1[0], quad1[0]);
            gluTessVertex(tess, quad1[1], quad1[1]);
            gluTessVertex(tess, quad1[2], quad1[2]);
            gluTessVertex(tess, quad1[3], quad1[3]);
            gluTessEndContour(tess);
    J'ai donc tout bêtement déclaré le tableau dans le header et maintenant ça fonctionne parfaitement. J'aurais peut-être dû mettre le code en entier au lieu de mettre des pointillés pour les tesselations, mais je ne pensais pas que le problème pouvait venir d'ici.

    Nom : 333.png
Affichages : 139
Taille : 46,3 Ko

    Merci encore pour ton aide.

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

Discussions similaires

  1. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  2. [langage] if et boucle { ..}
    Par kacedda dans le forum Langage
    Réponses: 15
    Dernier message: 28/04/2003, 17h25
  3. [directsound] boucle de traitement de son
    Par gargle dans le forum DirectX
    Réponses: 5
    Dernier message: 24/03/2003, 10h47
  4. Sortir d'un progamme qui boucle ou qui refresh
    Par mikevador02 dans le forum C
    Réponses: 12
    Dernier message: 14/12/2002, 09h38
  5. Réponses: 2
    Dernier message: 29/05/2002, 20h43

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