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