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 に関するいくつかの部分があります。
すべてのフレームで要素が完全に更新される動的頂点バッファを作成するための正しいコマンド順序は?
頂点バッファはフレーム間で大きくなりますか? または、まったく同じサイズでフラッシュする必要がありますか?
「クライアントメモリ」ポインターの使用について知っていますが、OpenGL ES 2.0 でこれを行うことができますか (memcpy を回避するため)、または非推奨であり、頂点バッファーのみを使用する必要がありますか?