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

时间:2011-04-24 09:57:56

标签: c++ memory opengl 3d-engine

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

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

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

glBindBuffer(GL_ARRAY_BUFFER, mesh->vertexBuffer);

失败了。

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

glGenBuffers(1, &CubeMesh.vertexBuffer);

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

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

感谢您花时间阅读本文。

1 个答案:

答案 0 :(得分:2)

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可用,您正在检查。我希望这有效。