resueltos punteros memoria ejercicios ejemplos ejemplo dinamicos dinamica asignacion arreglos c++ memory opengl 3d-engine

c++ - memoria - punteros en c



glDrawArray() da una excepción de memoria (1)

Mientras recorro todos los objetos que quiero renderizar en mi motor 3D, aparece un error al intentar llamar

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

Como intenta leer desde la ubicación 0x0000000, aparentemente el puntero vinculado al índice mesh-> vertexBuffer apunta a cero. Todo esto sucede dentro de mi clase RenderableObject. Las instancias de esta clase tienen una malla unida a ellas, y esta malla contiene un índice que debe vincularse con VertexArray. Pero aparentemente

glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);

Esta cayendo.

Lo extraño es que se ejecutará en mi mac y en varias otras computadoras con Windows, pero no se ejecutará en esta computadora (Windows). Como estoy probando, eliminé todos los modelos 3D y encontré que son las primitivas las que están causando el problema; de alguna manera, el compilador de MSVC ++ "optimizó" mi código, para eliminar todo después de

glGenBuffers(1, &CubeMesh.vertexBuffer);

Y esa es probablemente la razón por la cual nada se vinculó, o al menos eso pensé. Inhabilité las optimizaciones del vinculador / compilador, y pude ver que todos los puntos de ruptura se verían afectados ahora, pero igual recibo la misma excepción, y no tengo ni idea de por qué no funciona.

La fuente completa del proyecto se puede encontrar en https://github.com/Wrap/TwinGame/tree/master/src , por lo que puedo decir que el problema está en Primitives.cpp, y / o RenderableObject.cpp (específicamente el archivo RenderableObject :: Draw (); method). ¿Estoy tratando de leer algo que está protegido? ¿Qué pasa con LoadPrimitives ()? ¿método?

Gracias por tomarse el tiempo para leer esto.


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

Creo que aquí está tu problema de mesh(0) . Tal vez está llamando al método Draw() antes de inicializar este valor. Tal vez tu clase Renderer hace.

Intenta agregar assert(mesh != 0) antes de cualquier llamada de función.

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]);

Y espero que lo esté comprobando si GL_ARB_vertex_buffer_object está disponible. Espero que esto funcione.