2017-11-28 3 views
3

私はOpenGLを使ってモデルの新しいデータをグラフィックスカードにロードするプログラムに取り組んでいます。そして、それをレンダリングするように切り替えてから、古いデータを削除して他の用途のためのスペースを増やします。glBufferDataの作成/解放バッファの呼び出しはありますか?

メモリのスラッシングにつながる可能性があるので、私の理解からは、バッファを作成/解放してはいけません。

glBufferDataを頻繁に呼び出してグラフィックカードに新しいデータを追加するのは悪いですか?これはバッファの作成/解放としてカウントされますか?

答えて

3

以前に呼び出されたものと同じサイズと使用パラメータでglBufferDataを呼び出すと、これは効果的にバッファを無効にしたり、 "孤立している"。他に何かをするには、サイズや使用量を変更するには、効果的に新しいバッファを作成することです。

データをストリーミングしない(フレームごとに新しいデータをアップロードするなど)場合、無効化は特に有用ではありません。もうバッファを使用しておらず、それをしばらく使用していない場合は、もう一度バッファストレージを必要とする場合はそのままにしておいてください。

お使いのモデルが異なるサイズを使用している場合は、大きなバッファオブジェクトを事前に割り当てて、異なるモデルにその1つの割り当てと異なる領域を使用させます。

+3

すでにglBufferDataでバッファを割り当てていて、データの更新/置換が必要な場合は、[glBufferSubData](https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml)を使用できます。 /glBufferSubData.xml)を使用して、新しい割り当てが行われないようにしながらデータを変更します。 –

+1

glBufferSubDataを使用すると、データの更新が部分的になることがあり、シャドウコピーを作成する必要があります。オーファンが実行されると、コピーステップをスキップできます。 – datenwolf

+0

glBufferSubDataを正しく動作させることができません。初期化時にこのコードを呼び出して初期バッファを作成します: 'glBindBuffer(GL_ARRAY_BUFFER、vbo [0]); \t glBufferData(GL_ARRAY_BUFFER、スペース*はsizeof(フロート)、nullptr、GL_DYNAMIC_DRAW); ' 頂点データが設定されている場合、私は次の行を使用します。 ' glBufferData(GL_ARRAY_BUFFER、カウント*のはsizeof(フロート)、頂点を、 GL_DYNAMIC_DRAW); ' しかし) ' glBufferSubData(GL_ARRAY_BUFFER、NULL、カウント*はsizeof(フロート)、(定数GLvoid *)頂点のためにそれをスワップアウト; ' モデルはもはやレンダリングしないようにします。私が間違っていることは何か考えていますか? –

関連する問題