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 :

Vertex Buffer Object avec de grands maillages


Sujet :

OpenGL

  1. #1
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Par défaut Vertex Buffer Object avec de grands maillages
    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)

    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()
    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) )

    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é

    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);
    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.
    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 solutions pour resoudre ce petit soucis ?

    Merci d'avoir pris le temps de me lire

    Vincent

  2. #2
    Yno
    Yno est déconnecté
    Membre éprouvé Avatar de Yno
    Inscrit en
    Novembre 2005
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 138
    Par défaut
    Salut,
    Citation Envoyé par Vinc35 Voir le message
    Je ne peux pas les stocker dans un tableau de float, j'ai un stack overflow.
    Hum, je n'ai pas encore entendu parler des "limites" de stockage des VBOs, du moins je n'ai jamais eu de problème de ce type, et aucun "get" ne semble correspondre pour trouver cette limite, si elle existe :
    http://www.opengl.org/sdk/docs/man/x...texPointer.xml

    En tout cas, dans ce genre de situation, le quadtree semble tout à fait adapté :
    http://jeux.developpez.com/faq/3d/?p...TIONNEMENT_def

    Je te suggère de scinder ton terrain en plusieurs VBOs de tailles plus modestes, et de les afficher uniquement si besoin est, à l'aide d'une technique de frustum culling :
    http://jeux.developpez.com/faq/3d/?p...ULLING_frustum

  3. #3
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Par défaut
    Merci pour ces pistes, je vais regarder tout ce que tu m'as donné et je vais tacher de m'en sortir


  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Par défaut
    Si tu as un stack overflow, c'est que tu dois avoir déclarer ton tableau statiquement avec une taille trop grande pour que la pile arrive à suivre. Si c'est le cas, utilise plutôt un pointeur et alloue ton tableau dynamiquement avec new/malloc, ton tableau ira dans le tas qui est beaucoup moins limité en terme de place que la pile.

  5. #5
    Membre Expert
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 549
    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 549
    Par défaut
    Citation Envoyé par Vinc35 Voir le message
    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.
    montres nous comment tu crées ton tableau de sommets
    le problème c'est que l'exemple sur lequel tu te base n'est pas bien fait surtout en ce qui concerne l'allocation des données
    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.

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 537
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 537
    Par défaut
    std::vector est ton amis :p

    Pour repasser d'un vector a un tableau, c'est tres simple, &(vector[0]) . En effet, un vector te garantis d'avoir des données en memoire de de la meme facon qu'un tableau.

  7. #7
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    montres nous comment tu crées ton tableau de sommets
    le problème c'est que l'exemple sur lequel tu te base n'est pas bien fait surtout en ce qui concerne l'allocation des données
    Tout a fait, dans les exemples sur lesquels j'ai travaillé pour comprendre le fonctionnement, les tableau de vertex sont declarés de facon statique
    Par exemple (c'est juste un exemple, les variables ne correspondent pas avec mon projet):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float vertices[3*(longueur+1)*(largeur+1)];
    J'avais trouvé cela bizarre et ma premiere idée avait été, effectivement de declarer mon tableau grace a malloc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    float * terrainData;
    	terrainData = (float *) malloc (2*(nbDivX+1)*(nbDivY+1)*sizeof(float));
    Suite a quoi j'avais ecrit une boucle de test pour remplir ce tableau :

    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
    float * terrainData;
    	terrainData= (float *) malloc (2*(nbDivX+1)*(nbDivY+1)*sizeof(float));
    	GLsizeiptr positionSize = 2*(nbDivX+1)*(nbDivY+1)*sizeof(float);
    	int vertexCount = (nbDivX+1)*(nbDivY+1);
     
     
    	int i,j;
    	int k=0;
    	for (i=0;i<nbDivX+1;i++)
    	for (j=0;j<nbDivY+1;j++) {
    	terrainData[k]=i;terrainData[k+1]=j;
    	terrainData[k+2]=i;terrainData[k+3]=j+1;
    	terrainData[k+4]=i+1;terrainData[k+5]=j;
    	terrainData[k+6]=i+1;terrainData[k+7]=j+1;
    	k+=8;
    	}
    Seulement avec ca je tombait sur :

    Exception non gérée à 0x00413b2e dans terrainfilaire.exe*: 0xC0000005: Violation d'accès lors de l'écriture à l'emplacement 0x028c8000.
    au beau milieu de ma boucle (i= 16, j=30,k=6768). Donc je me suis dit que ce n'etait pas la bonne facon de faire et j'ai suivit l'exemple.

    nb : Je sais bien que mon code n'est pas propre, plein de fautes et de "grossieretés" Mais je decouvre tout ca (l'opengl, le C) et c'est pas evident pour moi

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 9
    Par défaut
    D'après ta boucle, la taille de ton tableau devrait être de 8*(nbDivX+1)*(nbDivY+1)*sizeof(float).

  9. #9
    Membre averti
    Inscrit en
    Octobre 2006
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 26
    Par défaut
    Ca marche !

    Avec un tableau alloué avec malloc, mais a la bonne taille

    Merci a tous pour votre aide et pour les pistes.


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

Discussions similaires

  1. Problème avec les Vertex Buffer Objects
    Par mysth dans le forum OpenGL
    Réponses: 0
    Dernier message: 18/05/2009, 21h31
  2. Problème dans un vertex Buffer Object
    Par baperpere dans le forum OpenGL
    Réponses: 0
    Dernier message: 01/03/2009, 00h26
  3. Debogage Vertex Buffer Object
    Par Robert Dumarais dans le forum OpenGL
    Réponses: 5
    Dernier message: 02/08/2008, 16h16
  4. Vertex Buffer Object et performance
    Par ciberrique dans le forum OpenGL
    Réponses: 30
    Dernier message: 07/07/2008, 15h38
  5. [Problème] Vertex Buffer Object
    Par Soznor dans le forum OpenGL
    Réponses: 20
    Dernier message: 19/07/2007, 18h44

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