首页 文章

glBufferData崩溃

提问于
浏览
1

我在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核心配置文件 .

1 回答

  • 2

    您传递给 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() 将返回向量中的浮点数 . 然后将该值乘以 sizeof(float) and 乘以4,最后将其乘以16.但是一个 float 只有4个字节,因此这是4倍太多 .

    第二个参数是要以字节为单位加载的数据量 . 所以正确的计算是:

    glBufferData(GL_ARRAY_BUFFER, vertex[vboPosition].size() * sizeof(float),
                &vertex[vboPosition][0], GL_STATIC_DRAW);
    

    同样的事情适用于所有其他 glBufferData() 调用 .

相关问题