glDrawArray()给出了一个内存异常

Jan*_*age 29 c++ memory opengl 3d-engine

循环遍历我想在3D引擎中渲染的所有对象时,尝试调用时出错

glDrawArrays(mesh->primitiveType, 0, mesh->vertexCount); 
Run Code Online (Sandbox Code Playgroud)

因为它试图从位置0x0000000读取,所以显然绑定到mesh-> vertexBuffer索引的指针指向零.这一切都发生在我的RenderableObject类中.此类的实例具有绑定到它们的网格,此网格包含应链接到VertexArray的索引.但显然

glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);
Run Code Online (Sandbox Code Playgroud)

失败了.

奇怪的是,它将在我的Mac和各种其他Windows计算机上运行 - 但它不会在这台(Windows)计算机上运行.因为我正在测试我删除了所有3D模型,并发现它是导致问题的原语,不知何故,MSVC++编译器"优化"了我的代码,以便删除所有内容

glGenBuffers(1, &CubeMesh.vertexBuffer);
Run Code Online (Sandbox Code Playgroud)

这可能就是为什么没有任何约束,或者我认为.我禁用了链接器/编译器优化,我现在可以看到allbreakpoints会被击中 - 但我仍然得到相同的异常,而且我完全不知道为什么它不起作用.

整个项目的源代码可以在@ https://github.com/Wrap/TwinGame/tree/master/src找到,据我所知,问题出现在Primitives.cpp和/或RenderableObject.cpp中. (特别是RenderableObject :: Draw();方法)文件.我是否正在尝试阅读受保护的内容,LoadPrimitives()出了什么问题; 方法?

感谢您抽时间阅读.

小智 2

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

我想这就是你的问题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]);
Run Code Online (Sandbox Code Playgroud)

我希望您正在检查是否GL_ARB_vertex_buffer_object有空。我希望这能起作用。