带有顶点缓冲区的“访问冲突读取位置”

Posted

技术标签:

【中文标题】带有顶点缓冲区的“访问冲突读取位置”【英文标题】:"Access Violation Reading Location" with Vertex Buffer 【发布时间】:2013-05-13 01:00:56 【问题描述】:

我正在尝试将以下代码转换为使用顶点缓冲区的代码:

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/图形非常陌生,很确定我搞砸了一些明显的东西。

【问题讨论】:

【参考方案1】:

这是行不通的。立即模式允许您省略在顶点之间重新指定未更改的属性。但是对于顶点数组,你不能这样做。您当前所做的是告诉 GL 它在缓冲区中的字节偏移量 14*sizeof(GLfloat)*i 处找到第 i 个顶点的 TexCoords。对于第一个顶点,它会起作用,但对于第二个,您尝试访问超出缓冲区末尾的数据。

您必须复制该数据,以便每个顶点在相同的布局中具有完全相同的属性。基本上,每个属性都需要一个顶点数组,每个顶点都有一个条目,无论值是否发生变化。

更好地将顶点视为不仅仅是位置(由glVertex 命令指定),而是相关属性的完整n元组。如果 any 属性的 any 单个组件不同,则不再认为是同一个顶点。

【讨论】:

以上是关于带有顶点缓冲区的“访问冲突读取位置”的主要内容,如果未能解决你的问题,请参考以下文章

如何在带有 Qt 的 OpenGL 中使用顶点缓冲区对象绘制矩形?

带有附加数据的 OpenGL 索引缓冲区对象

有没有办法在带有 Java 的 Android 的 OpenGL ES 2.0 中使用顶点缓冲区中的对象?

在两个不同的顶点数组对象中使用顶点缓冲区

如何在 Qt 中使用顶点缓冲区对象渲染地形?

如何在顶点缓冲区数组中制作一组多边形的多个副本?