2

OpenGLコードは機能していますが、パフォーマンスを少し改善しようとしています(古いデバイスでフレームレートを少し上げたい)。頂点バッファオブジェクトを使用してこれを実行しようとしています。

私のコードは、テクスチャが適用された一連の360GL_TRIANGLESを描画するだけです。座標とテクスチャ座標をデータ構造に織り込みます。

typedef struct {
    GLfloat vertex[2];
    GLfloat texture[2];
    GLfloat padding[4];
} TextureVertex2D;

typedef struct {
    TextureVertex2D textureVertex[3];
} TextureTriangle2D;

これが私の初期化の関連部分です

textureTriangles = (TextureTriangle2D*)malloc(360 * sizeof(TextureTriangle2D));

glGenTextures(1, &texture[0]);
glBindTexture(GL_TEXTURE_2D, texture[0]);

// This section is the only new code introduced for the VBOs.
glGenBuffers(1, &buffer[0]);
glBindBuffer(GL_ARRAY_BUFFER, buffer[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(TextureTriangle2D)*360, textureTriangles[0].textureVertex[0].vertex, GL_DYNAMIC_DRAW);
// end new code    

glVertexPointer(2, GL_FLOAT, sizeof(TextureVertex2D), textureTriangles[0].textureVertex[0].vertex);
glTexCoordPointer(2, GL_FLOAT, sizeof(TextureVertex2D), textureTriangles[0].textureVertex[0].texture);

/*
textureTriangles is filled and the texture image is loaded in
*/

実際のVBOに保存するために、2つの方法を試しました(どちらも同じ結果になりました)

// Option 1
GLvoid* vbo_buffer = glMapBufferOES(GL_ARRAY_BUFFER, GL_WRITE_ONLY_OES);
memcpy(vbo_buffer, textureTriangles[0].textureVertex[0].vertex, 360 * sizeof(TextureTriangle2D));
glUnmapBufferOES(GL_ARRAY_BUFFER); 

// Option 2
glBufferSubData(GL_ARRAY_BUFFER, sizeof(TextureVertex2D), 360 * sizeof(TextureTriangle2D), textureTriangles[0].textureVertex[0].vertex);

次に、バッファをバインドします

glBindBuffer(GL_ARRAY_BUFFER, buffer[0]);

そして最後に描画を実行します

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glDrawArrays(GL_TRIANGLES, 0, 3*360);

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

VBOがない場合、描画は正常に機能します。上記のVBOコードを追加すると、描画が適切な場所になくなり(数ピクセルオフセット)、アプリ全体がロックされます。何か案は?

4

2 に答える 2

1

VBOを使用する場合、toの最後の引数gl...Pointerは、頂点データを含む配列へのポインターではなく、現在バインドされているへのバイトオフセットGL_ARRAY_BUFFERです。したがって、すでにバッファにコピーしたCPU頂点データのアドレスを指定するのではなく、属性が格納されているこのバッファデータのオフセットを指定します。

glVertexPointer(2, GL_FLOAT, sizeof(TextureVertex2D), 
    offsetof(TextureVertex2D,vertex));
glTexCoordPointer(2, GL_FLOAT, sizeof(TextureVertex2D), 
    offsetof(TextureVertex2D,texture));
于 2012-01-06T18:32:03.277 に答える
0

この行で:

glBufferData(GL_ARRAY_BUFFER, sizeof(TextureTriangle2D)*360, textureTriangles[0].textureVertex[0].vertex, GL_DYNAMIC_DRAW);

sizeof(TextureTriangle2D)*360*3各三角形(GL_TRIANGLES配列の描画要求で使用)には3つの頂点座標が必要なので、指定する必要があると思います。

2つの座標だけを使用して3D座標を渡すことについての情報はあまりありませんが(Zをゼロに固定していると思いますか?)、宣言自体はあなたの側でレビューする必要があります

私は期待していたでしょう:

typedef struct {
    GLfloat vertex[3];
    GLfloat texture[2];
    GLfloat padding[3];
} TextureVertex2D;

しかし、これはエンジンに大きく依存します。

于 2012-01-06T12:53:33.657 に答える