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.