【问题标题】:Call to glDeleteBuffersARB results in segfault调用 glDeleteBuffersARB 导致段错误
【发布时间】:2011-11-10 19:34:04
【问题描述】:

我试图在我的应用程序中动态删除 VBO,以创建不同大小的新 VBO。但是,当我的程序尝试删除它们时,它会因分段错误而崩溃。

下面是我分配 VBO 的代码:

glGenBuffersARB(1, &_vertexBufferID);
glBindBufferARB(GL_ARRAY_BUFFER, _vertexBufferID);
glBufferDataARB(GL_ARRAY_BUFFER,
                _pMetadata->vertexBufferSize(),
                NULL,
                GL_STATIC_DRAW)

在以下代码中定期将数据添加到 VBO:

glBindBufferARB(GL_ARRAY_BUFFER, _vertexBufferID);
glBufferSubDataARB(GL_ARRAY_BUFFER,
                   _pMetadata->vertexSubBufferOffset(),
                   _pMetadata->vertexSubBufferSize(),
                   &row[0]); // row is a vector<float>

在代码的其他地方,我尝试像这样删除 VBO:

glDeleteBuffersARB(1, &_vertexBufferID)

我在这条线上收到了分段错误。我已确保正确的 OpenGL 上下文在删除时处于活动状态。

【问题讨论】:

  • 顺便说一句,你不需要删除一个VBO只是为了改变它的大小,用不同的大小调用glBufferData就足够了。但也许您的实际应用程序更复杂。
  • 你能像 valgrind 一样运行内存检查吗?
  • @ChristianRau 这实际上工作得很好,但我仍然对这个删除业务感到好奇。
  • @CoreyD 为此,我们肯定需要更多代码,因为提供的代码很好。
  • 所有尝试删除 VBO 时都会发生这种情况吗?还是仅在一种情况下?您是否验证过 glDeleteBuffersARB 不是空函数指针?另外,你为什么使用 ARB 后缀函数而不是早已接受的标准 VBO 函数?

标签: c++ opengl vbo


【解决方案1】:

我曾经调试过一个类似的纹理问题,它是由填充数据时缓冲区溢出引起的。在您的 glBufferSubDataARB 调用之前添加一个边界检查,以确保您不会因偏移量+大小而溢出。查看以 GL_BUFFER_SIZE 作为参数的 glGetBufferParameteriv 以获得要检查的边界

【讨论】:

    猜你喜欢
    • 2015-01-18
    • 2021-05-25
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-09-03
    • 2012-08-17
    • 1970-01-01
    相关资源
    最近更新 更多