绘制 VBO 导致分段错误

Posted

技术标签:

【中文标题】绘制 VBO 导致分段错误【英文标题】:Drawing VBO causes segmentation fault 【发布时间】:2013-11-11 15:00:51 【问题描述】:

我正在尝试使用 VBO,here is the full code 绘制一个四边形,但我将逐步发布代码:这是我初始化缓冲区的方式:

data= vector<GLfloat>   // Global variable vector<GLfloat> data;
// Viewport: glViewport(0,0,width,height);
    width/2+20,height/2+20,0.0,
    width/2+20,height/2-20,0.0,
    width/2-20, height/2-20,0.0,
    width/2-20, height/2+20,0.0
;
glGenBuffers(1, &buffer);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glBufferData(GL_ARRAY_BUFFER, 12*sizeof(GLfloat), data.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

然后在显示函数中我尝试绘制四边形(我使用双缓冲):

glClearColor(1.0, 1.0, 1.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3f(1, 0, 0);
glBindBuffer(GL_ARRAY_BUFFER, buffer);
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, 0, data.data());
glDrawArrays(GL_QUADS, 0, 4); // Here I get segmentation fault
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glutSwapBuffers();

我在调用glDrawArrays 的行出现分段错误,我还尝试使用glGetError() 获取OpenGL 错误,但没有错误(它返回零)。

【问题讨论】:

你使用的opengl版本是什么?你可以通过调用glGetIntegerv​(GL_MAJOR_VERSION​, *);glGetIntegerv​(GL_MINOR_VERSION​, *);来检查它 无法识别宏 GL_MINOR_VERSION 和 GL_MAJOR_VERSION,我必须使用 glGetString(GL_VERSION); 【参考方案1】:

您在初始化中使用了以下行:

glBufferData(GL_ARRAY_BUFFER, 12*sizeof(GLfloat), data.data(), GL_STATIC_DRAW);

绘制时,您可以像这样设置属性指针:

glVertexPointer(3, GL_FLOAT, 0, data.data());

我怀疑data.data() 在这两种情况下都是一样的 - 使它成为一个错误。当绑定ARRAY_BUFFER 时,各种gl*Pointer() 函数的指针参数不引用客户端内存地址,而是引用VBO 中的字节偏移。绘制时,GL 将尝试获取这些数据,这很可能超出缓冲区对象的范围 - 因此会崩溃。您可能的意思是:

glVertexPointer(3, GL_FLOAT, 0, <strong>NULL</strong>);

请注意,original VBO extension 在示例部分有这个经常使用的宏:

#define BUFFER_OFFSET(i) ((char *)NULL + (i))

使用它,您可以方便地很好地隐藏那些丑陋的指针算法,并可以解决缓冲区中的字节偏移量: glVertexPointer(3, GL_FLOAT, 0, <strong>BUFFER_OFFSET(0)</strong>);

【讨论】:

以上是关于绘制 VBO 导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章

QOpenGLVertexArrayObject 导致多个 VBO 的段错误?

顶点缓冲区对象 -> 分段错误

C++/OpenGL - 绘制立方体 VBO

为啥我的字符串分配会导致分段错误?

为啥释放内存会导致分段错误?

确定导致分段错误的代码行?