使用带有 glew 的 VBO 访问冲突

Posted

技术标签:

【中文标题】使用带有 glew 的 VBO 访问冲突【英文标题】:Access violation using VBO with glew 【发布时间】:2011-10-22 19:25:15 【问题描述】:

我正在尝试在我的 OpenGL 项目中使用 VBO。我使用 glew 库进行扩展,使用 glfw 进行 Windows 处理。当我尝试创建 VBO 应用程序崩溃时,我得到了

symulator3C.exe 中 0x00000000 处未处理的异常:0xC0000005: 访问冲突

在函数 glGenBuffersARB 中。这是我的代码:

GLuint vboId1=0; //this is global variable

void createVBO()
normalsVBO = (float *) malloc(sizeof(float)*3*(SIZE_X-1)*SIZE_Y*2);
verticesVBO = (float *) malloc(sizeof(float)*3*(SIZE_X-1)*SIZE_Y*2);
if(normalsVBO==NULL) exit(-1);
if(verticesVBO==NULL) exit(-1);

glGenBuffersARB(1, &vboId1); //HERE IT CRASHES!

// bind VBO in order to use
glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId1);

...
glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(float)*3*(SIZE_X-1)*SIZE_Y*2, verticesVBO, GL_DYNAMIC_DRAW);
glEnableClientState(GL_VERTEX_ARRAY);             // activate vertex coords array
glVertexPointer(3, GL_FLOAT, 0, 0);


我不知道怎么了。当然,在调用这个函数之前,我调用 glewInit() 并且结果是成功的。 编辑:我正在使用 Visual Studio 2010

【问题讨论】:

你的调试器告诉你程序在哪里停止? 正如它所提到的,它停在 glGenBuffersARB(1, &vboId1) 行。还是你的意思是别的? 你的OpenGL实现真的支持ARB_vertex_buffer_object吗?您似乎没有通过 GLEW 检查该扩展程序。 发布一个完整的、最小的程序来演示这个问题。 【参考方案1】:

由于您的程序在第一次使用 VBO 相关函数时失败,听起来您要么没有正确初始化 GLEW(通过在创建并激活 GL 上下文后调用 glewInit)或者您的硬件没有支持 VBO。

只需检查您的硬件是否支持 GL_ARB_vertex_buffer_object 或 OpenGL 版本是否至少为 1.5,在这种情况下,您可以使用 VBO 函数的核心版本(没有 ARB 后缀,但您仍然需要为这些正确初始化 GLEW,当然):

printf("%s\n", glGetString(GL_VERSION));
if(!strstr(glGetString(GL_EXTENSIONS), "GL_ARB_vertex_buffer_object"))
    //no VBO extension

并确保您使用的是最新的图形驱动程序。如果您使用 Windows 默认驱动程序,它可能只支持 OpenGL 1.1。

【讨论】:

我可能不需要告诉你,但对于那些在家里跟随的人GLEW 有自己的一组extension and version checks。 我有最新版本的 glew。 @Christian Rau 当我调用 glGetString(GL_VERSION) 时它返回 null。奇怪的是,我有 VBO 的工作示例,但是当我检查 gl.h 文件中的 openGL 版本时,有 1.1。现在我正在尝试寻找新版本的 GL.h 也许它会有所帮助 @pchot 不要寻找新版本的 GL.h,没有。高于 1.1 的每个函数都只能通过函数指针功能使用,类似于扩展,并由 GLEW 为您管理。这些功能的实际实现由您的图形驱动程序提供。但是好的旧 GL.h 只是 1.1 版(至少在 Windows 上),你不会改变它。 @Christian Rau 好的,问题是在创建 GL 上下文之后我有 glewInit() 并且在我调用 glGenBuffersARB 之后。愚蠢的错误,浪费了很多时间:/感谢您的帮助。

以上是关于使用带有 glew 的 VBO 访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

glBindBuffer 崩溃 - 带有 glew 的 VBO 实现

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

使用 glfw3 glew 和 opengl 在 Visual Studio 社区中获取访问冲突异常

创建网格和启动窗口 SDL/GLEW C++ 时访问冲突

SDL + OpenGL:创建缓冲区时访问冲突

OpenGL glGenVertexArray() 异常