VBO不画任何东西(VBO doesn't draw anything)

2019-08-17 10:44发布

我试图绘制VBO方在我的家乡黑莓10应用。 我的实现,

    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;

4 Vertex3D表示tileCoordList正方形。 这同样适用于tileTextureCoordList 。 无VBO我可以得出罚款虽然。 我使用的OpenGL ES 1.1

另一个问题。

如果我创建了两个维也纳组织。 假设我绑定的第一个与它的ID和复制的数据,并提请它。 然后就是第二个,我也绑定并复制数据并绘制它。 现在,如果我想再次提请第一个,我需要重新绑定呢? 如果我需要绑定一次,我需要复制的数据缓冲为VBO再也?

Answer 1:

它已经蒸发了,该意见tileCoordListtileTextureCoordList是指向Square3D结构。

这意味着sizeof操作符会给你一个指针的大小,而不是结构的大小。

你可以使用如

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

代替。



Answer 2:

你在做你的缓冲区很奇怪。 不知道什么tileCoordList是很难说,如果你正确地添加数据。

在一般情况下,对于您的两个关注位置:维也纳组织存储数据为您服务。 它不仅是可能的,但鼓励这样做:

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-> 。 在这里做的唯一事情是恶化的可读性。



文章来源: VBO doesn't draw anything