我正在尝试向程序化城市生成程序的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时,我真的倾斜/垃圾在屏幕上绘制数据(或程序崩溃),但没有任何东西甚至接近远程工作。
对每个循环迭代使用一个新的缓冲区有点失败的目的。 – 2013-05-12 18:35:42
此外,这将会在几帧后失败,因为你正在快速泄漏VBO内存。 – 2013-05-12 18:40:25
我打算先让它工作,然后再把它移到循环之外。 – benjammin 2013-05-12 18:55:42