10

OpenGL 2.0 の iOS で頂点配列を更新すると、元の頂点データが画面に残ります。つまり、最初のフラッシュは永続的です (GPU に送信した最初のポイント セットはフレームごとにレンダリングされます)。 、3番目、4番目、.. n番目のフラッシュはすべて同じメモリを上書きしているようです。

だから私はやっている:

vector<VertexType> rawDynamicData ;

glGenVertexArraysOES( 1, &va ) ;        CHECK_GL ;
glBindVertexArrayOES( va ) ;            CHECK_GL ;
glGenBuffers( 1, &vb ) ;                CHECK_GL ;
glBindBuffer( GL_ARRAY_BUFFER, vb ) ;   CHECK_GL ;

glBufferData( glBufferData(
  GL_ARRAY_BUFFER, //Specifies the target buffer object.
  rawDynamicData.size() * sizeof( VertexType ),
  &rawDynamicData[0],
  GL_DYNAMIC_DRAW  // I plan to update the data every frame
) ;  CHECK_GL ; 

後続のフレームでは、もう一度呼び出しています。

// update the data
glBufferData( glBufferData(
  GL_ARRAY_BUFFER, //Specifies the target buffer object.
  rawDynamicData.size() * sizeof( VertexType ),
  &rawDynamicData[0],
  GL_DYNAMIC_DRAW  // I plan to update the data every frame
) ;  CHECK_GL ; 

私も試しました

//update the data
GLvoid* vbo_buffer = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES); 
memcpy(vbo_buffer, &rawDynamicData[0], rawDynamicData.size()*sizeof(VertexType) );
glUnmapBufferOES(GL_ARRAY_BUFFER); 

しかし、どちらの方法でも、次のようになります。

ここに画像の説明を入力

白い点は初期データで、赤い点はその後の呼び出しの結果です。glBufferData

したがって、この質問には、OpenGL ES 2.0 の動的 vbo に関するいくつかの部分があります。

  1. すべてのフレームで要素が完全に更新される動的頂点バッファを作成するための正しいコマンド順序は?

  2. 頂点バッファはフレーム間で大きくなりますか? または、まったく同じサイズでフラッシュする必要がありますか?

  3. 「クライアントメモリ」ポインターの使用について知っていますが、OpenGL ES 2.0 でこれを行うことができますか (memcpy を回避するため)、または非推奨であり、頂点バッファーのみを使用する必要がありますか?

4

2 に答える 2

6

失火#1

ここで、配列内のデータの駐車に使用し、初期割り当てにのみ使用することを示した回答を見つけました。最終的にこれは機能しませんでした (vb が大きすぎる場合、最初の 3 つの要素のみが更新されます)。glSubBufferDataglBufferData

そう、

glBufferData( glBufferData(
  GL_ARRAY_BUFFER, //Specifies the target buffer object.
  rawDynamicData.size() * sizeof( VertexType ),
  0, // NO INITIAL DATA
  GL_DYNAMIC_DRAW  // I plan to update the data every frame
) ;  CHECK_GL ; 

次に、最初その後の更新の場合:

// Update the whole buffer
glBufferSubData(GL_ARRAY_BUFFER, 0,
  rawDynamicData.size()*sizeof(VertexType), &rawDynamicData[0]) ;

それはうまくいったようです。

思われた。しかし、そうではありませんでした。

機能させるために私ができる唯一のことは、頂点バッファーの使用をやめ、クライアント メモリの頂点配列を使用することでした。

これは次のようになります。

// do all your vertex attrib/glVertexAttrib enable commands:
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPC), &debugPoints->data[0].pos.x) ;
CHECK_GL ;
glEnableVertexAttribArray(0);  CHECK_GL ;

// ..do glVertexAttrib* for all attributes you have..

// then just flush your draw command
glDrawArrays(GL_POINTS, 0, debugPoints->data.size());  

つまり、動的データに頂点バッファーを使用することは困難であるサポートされていないことがわかりました。

于 2012-09-22T10:56:23.363 に答える