GlDrawArray() дает исключение памяти
Пока я просматриваю все объекты, которые я хочу отобразить в своем 3D-движке, я получаю сообщение об ошибке при попытке вызвать
glDrawArrays(mesh->primitiveType, 0, mesh->vertexCount);
Так как он пытается прочитать из местоположения 0x0000000, то, очевидно, указатель, привязанный к индексу mesh- > vertexBuffer, указывает на ноль. Все это происходит в моем классе RenderableObject. Экземпляры этого класса привязаны к ним сеткой, и этот меш содержит индекс, который должен ссылаться на VertexArray. Но, видимо,
glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);
Не работает.
Странно, что он будет работать на моем Mac и других компьютерах с Windows, но он не будет работать на этом (Windows) компьютере. Поскольку я тестирую, я удалил все 3D-модели и нашел в нем примитивы, которые вызывают проблему, так как компилятор MSVС++ "оптимизировал" мой код, чтобы удалить все после
glGenBuffers(1, &CubeMesh.vertexBuffer);
И, наверное, почему ничего не получилось, или так я думал. Я отключил оптимизацию компоновщика/компилятора, и я мог видеть, что все точки разлома будут ударяться сейчас, но я все равно получаю одно и то же исключение, и я абсолютно не знаю, почему это не работает.
Весь источник проекта можно найти @https://github.com/Wrap/TwinGame/tree/master/src, насколько я могу судить, проблема в Primitives.cpp, и/или RenderableObject.cpp(в частности, файл RenderableObject:: Draw(); method). Я пытаюсь прочитать что-то, что защищено, что не так с LoadPrimitives(); метод?
Спасибо, что нашли время, чтобы прочитать это.
Ответы
Ответ 1
RenderableObject::RenderableObject(ObjectManager* objectmgr) : Object(objectmgr), visible(true), scale(1.0f), mesh(0) {
mObjMgr->registerRenderable(this);
}
Я думаю, вот ваша проблема mesh(0)
. Возможно, вы вызываете метод Draw()
до, вы инициализируете это значение. Возможно, ваш класс Renderer
делает это.
Попробуйте добавить assert(mesh != 0)
перед вызовом любой функции.
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]);
И я надеюсь, что вы проверяете, доступен ли GL_ARB_vertex_buffer_object
. Надеюсь, это сработает.