2012-01-04 9 views
2

私は地形メッシュを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が良いと思っています。これは正しいと思いますか?

答えて

3

バッファオブジェクトmappingを使用します。バッファオブジェクトにはメモリ配列としてアクセスでき、実際には疎の頂点にアクセスできます。ドライバは(うまくいけば)あなたのためにそれを最適化します。

GL_DYNAMIC_DRAWの使用は正しいです。