2012-04-11 7 views
0

私は、頂点バッファオブジェクトに対して表示されるデータを動的に編集する方法を探しています。私は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方法をスピードアップする方法はありますか、私はこの間違っているのでしょうか?また、最も効率的にデータを編集する方法もあります。

+1

これらのVBOを実際に変更する場所でコードを入力できますか?あるいはフレームごとにそれらを作り直すことができますか? – fen

+0

申し訳ありません、少し曖昧です。私はいくつかの大きなコードから必要な部分だけを取得しようとしています。 –

答えて

0

Vertex Array Objectsを使用すると、描画部分のスピードを向上させることができます。

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

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

関連する問題