使用带有glew的VBO访问冲突

时间:2011-10-22 19:25:15

标签: opengl vbo glew

我正在尝试在我的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

1 个答案:

答案 0 :(得分:2)

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

检查你的硬件是否支持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。