Подтвердить что ты не робот

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(); метод?

Спасибо, что нашли время, чтобы прочитать это.

4b9b3361

Ответ 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. Надеюсь, это сработает.