绘制VBO会导致分段错误

时间:2013-11-11 15:00:52

标签: c++ opengl vbo

我正在尝试使用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错误,但是没有错误(它返回零)。

1 个答案:

答案 0 :(得分:3)

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

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

绘图时,你设置了这样的attrib指针:

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

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

glVertexPointer(3, GL_FLOAT, 0, NULL);

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

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

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