0

古いコンテンツを吹き飛ばすことなく、VBO にデータを追加することは可能ですか? 基本的に、古いコンテンツを保持したまま VBO のサイズを変更する方法はありますか?

たとえば、VBO 内のメモリの抽象的な表現が次のようになるように、VBO 内のいくつかの色 (CrCgCb) と位置 (PxPy) データをインターリーブして、2 つの三角形を使用して正方形を表すとします。

 [P1x,P1y,C1r,C1g,C1b,P2x,P2y,C2r,C2g,C2b,P3x,P3y,C3r,C3g,C3b,P4x,P4y,C4r,C4g,C4b,P5x,P5y,C5r,C5g,C5b,P6x,P6y,C6r,C6g,C6b]

いくつかのイベントが発生し、突然別の正方形が生まれ、データが次のようになるように同じ VBO に配置したいと考えています。

[P1x,P1y,C1r,C1g,C1b,P2x,P2y,C2r,C2g,C2b,P3x,P3y,C3r,C3g,C3b,P4x,P4y,C4r,C4g,C4b,P5x,P5y,C5r,C5g,C5b,P6x,P6y,C6r,C6g,C6b,P7x,P7y,C7r,C7g,C7b,P8x,P8y,C8r,C8g,C8b,P9x,P9y,C9r,C9g,C9b,P10x,P10y,C10r,C10g,C10b,P11x,P11y,C11r,C11g,C11b,P12x,P12y,C12r,C12g,C12b]

データの最初のバッチを配置するには、次のようにします。

  GLuint vbo;
  glGenBuffers(1, &vbo);
  float verticies[6 * 2 + 6 * 3] = ...;
  glBindBuffer(GL_ARRAY_BUFFER, vbo);
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);

そこに2番目の正方形を取得するには、通常、次のようにします。

  glDeleteBuffers(1, &vbo);
  glGenBuffers(1, &vbo);
  float verticies[12 * 2 + 12 * 3] = ...;
  glBindBuffer(GL_ARRAY_BUFFER, vbo);
  glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_DYNAMIC_DRAW);

電話をかけずにこれを行うにはどうすればよいですglDeleteBuffers()か?

4

1 に答える 1

1

glBufferSubData を探しています。これはバッファのサイズを変更できませんが、既存のバッファ内のデータを変更できます。バッファが最初から十分な大きさであることを確認してください。一般的なパターンは、BufferData と null ポインターを使用してバッファーを特定のサイズに初期化し、その一部のみを BufferSubData で変更することです。

于 2013-06-29T08:21:58.890 に答える