使用带有 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 访问冲突