使用带有 glew 的 VBO 进行访问冲突

发布于 2024-12-11 18:54:31 字数 923 浏览 0 评论 0原文

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

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

。这是我的代码:

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

I'm trying to use VBO in my OpenGL project. I'm using glew library for extensions and glfw for windows handling. When I try to create VBO application crashes and I get

Unhandled exception at 0x00000000 in symulator3C.exe: 0xC0000005:
Access violation

in function glGenBuffersARB. Here's my code:

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);

}

I don't know what's wrong. Of course before calling this function I call glewInit() and result is success.
EDIT: I'm using Visual Studio 2010

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

柏林苍穹下 2024-12-18 18:54:31

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

Since your program fails at the first use of a VBO related function, it sounds like you either didn't initialize GLEW properly (by calling glewInit once the GL context is created and active) or your hardware just doesn't support VBOs.

Just check if your hardware supports GL_ARB_vertex_buffer_object or if the OpenGL version is at least 1.5, in which case you can use the core versions of the VBO functions (without the ARB suffix, but you still need a properly initialized GLEW for these, of course):

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

And make sure you work with a recent graphics driver. If you work with the Windows default driver, it may only support OpenGL 1.1.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文