3

現在、水をシミュレートするプログラムを書いています。これが私がするステップです:

  1. 水面を作成します-平面。
  2. VAOを作成する
  3. 法線と頂点を格納する頂点バッファオブジェクトを作成します。
  4. このVBOへのポインターをバインドします。
  5. インデックスバッファオブジェクトを作成します。

次に、glDrawElementsを使用してこの平面をレンダリングしてから、水面の頂点の位置を変更するupdate()関数を呼び出します。その後、glBufferSubData関数を呼び出して、頂点の位置を更新します。

私がそうすると、バッファが変更されていないかのように何も起こりません。

コードスニペットは次のとおりです。

glGenBuffers(1, &vertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(Oscillator) * nOscillators, oscillators, GL_DYNAMIC_DRAW);

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Oscillator), 0);
glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(Oscillator), (const GLvoid*)12);
glEnableVertexAttribArray(0);  // Vertex position
glEnableVertexAttribArray(2);  // normals position

glGenBuffers(1, &indicesBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * nIndices, indices, GL_DYNAMIC_DRAW);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesBuffer);
glBindVertexArray(0);

次に、レンダリングします。

glBindVertexArray(vaoHandle);
glDrawElements(GL_TRIANGLES, nIndices, GL_UNSIGNED_INT, 0); 
update(time);

そして更新機能:

//some calculations
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Oscillator) * nOscillators, oscillators);

オシレーター-それぞれ8つのフロートを持つ構造です-x、y、z(頂点位置)、nx、ny、nz(法線)、upSpeed、newY

オシレーター-これはオシレーター構造の配列です。

私は何を間違えますか?

4

1 に答える 1

1

データを更新する前に、正しいバッファーをバインドする必要があります。例えば:

glBindBuffer(GL_ARRAY_BUFFER, vertexBuffer);

バッファ全体を一度に更新しているので、glMapBufferを使用して更新することをお勧めします

void* data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
//[...] update the buffer with new values
bool done = glUnmapBuffer(GL_ARRAY_BUFFER);

また、glバッファにコピーするデータを変更する前に、glFlush()を待つ(または強制する)ことを忘れないでください。

于 2014-09-10T08:53:09.397 に答える