我正在嘗試向程序化城市生成程序的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