我正在尝试将顶点缓冲区添加到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中时,我确实在屏幕上绘制了乱码/垃圾数据(或程序崩溃),但是没有任何东西甚至接近远程工作。
答案 0 :(得分:1)
您的顶点指针错误。使用VBO时,指针被解释为相对于当前绑定缓冲区的字节偏移量。因此,您需要sizeof(GLfloat)* 2个字节作为偏移量。
glVertexPointer(3, GL_FLOAT, sizeof(GLfloat)*5, (char*)0 +sizeof(GLfloat)*2);
作为旁注:如果您要创建具有正确大小的VBO,但是NULL
作为数据指针(基本上创建数据存储)并使用{存储映射它',则可以保存其他数据副本{1}},完全避免使用glMapBuffer()
ed临时缓冲区。