glGenBuffers 为 NULL,在使用 glew 时给出 0x0000000 访问冲突

Posted

技术标签:

【中文标题】glGenBuffers 为 NULL,在使用 glew 时给出 0x0000000 访问冲突【英文标题】:glGenBuffers is NULL giving a 0x0000000 access violation when using glew 【发布时间】:2011-02-16 20:53:38 【问题描述】:

> 我有 Visual Studio C++ Express 和 NVIDIA GeForce 7900 GS。我正在使用 glew 来获取 openGL 扩展。调用 glGenBuffers 会崩溃,因为它是一个 NULL 指针。在我拨打电话之前,我有一个开放的 GL 上下文( wglGetCurrentContext() != NULL )。我在通话前打电话给 glewInit() 。 glewGetString( GLEW_VERSION ) 正在返回 GLEW_VERSION_1_5。我究竟做错了什么 ?卡太旧了?是司机吗?

【问题讨论】:

您是否将 NULL 指针传递给 glGenBuffers? 不绝对不是 -> Gluint vbo; glGenBuffers(1, &vbo); 你能检查一下指向 glGenBuffers 的函数指针是否为零吗? 【参考方案1】:

记得在您的代码中调用glewInit(),以便获得指向 GL 函数的有效指针。

希望对你有帮助。

【讨论】:

【参考方案2】:

如果没有看到您的代码,很难判断,但您尝试做的事情似乎可以通过使用 GLee 得到很大帮助。它旨在加载所有当前扩展,您可以检查支持的内容,例如:

#include <gl\GLee.h>          // (no need to link to gl.h) 

...

if (GLEE_ARB_multitexture)    //is multitexture support available?

  glMultiTexCoord2fARB(...);  //safe to use multitexture

else

 //fallback

以上内容是从GLee site 无耻地复制/粘贴的,但它显示了我想要展示的功能。

【讨论】:

但是我使用 glew 肯定就足够了? @Mark:从来没有用过glew,所以我不能确定。我只是提供 GLee 作为替代方案,因为它对我来说非常效果很好。一些似乎对 glew 有问题的人没有使用 GLee (nvnews.net/vbulletin/showthread.php?t=154581)。【参考方案3】:

您需要调用 glewInit() 发布具有有效上下文的帖子。在你调用 glfwMakeContextCurrent(myWindow); 之后,在 glew 的世界中就是这样。

【讨论】:

【参考方案4】:

我实际上遇到了 GLEW 的这个问题。对我来说,它使 glGenerateMipmap 的函数指针无效。我通过简单地将指针恢复到适当的函数来修复它。这是我在 Linux 中的示例:

glGenerateMipmap = (void(*)(GLenum))
    glXGetProcAddressARB((GLubyte*)"glGenerateMipmap");

glXGetProcAddress 有一个 WGL 等价物;我只是不记得我头顶上的名字。尝试使用此方法手动恢复功能。如果您遇到 许多 为 null 的函数,那么您的设置过程肯定有问题。我记得唯一需要恢复的其他函数是 glGenVertexArrays、glBindVertexArray 和 glDeleteVertexArrays。如果您的 glGenBuffers 为空,则 glBindBuffer 和 glDeleteBuffers 也很可能为空。 :(

【讨论】:

wglGetProcAddress 是名称。【参考方案5】:

通过检查 glGetString(GL_EXTENSIONS); 返回的字符串来测试是否实际支持所需的扩展。如果它不存在,您就知道是什么导致了您的问题。

【讨论】:

人们对这样做的根本原因一无所知。只知道不枚举。

以上是关于glGenBuffers 为 NULL,在使用 glew 时给出 0x0000000 访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

仅在发布模式下使用 glGenBuffer 的未处理异常 - QT

调用glGenBuffers时openGL崩溃

GLEW glGenBuffers 段错误

glGenBuffers 不设置缓冲区

opengl渲染4k数据提高效率

在 NULL 指针上调用 delete 或 delete[] [重复]