调用 glDrawArrays() 时的 OpenGL VBO Segfault

Posted

技术标签:

【中文标题】调用 glDrawArrays() 时的 OpenGL VBO Segfault【英文标题】:OpenGL VBO Segfault when calling glDrawArrays() 【发布时间】:2014-07-26 00:27:24 【问题描述】:

我一直在尝试让 VBO 在我的最新项目中工作,但当我尝试调用 glDrawArrays 时,程序会出现段错误。

生成 VBO

bool Renderer::init()

GLfloat verticies[]=
0,0,
 0,32,
 32,32,
 32, 0;

glGenBuffersARB(1, &vboTest);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTest);

glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(verticies), verticies, GL_STATIC_DRAW);

然后渲染VBO

void Renderer::renderScene()

glClear(GL_COLOR_BUFFER_BIT);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboTest);

glEnableClientState(GL_VERTEX_ARRAY);

glVertexPointer(2, GL_FLOAT, 0, 0);

glDrawArrays(GL_QUADS, 0, 4);

glDisableClientState(GL_VERTEX_ARRAY);

glLoadIdentity();
SDL_GL_SwapWindow(window);

【问题讨论】:

您使用的是哪个 OpenGL 版本?你在使用着色器吗?当您尝试将 (X,Y) 坐标渲染为顶点时,我不确定 OpenGL 是如何工作的,尝试添加 Z 坐标并更改 glVertexPointer(2, GL_FLOAT, 0, 0);到 glVertexPointer(3, GL_FLOAT, 0, 0); 您确定在DrawArrays 中发生了段错误吗?什么是崩溃的堆栈跟踪? 实际上我想通了,这是一个非常愚蠢的错误,我使用 SDL_GL_GetProcAddress 加载函数,但我的主文件中有原型,但在渲染器头中我定义了 GL_EXT_PROTOTYPES 所以它试图通过 glext 函数指针访问它们。 【参考方案1】:

没关系,这是一个愚蠢的任意错误。我使用 SDL_GL_GetProcAddress 加载了函数,但随后在渲染器类的标头中定义了 GL_EXT_PROTOTYPES,而不是重新对函数进行原型设计。

【讨论】:

以上是关于调用 glDrawArrays() 时的 OpenGL VBO Segfault的主要内容,如果未能解决你的问题,请参考以下文章

我可以在调用 glDrawArrays 后删除 OpenGL 顶点数组吗?

调用 glDrawArrays 时出现访问冲突错误

在 Opengl ES 中在 FBO 上调用多个 glReadPixels 和 glDrawArrays

我可以在更新同一个“GL_ARRAY_BUFFER”时多次调用“glDrawArrays”吗?

OpenGL 3.3 - glDrawArrays 后的无效操作错误 (1282)

glDrawArrays,动态改变正在绘制的点数?