遍历要在3D引擎中渲染的所有对象时,尝试调用时出现错误

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

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

失败了。

奇怪的是,它将在我的Mac和其他各种Windows计算机上运行-但不会在此(Windows)计算机上运行。因为我正在测试,所以我删除了所有3D模型,并发现是导致此问题的原语,所以MSVC++编译器以某种方式“优化”了我的代码,以在删除之后
glGenBuffers(1, &CubeMesh.vertexBuffer);

这可能就是为什么没有束缚的原因,或者我想。我禁用了链接器/编译器优化,我可以看到现在所有断点都会受到攻击-但我仍然遇到相同的异常,而且对于它为什么不起作用我一无所知。

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

感谢您抽时间阅读。

最佳答案

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是否可用。我希望这行得通。

关于c++ - glDrawArray()给出内存异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5769876/

10-11 18:29