[英]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包含相应的纹理。 tileCoordList
是Square3D
类型的结构。
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的缓冲区吗?
在评论中已经发现tileCoordList
和tileTextureCoordList
是指向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.