绘制 VBO 会导致分割错误
Drawing VBO causes segmentation fault
我正在尝试使用 VBO 绘制一个四边形,这是完整的代码,但我会逐步发布代码: 以下是我初始化缓冲区的方法:
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
时,各种gl*Pointer()
函数的指针参数不引用客户端内存地址,而是引用 VBO 中的字节偏移量。绘制时,GL 将尝试获取这些数据,这些数据很可能超出缓冲区对象的界限 - 因此崩溃。你可能的意思是:
glVertexPointer(3, GL_FLOAT, 0, NULL);
请注意,原始 VBO 扩展在示例部分中具有以下常用的宏:
#define BUFFER_OFFSET(i) ((char *)NULL + (i))
使用它,您可以方便地很好地隐藏那些丑陋的指针算法,并且可以解决缓冲区中的字节偏移量: glVertexPointer(3, GL_FLOAT, 0, BUFFER_OFFSET(0));
相关文章:
- C++映射分割错误(核心转储)
- 由cin中的字符串中未捕获空白引起的分割错误
- 删除映射和分割错误中的一个过去结束元素
- 在指向函数中读取变量时出现分割错误
- 在链表中的第 n 位插入显示分割错误
- 较高值 n 的分割错误(例如 n=999997)
- 尝试通过memcpy复制大尺寸浮点向量时的分割错误
- 分割错误:向量中的擦除功能
- 向量向量的分割错误
- 我在C++中编写了一个方法来打印树类的预序,但它显示了分割错误
- C ++分割错误,为什么使用"long long"我没有得到答案?
- 在尝试使用递归查找集合子集的总数时,我遇到了分割错误
- 分割错误 11:尝试使用 cin 输入 B[1] 时
- 集合布局上的 Qt 分割错误
- 高达20亿的筛子会产生分割错误
- 对向量使用推回函数时的分割错误
- 绘制精灵会导致分割错误
- 将矢量的整数内容打印为字符串会导致分割错误
- 分割错误:使用向量时为 11 c++
- 结构的分割错误错误