C ++顶点缓冲区问题

时间:2013-05-12 18:25:55

标签: c++ opengl vbo

我正在尝试将顶点缓冲区添加到pixel city程序城市生成程序的Mesh.cpp文件中。当前代码的一部分如下所示:

for (qsi = _quad_strip.begin(); qsi < _quad_strip.end(); ++qsi) {
  glBegin (GL_QUAD_STRIP);
  for (n = qsi->index_list.begin(); n < qsi->index_list.end(); ++n) {
    glTexCoord2fv (&_vertex[*n].uv.x);
    glVertex3fv (&_vertex[*n].position.x);
  }
    glEnd ();
}

这会将纹理绘制到某些建筑物的矩形边上。刚刚离开我在网上找到的VBO教程,我尝试将其转换为使用顶点缓冲区(我在Mesh.h中存储vboId):

for (qsi = _quad_strip.begin(); qsi < _quad_strip.end(); ++qsi) {
    void * varray = (char *) malloc(sizeof(GLfloat)*5*qsi->index_list.size());
    GLfloat *p = (GLfloat*)varray;

    int counter = 0;
    for (n = qsi->index_list.begin(); n < qsi->index_list.end(); ++n) {
      memcpy(&p[counter+0],&_vertex[*n].uv.x, sizeof(GLfloat)*2);
      memcpy(&p[counter+2],&_vertex[*n].position.x, sizeof(GLfloat)*3);
      counter+=5;
    }
    glGenBuffersARB(1, &vboId);
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, sizeof(GLfloat)*5*qsi->index_list.size(), p, GL_STATIC_DRAW_ARB);

    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
    glEnableClientState(GL_VERTEX_ARRAY);

    glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat)*5, (GLfloat*)0); 
    glVertexPointer(3, GL_FLOAT, sizeof(GLfloat)*5,  (GLfloat*)2);

    glDrawArrays(GL_QUAD_STRIP, 0, qsi->index_list.size());

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0);

    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    glDisableClientState(GL_VERTEX_ARRAY);

    free(varray);
   }

但是,此代码根本不起作用。什么都没有呈现。有时候,当我把参数搞砸到glTexCoordPointer或glVertexPointer中时,我确实在屏幕上绘制了乱码/垃圾数据(或程序崩溃),但是没有任何东西甚至接近远程工作。

1 个答案:

答案 0 :(得分:1)

您的顶点指针错误。使用VBO时,指针被解释为相对于当前绑定缓冲区的字节偏移量。因此,您需要sizeof(GLfloat)* 2个字节作为偏移量。

glVertexPointer(3, GL_FLOAT, sizeof(GLfloat)*5,  (char*)0 +sizeof(GLfloat)*2);

作为旁注:如果您要创建具有正确大小的VBO,但是NULL作为数据指针(基本上创建数据存储)并使用{存储映射它',则可以保存其他数据副本{1}},完全避免使用glMapBuffer() ed临时缓冲区。