簡體   English   中英

VBO沒有畫任何東西

[英]VBO doesn't draw anything

我想在我的原生黑莓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包含square的坐標,tileTextureCoordList包含相應的紋理。 tileCoordListSquare3D類型的結構。

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

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

4 Vertex3D表示Vertex3D的正方形。 tileTextureCoordList 我可以在沒有VBO的情況下畫得很好。 我正在使用opengl-es 1.1

另一個問題。

如果我創建兩個VBO。 假設我用它的id綁定第一個並復制數據並繪制它。 然后是第二個,我也綁定它並復制數據並繪制它。 現在,如果我想再次繪制第一個,我需要再綁定它嗎? 如果我需要再次綁定,我還需要將數據再次復制到該VBO的緩沖區嗎?

在評論中已經發現tileCoordListtileTextureCoordList是指向Square3D結構的指針。

這意味着sizeof運算符將為您提供指針的大小,而不是結構的大小。

你可以使用例如

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

代替。

你正在為緩沖區做一些奇怪的事情。 如果你正確地添加數據,很難說不知道tileCoordList是什么。

一般而言,關於您的兩個問題:VBO為您存儲數據。 不僅可以,而且鼓勵這樣做:

vbo_1, vbo_2;

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

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

我在這里使用了偽代碼,但你應該明白這個想法。 我不明白SubData調用應該做什么; 一般來說,一個簡單的glBufferData就足夠了。 Bind調用將緩沖區設置為活動緩沖區。

這條線讓我感到畏縮 - 為什么VBOId公開? 聞起來像是一個設計糟糕的抽象給我:

glGenBuffers(1,&decompressTileImage->VBOId);

哦, 不要使用this-> 它唯一能做的就是可讀性惡化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM