現在、水をシミュレートするプログラムを書いています。これが私がするステップです:
- 水面を作成します-平面。
- VAOを作成する
- 法線と頂点を格納する頂点バッファオブジェクトを作成します。
- このVBOへのポインターをバインドします。
- インデックスバッファオブジェクトを作成します。
次に、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
オシレーター-これはオシレーター構造の配列です。
私は何を間違えますか?