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 :

Manque Des Triangles


Sujet :

OpenGL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut Manque Des Triangles
    Salut c'est encore moi ,

    J'étais passé il y a peu de temps à un affichage en index pour mon objet terrain dans le moteur sur lequel je travaille depuis quelque temps....

    J'ai donc cherché des tutos un peu partout et j'ai implémenté la chose .. tout marchais bien jusqu'à ce que je me rende compte queà partir d'un certain nombre d'index dans mon tableau je me retrouve avec un bug étonnant, mon terrain est affiché correctement mais tous mes autres objets qui n'utilisent pas les index buffer ont des manques de triangles oubien des triangles erronnés ..... Je ne vois vraiment pas d'ou cela peut veniçr si vous avez des idées ca sera avec une grande joie

    Merci d'avance
    Seb

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    jusqu'à ce que je me rende compte queà partir d'un certain nombre d'index dans mon tableau je me retrouve avec un bug étonnant
    Combien d'indices ?

    mon terrain est affiché correctement mais tous mes autres objets qui n'utilisent pas les index buffer ont des manques de triangles oubien des triangles erronnés
    Tu affiches bien ces objets avec les fonctions qui n'utilisent pas les indices ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    Salut ! désolé de ne pas répondre plus vite et de ne pas mettre de code mais je n'ai plus accès à internet de chez moi donc je poste de ma salle informatique de la FAC .

    Alors aparememnt mon probleme est résolu mais mal il me semble ..... En gros ce que j'ai compris de mon probleme c'est que en utilisant les indices pour afficher mon terrain cela fonctionnais tres bien mais ensuite pour afficher les autres objets, ils réutilisait la liste .... et du coup certain triangles était inaffichés ou mal affichés .... du coup heuu comment j'ai fais déja ? ^o) ... ah oui en fait dans la commande glDrawElements( , je croyais que le dernier parametre correspondait à l'offset un peu comme pour glDrawArrays( et aparemment non ... donc maintenant je passe en dernier parametre le pointeur vers mon tableau d'indices .. mais je me demande si je ne perds pas tout l'interet des VBO en faisant ca ^o) ???

    Donc voila si vous pouvez me renseigner la dessus ca serait avec grand plaisir

    Merci d'avance
    Seb

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    mais je me demande si je ne perds pas tout l'interet des VBO en faisant ca ^o)
    Si, complétement.

    Si tu veux rendre un objet qui n'est pas indicé alors il ne faut pas utiliser glDrawElements, mais glDrawArrays.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    Si tu veux rendre un objet qui n'est pas indicé alors il ne faut pas utiliser glDrawElements, mais glDrawArrays.
    je m'en doute merci mais c'est bien ce que j'essayais d'expliquer juste avant mais je ne suis pas du genre très clair ...

    Je recommence : en fait mon problême c'est que si j'utilise glDrawElements pour afficher mon terrain il s'affiche sans aucun problemes .....tout va bien pour le terrain !!! Mais par contre tous les autres objets qui utilisent par contre eux des array simples pour le moment et qui s'affichent donc grâce à glDrawArrays eux ont des problemes ... parceque même si je fais un DrawArrays j'ai l'impression qu'il conserve le tableau d'index pour les afficher .. mais peut être que je me trompe et que le problème est ailleur je pense qu'un peu de code ce soir quand je pourrais en mettre sera pluys parlant .....

    Merci d'avance @+
    Seb

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    parceque même si je fais un DrawArrays j'ai l'impression qu'il conserve le tableau d'index pour les afficher
    A non non, ça c'est impossible.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    C'est bien ce que je me disais aussi ... je vous mettrez un bout de code en éditant ce post ce soir parceque je crois etre sur une fausse piste en fait

    Alors voila le code d'initialisation au chargement d'un modele classique
    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
     
            m_pVertices    = new GsVert[m_nVertexCount];
            m_pTexCoords = new GsTexCoord[m_nVertexCount];
            m_pColor        = new GsColor[m_nVertexCount];
     
            .... initialisation des tableaux....
     
            // generation des vbo et envoi des données
            glGenBuffersARB( 1, &m_nVBOColVertTex );
            glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOColVertTex ); // Bind The Buffer
        	glBufferDataARB( GL_ARRAY_BUFFER_ARB, (m_nVertexCount*sizeof(GsTexCoord))+(m_nVertexCount*sizeof(GsColor)) + (m_nVertexCount*sizeof(GsVert)), 0, GL_DYNAMIC_DRAW_ARB );
     
        	glBufferSubDataARB( GL_ARRAY_BUFFER_ARB, 0, m_nVertexCount*sizeof(GsColor), m_pColor );
        	glBufferSubDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*sizeof(GsColor), m_nVertexCount*sizeof(GsVert), m_pVertices );
        	glBufferSubDataARB( GL_ARRAY_BUFFER_ARB, (m_nVertexCount*sizeof(GsColor)) + (m_nVertexCount*sizeof(GsVert)), m_nVertexCount*sizeof(GsTexCoord), m_pTexCoords );

    ensuite pour l'affichage :

    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
    	    //applique les transformations de positions si visible 
        	glPushMatrix();
        	glTranslatef(P.getX(),P.getY(),P.getZ());
        	glRotated(P.getAX()+Original.getAX(),1,0,0);
        	glRotated(P.getAY()+Original.getAY(),0,1,0);
        	glRotated(P.getAZ()+Original.getAZ(),0,0,1);
        	//transformation d'echelle
        	glScalef(S.getX(),S.getY(),S.getZ());
     
        	   glEnable(GL_TEXTURE_2D);
               if( programmeDe3D.getTextureBind() != T->getId()) {
                   programmeDe3D.setTextureBind(T->getId());
            	   glBindTexture(GL_TEXTURE_2D, T->getId());
               }
               if( programmeDe3D.getLastVertice() != m_nVBOColVertTex ) {
               	   glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOColVertTex );
                   glColorPointer( 4, GL_UNSIGNED_BYTE, 0, 0 );		// Set The Color Pointer To The Color Buffer
                   glVertexPointer( 3, GL_FLOAT, 0, BUFFER_OFFSET(m_nVertexCount*sizeof(GsColor)) );		// Set The Vertex Pointer To The Vertex Buffer
                   glTexCoordPointer( 2, GL_FLOAT, 0, BUFFER_OFFSET((m_nVertexCount*sizeof(GsColor)) + (m_nVertexCount*sizeof(GsVert)) ) );
                   programmeDe3D.setLastVertice(m_nVBOColVertTex);
               }
     
        	   // Enable Pointers
        	   glEnableClientState( GL_TEXTURE_COORD_ARRAY );				// Enable Texture Coord Arrays
     
        	   // Render
        	   glDrawArrays( GL_TRIANGLES, 0, m_nVertexCount );	// Draw All Of The Triangles At Once    
     
               glDisable(GL_TEXTURE_2D);
     
        	   // Disable Pointers
        	   glDisableClientState( GL_TEXTURE_COORD_ARRAY );				// Disable Texture Coord Arrays
     
        	glPopMatrix();
    voila ça c'est les codes pour des objets classiques affichés en multi arrays si je dis pas de bêtises.(VBO ?)

    ensuite mon terrain a une méthode un peu différente puisque'il utilise les index

    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
        m_pVertices  = new GsVec[m_nVertexCount];
        m_pTexCoords = new GsTexCoord[m_nVertexCount];
        m_pColor     = new GsColor[m_nVertexCount];
        m_pIndices = new Indice[m_nIndiceSize];
     
    .... initialisation des tableaux....
     
        /******************************************/
        //            Buffer de donnees
        glGenBuffersARB( 1, &m_nVBOColVertTex);
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOColVertTex ); // Bind The Buffer
    	glBufferDataARB( GL_ARRAY_BUFFER_ARB, (m_nVertexCount*sizeof(GsTexCoord))+(m_nVertexCount*sizeof(GsColor)) + (m_nVertexCount*sizeof(GsVert)), 0, GL_DYNAMIC_DRAW_ARB );
     
    	glBufferSubDataARB( GL_ARRAY_BUFFER_ARB, 0, m_nVertexCount*sizeof(GsColor), m_pColor );
    	glBufferSubDataARB( GL_ARRAY_BUFFER_ARB, m_nVertexCount*sizeof(GsColor), m_nVertexCount*sizeof(GsVert), m_pVertices );
    	glBufferSubDataARB( GL_ARRAY_BUFFER_ARB, (m_nVertexCount*sizeof(GsColor)) + (m_nVertexCount*sizeof(GsVert)), m_nVertexCount*sizeof(GsTexCoord), m_pTexCoords );
     
        /******************************************/
        //            Buffer d'index
        glGenBuffersARB( 1, &m_nVBOIndices);
        glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOIndices ); // Bind The Buffer
        glBufferDataARB( GL_ARRAY_BUFFER_ARB, m_nIndiceSize*sizeof(ShortIndice), m_pShortIndices, GL_STATIC_DRAW_ARB );

    Et affichage :

    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
    	   glEnable(GL_TEXTURE_2D);
           if( programmeDe3D.getTextureBind() != T->getId()) {
               programmeDe3D.setTextureBind(T->getId());
               glBindTexture(GL_TEXTURE_2D, T->getId());
           }
     
       	   glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOColVertTex );
           glColorPointer( 4, GL_UNSIGNED_BYTE, 0, 0 );		// Set The Color Pointer To The Color Buffer
           glVertexPointer( 3, GL_FLOAT, 0, BUFFER_OFFSET(m_nVertexCount*sizeof(GsColor)) );		// Set The Vertex Pointer To The Vertex Buffer
           glTexCoordPointer( 2, GL_FLOAT, 0, BUFFER_OFFSET((m_nVertexCount*sizeof(GsColor)) + (m_nVertexCount*sizeof(GsVert)) ) );
     
    	   // Enable Pointers
    	   glEnableClientState( GL_TEXTURE_COORD_ARRAY );				// Enable Texture Coord Arrays
           glBindBufferARB( GL_ARRAY_BUFFER_ARB, m_nVBOIndices ); // Bind The Buffer
           if( indiceType == GS_INT_INDICE ) {
               glIndexPointer(  GL_UNSIGNED_INT, 0, 0 );
     
        	   // Render
               glDrawElements(  GL_TRIANGLES, limA, GL_UNSIGNED_INT, m_pIndices );	// Draw All Of The Triangles At Once
    VOila cette version est la version que j'utilise actuellement et qui fonctionne cependant il me semble que je ne tire pas bien parti des avantages des VBO ....

    Merci d'avance de vos réponses
    @bientot
    Seb

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    personne n'as de conseils ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 98
    Par défaut
    S'il vous plait est-ce que quelqu'un pourrait prendre le temps de m'expliquer comment améliorer tout ca en utilisant les VBO avec les indices ???

    Merci d'avance
    Seb

Discussions similaires

  1. [Dev-C++] Il me manque des .h
    Par bigjeff dans le forum Dev-C++
    Réponses: 5
    Dernier message: 21/12/2006, 19h51
  2. C'est quoi les INDICES des triangles?
    Par Happy dans le forum OpenGL
    Réponses: 2
    Dernier message: 06/03/2006, 23h03
  3. [VB.NET][Crystal Report] Manque des pages
    Par joefou dans le forum SDK
    Réponses: 2
    Dernier message: 05/12/2005, 10h28
  4. Il manque des fonctions?
    Par Gruik dans le forum Requêtes
    Réponses: 3
    Dernier message: 15/10/2003, 00h44

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