【问题标题】:glDrawArray() gives a memory exceptionglDrawArray() 给出内存异常
【发布时间】:2011-08-11 19:26:15
【问题描述】:

在循环遍历我想在 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 提出了一个很好的、经过深思熟虑的详细问题。 :) 继续。
  • 有问题的机器是否真的支持缓冲区对象?即使驱动程序将扩展的函数指针交给您,也并不意味着实际上支持该扩展。检查扩展字符串 (glGetString(GL_EXTENSIONS);)
  • 你试过用纯软件渲染吗?这至少会告诉你问题出在哪一边。
  • 确认mesh指针有效,内存异常是由vertexCount引起的吗?
  • 我之前遇到过这个问题:确保您没有在 OpenGL 中启用任何其他没有指向缓冲区的数据数组。我曾经启用旧版颜色缓冲区以突出显示一些错误,但忘记删除这段代码。所以我会在渲染缓冲区之前启用 glColorArray,但我从未分配指向包含颜色的实际缓冲区的数据指针。这有意义吗?

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


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

【讨论】:

    猜你喜欢
    • 2017-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多