2011-11-10 44 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作爲參數來獲得邊界檢查