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 :
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 : 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);
Code dans le fichier Tesselation.cpp
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 : 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;
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.
Rendu avec la boucle for :
(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.
Partager