2011-11-10 48 views
0

我试图动态删除我的应用程序中的VBO,以创建具有不同大小的新VBO。但是,当我的程序尝试删除它时,它会崩溃并出现分段错误。调用glDeleteBuffersARB导致段错误

下面是我的代码分配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上下文处于活动状态。

+3

顺便说一下,你不需要删除一个VBO只是为了改变它的大小,调用不同大小的'glBufferData'就足够了。但是也许你的实际应用更复杂。 –

+0

你可以运行内存检查,像valgrind? –

+0

@ChristianRau这实际上是完美的,但我仍然对这个删除业务感到好奇。 –

回答

0

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