为什么我的Vertex Buffer Object出现访问冲突错误?

时间:2019-02-05 14:27:22

标签: c++ opengl vbo

这是我的typdefs /全局变量:

static GLuint GL15_vbo[2];

typedef struct {
    fvec3 pos;
    fvec3 col;
    fvec2 uv;
} MyVertex;

typedef struct {
    GLuint a;
    GLuint b;
    GLuint c;
} TriFace;

这是我的初始化代码:

glGenBuffers(2, (GLuint *)&GL15_vbo);

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, GL15_vbo[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(faces), faces, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

这是我的渲染代码:

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, pos)));
glColorPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, col)));
glTexCoordPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, uv)));

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, GL15_vbo[1]);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

for (int iface = 0; iface < 12; iface++) {
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, (const void *)(iface * sizeof(TriFace)));
}

glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

您能告诉我,我的代码有什么问题吗?我在glDrawElements遇到访问冲突。它与简单的“顶点数组”一起很好地工作(因此,数据数组初始化良好)。谢谢。

1 个答案:

答案 0 :(得分:2)

glVertexPointerglColorPointerglTexCoordPointer的最后一个参数必须是分别指向第一个顶点坐标和第一个属性的指针。

如果绑定了一个非零的命名缓冲区对象,那么该参数将被视为数组缓冲区对象的数据存储区中的字节偏移。

您要使用命名数组缓冲区,并且参数是属性的适当偏移量。但是此时缓冲区对象尚未绑定,因为您在创建和初始化缓冲区对象的数据存储之后执行marquee { display: flex; justify-content: space-between; } 。 仅在指定属性后,缓冲区才会再次绑定:

glBindBuffer(GL_ARRAY_BUFFER, 0);

必须为:

glVertexPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, pos)));
glColorPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, col)));
glTexCoordPointer(3, GL_FLOAT, sizeof(MyVertex), (const void *)(offsetof(MyVertex, uv)));

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[0]);