16

OpenGLある種のバッチ描画を実装するために使用しています。このために、vertex bufferデータを保存する を作成します。

注: 通常、このバッファはフレームごとに更新されますが、サイズが減少することはありません (ただし、増加する可能性はあります)。

私の質問は次のとおりです。それを更新するために(たとえばの代わりに)glBufferData( s で)使用することは技術的に正しいですか?完全なデータが更新されるため、マップする必要はないと思います。そのため、完全なパックを一度に送信します。また、現在のバッファ サイズが送信しているサイズよりも小さい場合は、自動的に大きくなりますね。私は今、それが実際にどのように機能するかを確信しています(おそらく、呼び出しごとにバッファを再作成しますよね?)。treaming write-only modeglMapBuffer

4

2 に答える 2

14

固定サイズのバッファを用意し、フレームごとに再作成しない方がよいでしょう。

これは次の方法で実現できます。

  • 最大サイズのバッファを作成します。たとえば、1000頂点のスペースです
  • バッファの先頭のみを新しいデータで更新します。したがって、500 個の頂点のデータを変更した場合は、glMapBuffer を使用してバッファーの前半のみを埋めます。
  • 描画時に描画される頂点の数を変更します。たとえば、1000 個の頂点バッファ全体から特定の範囲の頂点 (たとえば、200 から 500) のみを使用できます。glDrawArrays(mode, first, count)を使用する

コメントからのアイデア:

  • glMapBufferRange と glBufferSubData も役立ちます
  • バッファのダブルバッファリングも考慮する

リンク: http://hacksoflife.blogspot.com/2010/02/double-buffering-vbos.html

それが役立つことを願っています

于 2013-01-04T11:11:01.757 に答える
5

fen と datenwolf の発言に加えて、OpenGL Insights の第 22 章を参照してください。特に、さまざまなハードウェアとテクニックのタイミングが含まれています。

于 2013-01-05T00:04:00.050 に答える