为什么我的顶点缓冲区对象出现访问冲突错误?

Why I'm getting access violation errors with my Vertex Buffer Object?

这是我的 typdefs/global 个变量:

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 遇到了访问冲突。它适用于简单的顶点数组(因此数据数组可以很好地初始化)。谢谢。

glVertexPointer, glColorPointer and glTexCoordPointer 的最后一个参数必须是指向第一个顶点坐标和第一个属性的指针。

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

您想使用命名数组缓冲区,参数是属性的适当偏移量。但是此时缓冲区对象未绑定,因为您在创建和初始化缓冲区对象的数据存储之后执行 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]);

必须是:

glBindBuffer(GL_ARRAY_BUFFER, GL15_vbo[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)));