私は地形メッシュをVBOに格納しています。メッシュは直角三角形で構成されるグリッドです。つまり、対角線を持つ直線のグリッドのように見えます。メッシュの幅と高さはわかっているので、与えられたXYの頂点インデックスを計算するのは簡単です。OpenGL 2.1:VBOのサブ領域を再バッファリング
地形メッシュは編集可能です。私の質問は、地形が編集されたときに頂点データを再バッファリングすることです。私は任意の編集操作で汚れている頂点の矩形領域を決定することができるので、明らかにそれらを再バッファし、残りを単独で残したいと思います。
最初に気になるのはglBufferSubData
です。しかし、glBufferSubData
が汚れた頂点にしか影響しないように、私はVBOをレイアウトする方法を考え出すことができません。たとえば、私のメッシュが5×5頂点であるとします。 (実際にはるかに大きいであろう。これはほんの一例である。)このように:
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
(図中の各数値は、上記頂点のVBOの先頭からのオフセットを表す。)
が仮定します中央の3 x 3領域を再バッファリングする必要があります。つまり、私は私はglBufferSubData
インデックス6で始まり18で終わる呼び出すことができ、頂点6、7、8、11、12、13、16、17、及び18をヒットする手段:
0 1 2 3 4
5 *6 *7 *8 *9
*10 *11 *12 *13 *14
*15 *16 *17 *18 19
20 21 22 23 24
(で上の図は、*
が再緩衝されていると、頂点が)。10、14、および15が汚れていない頂点
お知らせをマークし、まだ彼らはglBufferSubData
に与えられた範囲内にいるので、彼らは、再緩衝ます。これは私を非効率的なものにする。大きなメッシュの場合、ほとんどの場合、必要以上にデータを再バッファリングしています。
この問題のよく知られた解決策はありますか?行ごとにglBufferSubData
を1回呼び出す必要があります(これは現在の問題を解決しますが、独自のオーバーヘッドを伴います)。それとも、全範囲をバッファリングし、不要な書面のコストを食べるだけの標準ですか?
また、地形の編集は時々起こりますが、頻繁ではありません。それがアニメーションされると、アニメーションが実行されている間に汚れた頂点を繰り返し更新する必要があります。私はGL_DYNAMIC_DRAW
が良いと思っています。これは正しいと思いますか?