私は現在、LWJGLを使用してJava1.6で記述された2DトップダウンRPGに取り組んでいます。ゲームにVBOの使用を実装しましたが、現在は2つを維持しています。1つは頂点データ用で、もう1つはテクスチャ座標用です。
オブジェクトを更新するための本当に論理的な方法がまだないことを除いて、すべて正常に機能しています。例として、特定のタイルにテクスチャを変更させたい場合(テクスチャシートの別の領域を表示するためにVBO内のテクスチャ座標を変更する)、対応するテクスチャ座標のみを変更する方法がわかりません。この単一のタイル。今考えられるのは、ループごとに必要なすべてのデータでバッファーをいっぱいにし、フレームごとにglBufferDataでアップロードすることだけです。それは機能しますが、それを行うための最良の方法ではないようです(またはそうですか?)。
ここで、新しいメモリを割り当てず、変更するように指示した部分のみを変更するglBufferSubDataコマンドがあります。問題は、変更する必要のある領域(オフセット)を追跡する方法がわからないことです。LWJGLはglBufferSubData(target、offset、data);を提供します。コマンド。これは、バッファの開始のみが機能する必要があります。オフセットはインデックスのようなものですか?
したがって、最初にこれらのバッファをVBOにアップロードしてから、2番目のfloat[]の2番目の値を変更したい場合:
FloatBuffer vertexData = BufferUtils.createFloatBuffer(amountOfVertices * vertexSize);
vertexData.put(new float[]{100, 100, 300, 100, 300, 300, 100, 300});
vertexData.put(new float[]{400, 100, 600, 100, 600, 300, 400, 300});
vertexData.flip();
新しいデータを生成し、それを小さなFloatBuffer内に配置し、glBufferSubData(GL_VERTEX_ARRAY、10、newFloatBuffer);でアップロードします。10は、10番目の古い値から値を変更したいためです。
そうですか?それを行うためのより良い方法はありますか?また、フレームごとにデータ全体を再アップロードしても大丈夫ですか?