2013-05-12 142 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