2013-05-12 162 views
0

我正在尝试向程序化城市生成程序的pixel city的Mesh.cpp文件添加一个顶点缓冲区。部分当前代码如下所示:C++顶点缓冲区问题

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

+2

对每个循环迭代使用一个新的缓冲区有点失败的目的。 – 2013-05-12 18:35:42

+0

此外,这将会在几帧后失败,因为你正在快速泄漏VBO内存。 – 2013-05-12 18:40:25

+0

我打算先让它工作,然后再把它移到循环之外。 – benjammin 2013-05-12 18:55:42

回答

1

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

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

作为一个方面说明:你可以节省额外的数据副本,如果你要使用正确的大小,但NULL作为数据指针(这基本上创建了数据存储)和内存映射它glMapBuffer()创建VBO ,完全避免了您使用的malloc() ed临时缓冲区。

+0

非常感谢你!这解决了它!绝对希望我早些时候发布了这个消息,这会为我节省很多麻烦:)我还会研究使用glMapBuffer()。 – benjammin 2013-05-12 18:59:05

+0

'2 +(GLfloat *)0'怎么样? – 2013-05-12 19:19:35

+0

@BenVoigt:好吧,如果你喜欢那样更好。为什么不'2 [(GLfloat *)0]'? – derhass 2013-05-12 19:30:30