29

在循环遍历我想在 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() 有什么问题?方法?

感谢您抽时间阅读。

4

1 回答 1

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

于 2011-05-09T18:43:38.410 回答