Bonjour,
Je travaille actuellement a la modelisation d'un terrain en OpenGl, il s'agit plus exactement d'un programme chargeant un image en niveau de gris de type "heighmap" ou je viens lire des données topographiques pour ensuite les representer sous forme de triangles (bref, rien de tres nouveau)
Cependant, j'ai comme contrainte d'afficher un nombre important de triangles (un minimum de 250 000 triangles pouvant aller jusqu'a 8 millions)
Pour le moment, decouvrant completement l'openGL, j'ai fait un truc assez affreux a base de boucles for et de glbegin(GL_TRIANGLES) et glEnd();
Voila pour le moment a quoi ressemble ma création de terrain :
(P1,P2,P3,P4 sont des points en x,y et z)
(hauteur(i,j) renvoie la hauteur du point i,j)
Ca marche, mais j'arrive tres vite a la limite de ma machine (Core2 6420, 2Go de ram, et une GeForce 8800GTX (pour passer tout ca sur Cuda plus tard) )
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 glNewList(terrain,GL_COMPILE); for (i=0;i<nbDivX;i++) for (j=0;j<nbDivY;j++) { P1[0]=i+1; P1[1]=j+1; P1[2]=hauteur(i+1,j+1); P2[0]=i; P2[1]=j+1; P2[2]=hauteur(i,j+1); P3[0]=i+1; P3[1]=j ; P3[2]=hauteur(i+1,j); P4[0]=i; P4[1]=j; P4[2]=hauteur(i,j); glBegin(GL_TRIANGLE_STRIP); glEdgeFlag(true); glTexCoord2f( ((float) (j+1))/nbDivY, ((float) (i+1))/nbDivX); glVertex3fv(P1); glTexCoord2f( ((float) (j+1))/nbDivY, ((float) i)/nbDivX); glVertex3fv(P2); glTexCoord2f( ((float) j)/nbDivY, ((float) i+1)/nbDivX); glVertex3fv(P3); glTexCoord2f( ((float) j)/nbDivY, ((float) i)/nbDivX); glVertex3fv(P4); glEnd(); } glEndList()
En regardant sur le net, les forums, etc j'ai donc voulu partir sur l'utilisation de Vertex Buffer Object, qui m'a semblé etre le plus performant actuellement pour l'utilisation que je veux en faire.
Lecture de docs, tutos, ... m'ont permis de comprendre le fonctionnement des VBO et de realiser un exemple (tres) simple pour afficher un pauvre carré
Et voila ou j'en suis, je n'arrive pas a passer de cet exemple simple a mon generateur de terrain, plus exactement, mon probleme se situe au niveau du stockage de mes vertex.
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 int vertexCount = 4; GLsizeiptr terrainSize = vertexCount * 2 * sizeof(GLfloat); GLfloat terrainData[] = { -0.5f,-0.5f, 0.5f,-0.5f, 0.5f, 0.5f, -0.5f,0.5f }; GLuint vboId; glGenBuffers(1, &vboId); glBindBuffer(GL_ARRAY_BUFFER, vboId); glBufferData(GL_ARRAY_BUFFER, terrainSize, terrainData, GL_STREAM_DRAW); glVertexPointer(2, GL_FLOAT, 0, 0); glEnableClientState(GL_VERTEX_ARRAY); glDrawArrays(GL_QUADS, 0, vertexCount); glDisableClientState(GL_VERTEX_ARRAY);
Je ne peux pas les stocker dans un tableau de float, j'ai un stack overflow. J'ai essayé des choses comme les glMapBuffer, mais je n'arrive pas a grand chose.
Auriez vous des conseils, des pistes voir meme des solutionspour resoudre ce petit soucis ?
Merci d'avoir pris le temps de me lire
Vincent
Partager