2011-11-10 11 views
0

異なるサイズの新しいVBOを作成するために、アプリケーションでVBOを動的に削除しようとしています。しかし、私のプログラムがそれらを削除しようとすると、セグメンテーション違反でクラッシュします。以下は glDeleteBuffersARBの呼び出し結果がsegfaultになる

はVBOを割り当て、私のコードです:

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

、他の場所のコードで、私はVBOを削除しよう:

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

データは、定期的に以下のコードでVBOに追加されますそのような:

glDeleteBuffersARB(1, &_vertexBufferID) 

そして、それは私がセグメンテーションフォールトを受け取り、そのライン上にあります。私は、正しいOpenGLコンテキストが削除時にアクティブであることを保証しました。

+3

ところで、サイズを変更するためにVBOを削除するだけで、別のサイズの 'glBufferData'を呼び出すだけで十分です。しかし、あなたの実際のアプリケーションはもっと複雑かもしれません。 –

+0

valgrindのようにチェックしたメモリを実行できますか? –

+0

@ChristianRauこれは実際には完全に機能しますが、私はまだこの削除業務について興味があります。 –

答えて

0

私はテクスチャで同様の問題を一度デバッグしました。データを埋め込むときにバッファオーバーフローが発生しました。 glBufferSubDataARBを呼び出す直前に境界チェックを追加して、offset + sizeでオーバーフローしないようにしてください。チェック対象の境界を取得するパラメータとしてGL_BUFFER_SIZEを指定したglGetBufferParameterivを見てください

関連する問題