2011-08-18 3 views
0

J'ai un VBO et un IBO dans OpenGL, mais je n'arrive pas à les dessiner correctement. Pourriez-vous s'il vous plaît laissez-moi savoir ce que je pourrais avoir oublié dans la fonction d'affichage de trame? - struct Point3D est une structure avec 3 flottants à l'intérieur (x, y, z). - nbVertex est le nombre de vertex dans le tableau glVertex. - nbVBOInd est la quantité d'indices dans le tableau VBOInd.Impossible d'afficher VBO dans OpenGL

glGenBuffers(1, &VertexVBOID); 
    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); 
    glBufferData(GL_ARRAY_BUFFER, sizeof(struct Point3D)*nbVertex, glVertex, GL_STATIC_DRAW); 

    glGenBuffers(1, &IndexVBOID); 
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); 
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*nbVBOInd, VBOInd, GL_STATIC_DRAW); 

    glBindBuffer(GL_ARRAY_BUFFER, VertexVBOID); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(3, GL_FLOAT, sizeof(glVertex), BUFFER_OFFSET(0)); //The starting point of the VBO, for the vertices 

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexVBOID); 
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); //The starting point of the IBO 

Merci!

+0

Quelle version OpenGL vous générez votre contexte? – datenwolf

+0

Désolé pour la question stupide: Comment puis-je le savoir? –

+0

@Laurent Cela dépend de votre plateforme. Utilisez-vous QGLViewer ou glut ou autre chose? Habituellement fournit quelques commutateurs pour créer un contexte avec une version spécifique. – pmr

Répondre

2

Essayez de changer la dernière ligne à:

glDrawElements(GL_TRIANGLES, nbVBOInd, GL_UNSIGNED_INT, BUFFER_OFFSET(0)); 

À moins que vos données dans le IndexVBOID sont vraiment court, mais, le sizeof (int) ci-dessus serait erroné.

+0

Merci pour la correction, mais changer cette dernière ligne ne fonctionne toujours pas correctement. Après l'avoir exécuté la première fois, rien n'est affiché, et après la deuxième fois, tout disparaît. Est-il vrai que je devrais exécuter toutes ces commandes à chaque affichage d'image, ou devrais-je libérer certaines choses entre les deux?Merci ! –

+0

À moins que votre géométrie ne change, vous devez écrire les deux premiers paragraphes une fois, dans le code d'initialisation, à exécuter une seule fois, et les deux derniers paragraphes dans la fonction de rendu. Notez que chaque appel à glGenBuffers consomme des ressources graphiques! – rodrigo

+0

Ok, je vais essayer d'optilmiser cela et voir pourquoi j'ai des comportements étranges (peut-être que le tableau de vertex est mal réglé après quelques rafraîchissements, je vais vérifier ça aussi. –

3

Je vois le même problème que rodrigo - vous avez incompatibilité de type de données, comme vous pouvez le voir ici:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int)*nbVBOInd, VBOInd, GL_STATIC_DRAW); 

sizeof (int) - en utilisant le type entier

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_SHORT, BUFFER_OFFSET(0)); 

GL_UNSIGNED_SHORT - en utilisant court type

Selon la spécification openGL, seuls les types de données non signés sont possibles pour glDrawElements. Pour corriger cela, vous devez:

  • changement VBOInd type non signé dans la déclaration comme:

    unsigned int* VBOInd = new unsigned int[nbVBOInd]

  • remplacer 6ème appel avec

    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*nbVBOInd, VBOInd, GL_STATIC_DRAW);

  • remplacer 11 (dernière) appeler avec

    glDrawElements(GL_TRIANGLES, nbVBOInd, GL_UNSIGNED_INT, BUFFER_OFFSET(0));

Quoi qu'il en soit, je crois que le problème est caché dans la configuration du pointeur, changer 9ème appel à:

glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0)); 

Si cela ne fonctionne pas, s'il vous plaît nous montrer comment glVertex et VBOInd est déclaré et rempli de données. Peut-être que vous utilisez std :: vector? Vous devez appeler ces conteneurs de données comme:

glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int)*nbVBOInd, &VBOInd[0], GL_STATIC_DRAW); 

Si quelque chose ne sait pas, il suffit de demander dans les commentaires ..