1

ネイティブの blackberry 10 アプリケーションで VBO を使用して正方形を描画しようとしています。私の実装は、

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_TEXTURE_2D);
    glEnableClientState(GL_VERTEX_ARRAY);
    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glGenBuffers(1,&decompressTileImage->VBOId);
    glBindBuffer(GL_ARRAY_BUFFER,decompressTileImage->VBOId);
    glBufferData(GL_ARRAY_BUFFER,sizeof(tileCoordList)+sizeof(tileTextureCoordList),0,GL_STATIC_DRAW);
    glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(tileCoordList),tileCoordList);
    glBufferSubData(GL_ARRAY_BUFFER,sizeof(tileCoordList),sizeof(tileTextureCoordList),tileTextureCoordList);

    glTexCoordPointer(3, GL_FLOAT, sizeof(tileTextureCoordList), (void*)sizeof(this->tileCoordList));
    glVertexPointer(3, GL_FLOAT, sizeof(tileCoordList), 0);

    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
    glDisable(GL_BLEND);
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisable(GL_TEXTURE_2D);

    swapBuffers();

ここで、 tileCoordList には正方形の座標が含まれ、 tileTextureCoordList には対応するテクスチャが含まれます。型構造ですtileCoordListSquare3D

typedef struct
{
 Vertex3D lowerLeft;
 Vertex3D lowerRight;
 Vertex3D upperLeft;
 Vertex3D upperRight;
}Square3D;

typedef struct
{
GLfloat x;
GLfloat y;
GLfloat z;
} Vertex3D;

4Vertex3Dは tileCoordList の正方形を表します。についても同様ですtileTextureCoordList。VBOなしでも綺麗に描けます。私はopengl-es 1.1を使用しています

別の質問です。

2 つの VBO を作成するとします。最初のものをそのIDでバインドし、データをコピーして描画したとします。それから 2 つ目もバインドし、データをコピーして描画します。最初のものをもう一度描きたい場合は、もう一度バインドする必要がありますか? 再度バインドする必要がある場合、データをその VBO のバッファに再度コピーする必要がありますか?

4

2 に答える 2

3

と が構造体へのポインタであることがコメントで明らかになりましたtileCoordListtileTextureCoordListSquare3D

これは、sizeof演算子が構造体のサイズではなく、ポインターのサイズを提供することを意味します。

たとえば、使用できます

glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(*tileCoordList), tileCoordList);

代わりは。

于 2013-03-12T13:49:08.917 に答える
1

バッファに奇妙なことをしています。データが正しく追加されているかどうtileCoordListかを判断するのは困難です。

一般に、ここでの両方の懸念について: VBO はデータを保存します。可能であるだけでなく、次のことをお勧めします。

vbo_1, vbo_2;

vbo1.LoadData(data_1);
vbo2.LoadData(data_2);

main_loop {
    vbo1.Bind();
    Draw();
    vbo2.Bind();
    Draw();
}

ここでは疑似コードを使用しましたが、アイデアは理解できるはずです。SubData呼び出しが何をすべきか理解できません。一般に、1 つの単純なglBufferDataもので十分です。Bind呼び出しは、バッファをアクティブなものとして設定します。

この行は私をうんざりさせました-なぜVBOId公開されているのですか? 私には、設計が不十分な抽象化のようなにおいがします。

glGenBuffers(1,&decompressTileImage->VBOId);

そしてああ、使わないでくださいthis->。ここで行う唯一のことは、読みやすさを悪化させることです。

于 2013-03-10T07:56:29.617 に答える