3

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

4

1 回答 1

2

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

于 2011-10-23T01:23:28.627 回答