0

頂点バッファオブジェクトに表示されるデータを動的に編集する方法を探しています。glBufferSubData、glMapBuffer、glBufferDataなどを試しましたが、うまくいきませんでした。時間のかかるメソッドはglBindBufferであることがわかりました。私は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およびその他の変数は、データを含むFloatBufferです。次に、これらを次のようにレンダリングします。

    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);

VBOを編集する方法は次のとおりです。

    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メソッドを高速化する方法はありますか、それとも間違っていますか?また、最も効率的にデータを編集するにはどうすればよいですか。

4

1 に答える 1

0

Vertex Array Objectsを使用すると、描画部分を高速化できます。

アップロード部分については、コードは問題ありません。できることは「ダブルバッファリング」です。データのコピーを保持し、別のスレッドを使用して処理し(最近ではマルチプロセッサシステムが頻繁に使用されています)、glBufferSubDataでアップロードします。

もう 1 つのオプションは SIMD アセンブリの使用ですが、これはアプリケーションによって異なります。

于 2012-04-13T20:36:22.667 に答える