29 votes

glDrawArray() donne une exception de mémoire

En passant en boucle tous les objets que je veux rendre dans mon moteur 3D, j'obtiens une erreur en essayant d'appeler

glDrawArrays(mesh->primitiveType, 0, mesh->vertexCount); 

Parce qu'il essaie de lire à partir de l'emplacement 0x0000000, donc apparemment le pointeur lié à l'index mesh->vertexBuffer pointe vers zéro. Tout cela se passe dans ma classe RenderableObject. Les instances de cette classe ont un mesh qui leur est lié, et ce mesh contient un index qui devrait être lié au VertexArray. Mais apparemment

glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);

C'est un échec.

Ce qui est étrange, c'est qu'il fonctionne sur mon Mac et sur plusieurs autres ordinateurs Windows, mais pas sur cet ordinateur (Windows). Parce que je fais des tests, j'ai supprimé tous les modèles 3D et j'ai découvert que ce sont les primitives qui causent le problème. D'une certaine manière, le compilateur MSVC++ a "optimisé" mon code pour supprimer tout ce qui se trouve après l'exécution.

glGenBuffers(1, &CubeMesh.vertexBuffer);

Et c'est probablement pour ça que rien n'a été lié, ou du moins je le pensais. J'ai désactivé les optimisations de l'éditeur de liens et du compilateur, et j'ai pu constater que tous les points d'arrêt étaient atteints maintenant - mais j'obtiens toujours la même exception, et je ne sais absolument pas pourquoi ça ne fonctionne pas.

La source complète du projet peut être trouvée @ https://github.com/Wrap/TwinGame/tree/master/src Pour autant que je puisse dire, le problème se situe dans le fichier Primitives.cpp et/ou RenderableObject.cpp (en particulier la méthode RenderableObject::Draw() ;). Est-ce que j'essaie de lire quelque chose qui est protégé, qu'est-ce qui ne va pas avec la méthode LoadPrimitives(); ?

Merci d'avoir pris le temps de lire ceci.

2voto

mani3xis Points 166
RenderableObject::RenderableObject(ObjectManager* objectmgr) : Object(objectmgr), visible(true), scale(1.0f), mesh(0) {
    mObjMgr->registerRenderable(this);
}

Je pense que votre problème est le suivant mesh(0) . Peut-être que vous appelez le Draw() méthode avant vous initialisez cette valeur. Peut-être que votre Renderer La classe le fait.

Essayez d'ajouter assert(mesh != 0) avant tout appel de fonction.

void RenderableObject::Draw(class ShaderManager* shaderMgr){
    //TODO: iterate through all meshes that belong to the object

    assert(mesh != 0)

    glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer[0]);

Et j'espère, que vous vérifiez, si GL_ARB_vertex_buffer_object est disponible. J'espère que cela fonctionnera.

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