gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 03:18:38 26 4
gpt4 key购买 nike

这是我的类型定义/全局变量:

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的最后一个参数, glColorPointerglTexCoordPointer必须是指向第一个顶点坐标和第一个属性的指针。

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

您想使用命名数组缓冲区,参数是属性的适当偏移量。但此时缓冲区对象未绑定(bind),因为您在创建和初始化缓冲区对象的数据存储之后执行 glBindBuffer(GL_ARRAY_BUFFER, 0);。仅在指定属性后才再次绑定(bind)缓冲区:

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)));

关于c++ - 为什么我的顶点缓冲区对象出现访问冲突错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54536582/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com