2013-05-13 120 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。如果任意单个组件任何属性不同,则不再被视为同一个顶点。