0

我正在尝试将顶点缓冲区添加到像素城市程序城市生成程序的 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 教程,我尝试将其转换为使用这样的顶点缓冲区(我将 vboId 存储在 Mesh.h 中):

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 中时,我真的歪斜了屏幕上绘制的/垃圾数据(或程序崩溃),但没有任何东西可以接近远程工作。

4

1 回答 1

1

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

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

附带说明:如果您要创建具有正确大小但NULL作为数据指针(基本上创建数据存储)和内存映射它的 VBO,您可以保存额外的数据副本glMapBuffer(),完全避免malloc()您使用的 ed 临时缓冲区.

于 2013-05-12T18:35:57.317 回答