1

我试图在我的原生黑莓 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 包含相应的纹理。tileCoordList是一种Square3D类型结构。

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

另一个问题。

如果我创建两个 VBO。假设我用它的 id 绑定第一个并复制数据并绘制它。然后是第二个,我也绑定它并复制数据并绘制它。现在如果我想再次绘制第一个,我需要再次绑定它吗?如果我需要再次绑定,是否还需要再次将数据复制到该 VBO 的缓冲区?

4

2 回答 2

3

它已经在注释中发生tileCoordList并且tileTextureCoordList是指向Square3D结构的指针。

这意味着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电话应该做什么;一般来说,一个简单glBufferData的就足够了。Bindcall 将缓冲区设置为活动缓冲区。

这条线让我畏缩 - 为什么是VBOId公开的?对我来说,这闻起来像是一个设计不佳的抽象:

glGenBuffers(1,&decompressTileImage->VBOId);

哦,不要使用this->. 它在这里唯一做的就是降低可读性。

于 2013-03-10T07:56:29.617 回答