glBufferData 崩溃
Crash on glBufferData
我在 glBufferData 遇到随机崩溃,而且它只发生在 Windows。 Mac OS 和 Linux 都没有问题。这是我的上传功能,它将我保存在内存中的所有内容上传到 GPU。 vertex
是一个浮点向量数组,它是:
std::vector<float> vertex[MAX_VBO];
并且代码在第一个 glBufferData 函数处随机崩溃,我调用它是随机的,因为它有时可以工作,但是当我的顶点数据很大时,它几乎肯定会崩溃。
void VertexBuffer::upload() {
glGenBuffers(5, vbo);
printf("VBO %d - %d - %d\n", vertex[vboPosition].size(), vertex[vboNormal].size(), indices.size());
if (vertex[vboPosition].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboPosition]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboPosition].size() * sizeof(float)*4, &vertex[vboPosition][0], GL_STATIC_DRAW);
}
if (vertex[vboNormal].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboNormal]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboNormal].size() * sizeof(float)*3, &vertex[vboNormal][0], GL_STATIC_DRAW);
}
if (vertex[vboColor].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboColor]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboColor].size() * sizeof(float)*4, &vertex[vboColor][0], GL_STATIC_DRAW);
}
if (vertex[vboUV].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboUV]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboUV].size() * sizeof(float)*2, &vertex[vboUV][0], GL_STATIC_DRAW);
}
if (vertex[vboTangent].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboTangent]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboTangent].size() * sizeof(float)*3, &vertex[vboTangent][0], GL_STATIC_DRAW);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenBuffers(1, &vboind);
if (indices.size() > 0) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboind);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
printf("Success \n");
}
更多信息:我已经尝试了发布和调试模式,以防微软编译器在向量之间放置奇怪的东西(不连续等),但它们是一样的。我也在使用 OpenGL 3.3 核心配置文件。
您传递给 glBufferData()
的大小似乎比数据的实际大小大得多。例如在这一个中:
std::vector<float> vertex[MAX_VBO];
...
glBufferData(GL_ARRAY_BUFFER, vertex[vboPosition].size() * sizeof(float)*4,
&vertex[vboPosition][0], GL_STATIC_DRAW);
因为 vertex[vboPosition]
是一个浮点向量,调用 .size()
returns 向量中的浮点数。然后将该值乘以 sizeof(float)
和 乘以 4,最后乘以 16。但是一个 float
只有 4 个字节,所以这是 4 倍太多了。
第二个参数是以字节为单位加载的数据量。所以正确的计算是:
glBufferData(GL_ARRAY_BUFFER, vertex[vboPosition].size() * sizeof(float),
&vertex[vboPosition][0], GL_STATIC_DRAW);
同样的事情适用于所有其他 glBufferData()
调用。
我在 glBufferData 遇到随机崩溃,而且它只发生在 Windows。 Mac OS 和 Linux 都没有问题。这是我的上传功能,它将我保存在内存中的所有内容上传到 GPU。 vertex
是一个浮点向量数组,它是:
std::vector<float> vertex[MAX_VBO];
并且代码在第一个 glBufferData 函数处随机崩溃,我调用它是随机的,因为它有时可以工作,但是当我的顶点数据很大时,它几乎肯定会崩溃。
void VertexBuffer::upload() {
glGenBuffers(5, vbo);
printf("VBO %d - %d - %d\n", vertex[vboPosition].size(), vertex[vboNormal].size(), indices.size());
if (vertex[vboPosition].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboPosition]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboPosition].size() * sizeof(float)*4, &vertex[vboPosition][0], GL_STATIC_DRAW);
}
if (vertex[vboNormal].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboNormal]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboNormal].size() * sizeof(float)*3, &vertex[vboNormal][0], GL_STATIC_DRAW);
}
if (vertex[vboColor].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboColor]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboColor].size() * sizeof(float)*4, &vertex[vboColor][0], GL_STATIC_DRAW);
}
if (vertex[vboUV].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboUV]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboUV].size() * sizeof(float)*2, &vertex[vboUV][0], GL_STATIC_DRAW);
}
if (vertex[vboTangent].size() > 0) {
glBindBuffer(GL_ARRAY_BUFFER, vbo[vboTangent]);
glBufferData(GL_ARRAY_BUFFER, vertex[vboTangent].size() * sizeof(float)*3, &vertex[vboTangent][0], GL_STATIC_DRAW);
}
glBindBuffer(GL_ARRAY_BUFFER, 0);
glGenBuffers(1, &vboind);
if (indices.size() > 0) {
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vboind);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), &indices[0], GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
}
printf("Success \n");
}
更多信息:我已经尝试了发布和调试模式,以防微软编译器在向量之间放置奇怪的东西(不连续等),但它们是一样的。我也在使用 OpenGL 3.3 核心配置文件。
您传递给 glBufferData()
的大小似乎比数据的实际大小大得多。例如在这一个中:
std::vector<float> vertex[MAX_VBO];
...
glBufferData(GL_ARRAY_BUFFER, vertex[vboPosition].size() * sizeof(float)*4,
&vertex[vboPosition][0], GL_STATIC_DRAW);
因为 vertex[vboPosition]
是一个浮点向量,调用 .size()
returns 向量中的浮点数。然后将该值乘以 sizeof(float)
和 乘以 4,最后乘以 16。但是一个 float
只有 4 个字节,所以这是 4 倍太多了。
第二个参数是以字节为单位加载的数据量。所以正确的计算是:
glBufferData(GL_ARRAY_BUFFER, vertex[vboPosition].size() * sizeof(float),
&vertex[vboPosition][0], GL_STATIC_DRAW);
同样的事情适用于所有其他 glBufferData()
调用。