2013-05-13 119 views
0

我想下面這段代碼轉換成使用頂點緩衝區之一:「訪問衝突讀取位置」頂點緩衝區

glBegin (GL_QUADS); 
glTexCoord2fv (&_vertex[ci->index_list[7]].uv.x); 
glVertex3fv (&_vertex[ci->index_list[7]].position.x); 
glVertex3fv (&_vertex[ci->index_list[5]].position.x); 
glVertex3fv (&_vertex[ci->index_list[3]].position.x); 
glVertex3fv (&_vertex[ci->index_list[1]].position.x); 
glEnd(); 

我的錯誤代碼部分看起來是這樣的:

GLfloat * p = (GLfloat *) malloc(sizeof(GLfloat)*14); 
//Memcopies vertices into p pointer 
memcpy(&p[counter+0], &_vertex[ci->index_list[7]].uv.x, sizeof(GLfloat)*2); 
memcpy(&p[counter+2], &_vertex[ci->index_list[7]].position.x, sizeof(GLfloat)*3); 
memcpy(&p[counter+5], &_vertex[ci->index_list[5]].position.x, sizeof(GLfloat)*3); 
memcpy(&p[counter+8], &_vertex[ci->index_list[3]].position.x, sizeof(GLfloat)*3); 
memcpy(&p[counter+11], &_vertex[ci->index_list[1]].position.x, sizeof(GLfloat)*3); 

glGenBuffers(1, &vboId1); 
glBindBuffer(GL_ARRAY_BUFFER, vboId1); 
glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*14, p, GL_STATIC_DRAW_ARB); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnableClientState(GL_VERTEX_ARRAY); 

glTexCoordPointer(2, GL_FLOAT, sizeof(GLfloat)*14, (GLfloat*)0); 
glVertexPointer(3, GL_FLOAT, 0, 2+(GLfloat*)0); 
glDrawArrays(GL_QUADS, 0, 1); 

glDisableClientState(GL_TEXTURE_COORD_ARRAY); 
glDisableClientState(GL_VERTEX_ARRAY); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

但是,我在glDrawArrays行上得到了「訪問衝突讀取位置」錯誤。任何想法在這裏可能是錯的?我對OpenGL /圖形非常新,很確定我搞砸了一些明顯的東西。

回答

0

這是行不通的。立即模式允許您省略重新指定頂點之間未改變的屬性。但是對於頂點數組,你不能這麼做。你現在做的是告訴GL,它找到緩衝區中字節偏移14 * sizeof(GLfloat)* i的第i個頂點的TexCoords。對於第一個頂點,它將起作用,但第二個頂點會嘗試訪問超出緩衝區末尾的數據。

您必須複製該數據,以便每個頂點在相同的佈局中具有完全相同的屬性。基本上,每個屬性需要一個頂點數組,每個頂點有一個條目,不管它的值是否更改。

更好地將頂點視爲不僅僅是位置(由glVertex命令指定),而是相關屬性的完整n-tupel。如果任意單個組件任何屬性不同,則不再被視爲同一個頂點。