3 votes

Pourquoi glDrawElements me donne-t-il GL_OUT_OF_MEMORY ?

Je ne dessine que 4 sommets. J'essaie de rendre un simple quad en utilisant glDrawElements mais rien ne semble fonctionner. J'ai écrit un code identique en Java et il fonctionne. Ceci, cependant, ne fonctionne pas.

Voici le code du dessin :

glUseProgram(mProgram);

glBindBuffer(GL_ARRAY_BUFFER, mBuffers[0]);
glEnableVertexAttribArray(mPosAttr);
glVertexAttribPointer(mPosAttr, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mBuffers[1]);
if (er == 0){ er = glGetError(); std::cout<<gluErrorString(er)<<std::endl; }
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void*)0);

glDisableVertexAttribArray(mPosAttr);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glUseProgram(0);

J'ai laissé de côté des choses inutiles comme glUniform__ J'obtiens le même résultat dans les deux cas. Quoi qu'il en soit, cela donne "pas d'erreur" la première fois, puis "out of memory" la seconde. Cela signifie que le problème est certainement causé par glDrawElements.

Pourquoi cela se produit-il ? Qu'est-ce qui pourrait y remédier ? Dois-je fournir plus de code ?

2voto

datenwolf Points 85093

Dans un commentaire, l'OP a déclaré

Comme je l'ai indiqué, je me suis assuré que le message provenait bien de glDrawElements.

Cependant, dans le code source donné

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, mBuffers[1]);
if (er == 0){ er = glGetError(); std::cout<<gluErrorString(er)<<std::endl; }
glDrawElements(GL_TRIANGLE_STRIP, 4, GL_UNSIGNED_SHORT, (void*)0);

Le contrôle des erreurs est effectué avant glDrawElements. Le code de vérification des erreurs est également erroné. La méthode correcte était :

while( (er = glGetError()) != GL_NO_ERROR ){ std::cerr << gluErrorString(er) << std::endl; }

Comme nous l'avons déjà mentionné, les erreurs s'accumulent et doivent être interrogées jusqu'à épuisement dans une telle boucle.

Il n'est pas possible de savoir pourquoi cette erreur se produit sans en savoir plus sur le programme : Comment le contexte est-il créé, les extensions sont-elles correctement initialisées, etc. L'idéal serait d'avoir le code source complet, ou un exemple minimal (non) fonctionnel et compilable.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X