私は、頂点バッファオブジェクトに対して表示されるデータを動的に編集する方法を探しています。私はglBufferSubData、glMapBuffer、glBufferDataなどを試しましたが、運がなかったのです。私は時間のかかるメソッドがglBindBufferであることを発見しました。私はVBOを正しく使用していると思いますが、私は完全にはわかりません。相続人は私の問題のいくつかのサンプルコード:動的にVBOを動的に編集する方法
verticesId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, verticesId);
glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
normalsId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, normalsId);
glBufferData(GL_ARRAY_BUFFER, normalsBuffer, GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
texturesId = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, texturesId);
glBufferData(GL_ARRAY_BUFFER, texturesBuffer, GL_STREAM_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
verticesBufferと他の変数は、それらのデータを持っているFloatBuffersです。次に、私は彼らにこの方法をレンダリングする:ここで
glEnableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, verticesId);
glVertexPointer(vertexSize, GL_FLOAT, 0, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, texturesId);
glTexCoordPointer(2, GL_FLOAT, 0, 0);
glDrawArrays(GL_QUADS, 0, amountOfVertices);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
は私がVBOsを編集する方法です:
int position = 0;
///////////////////////////////////////////////////////////////////
glBindBuffer(GL_ARRAY_BUFFER, verticesId);
mapBuffer = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY, null);
verticesBuffer = mapBuffer.order(ByteOrder.nativeOrder()).asFloatBuffer();
verticesBuffer.position(position);
// ... edit some values in the 'vertices' float array ...
verticesBuffer.put(vertices);
verticesBuffer.rewind();
glUnmapBuffer(GL_ARRAY_BUFFER);
glBindBuffer(GL_ARRAY_BUFFER, 0);
はglBindBuffer方法をスピードアップする方法はありますか、私はこの間違っているのでしょうか?また、最も効率的にデータを編集する方法もあります。
これらのVBOを実際に変更する場所でコードを入力できますか?あるいはフレームごとにそれらを作り直すことができますか? – fen
申し訳ありません、少し曖昧です。私はいくつかの大きなコードから必要な部分だけを取得しようとしています。 –