c++ - 绘制VBO导致段错误

标签 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 错误,但没有错误(它返回零).

最佳答案

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

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

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

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

我怀疑data.data()在这两种情况下都是一样的——这是一个错误。当 ARRAY_BUFFER被绑定(bind),各种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>);

关于c++ - 绘制VBO导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19909375/

相关文章:

java - 在单独的线程中将 VBO 发送到 GPU

c++ - 为什么 std::queue 在弹出元素后不收缩内存?

java - 重复场景树 (Java3d/OpenGL)

c++ - 使用 gl_PointSize 来扩大和缩小点

c++ - 可变参数模板和顶点缓冲区属性

c++ - OpenGL VAO VBO 着色器困惑

c++ - 学习C或C++会对我的计算机造成危险吗?

c++ - 有助于最大限度地减少 C++ 程序中宏使用的工具

C++ 表达式模板生命周期

c++ - 如何在 openGL 中模拟蟋蟀树桩