Search code examples
c++openglbufferglm-math

glBufferData() not updating buffers outside of the main function?


In my code I have a function called CompileRawBufferData(), this function compiles my array of custom classes into raw data that the buffer can read. The array of VBufferObjects is really just the same as the normal data, except with a bufferSignature so I can identify the object when I need to delete it from the buffers. VBufferObject looks like this:

namespace Vega
{
    class VBufferObject
    {
    public:
        unsigned int bufferSignature;

        std::vector<unsigned int> IBD;
        std::vector<glm::vec3> VBD;
        std::vector<glm::vec2> UVBD;
        std::vector<glm::vec3> NBD;
    };
}

This is then passed into my CompileRawBufferData() function which looks like this:

void VInstance::CompileRawBufferData
(
    std::vector<unsigned int>& IBD,
    std::vector<glm::vec3>& VBD,
    std::vector<glm::vec2>& UVBD,
    std::vector<glm::vec3>& NBD
)
{
    std::vector<unsigned int> IBData;
    std::vector<glm::vec3> VBData;
    std::vector<glm::vec2> UVBData;
    std::vector<glm::vec3> NBData;

    for (VBufferObject object : objectBuffer)
    {
        IBData.insert(IBData.end(), object.IBD.begin(), object.IBD.end());
        VBData.insert(VBData.end(), object.VBD.begin(), object.VBD.end());
        UVBData.insert(UVBData.end(), object.UVBD.begin(), object.UVBD.end());
        NBData.insert(NBData.end(), object.NBD.begin(), object.NBD.end());
    }

    IBD = IBData;
    VBD = VBData;
    UVBD = UVBData;
    NBD = NBData;

    glBufferData(GL_ARRAY_BUFFER, VBD.size() * sizeof(glm::vec3), &VBD[0], GL_DYNAMIC_DRAW);
    glBufferData(GL_ARRAY_BUFFER, UVBD.size() * sizeof(glm::vec2), &UVBD[0], GL_DYNAMIC_DRAW);
    glBufferData(GL_ARRAY_BUFFER, NBD.size() * sizeof(glm::vec3), &NBD[0], GL_DYNAMIC_DRAW);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, IBD.size() * sizeof(unsigned int), &IBD[0], GL_DYNAMIC_DRAW);
}

So everytime I want to update the objects in a scene (add or delete them) I call:

Loader::LoadObject("OBJECT PATH", objectBuffer, newestSignature);
CompileRawBufferData(IBD, VBD, UVBD, NBD);

The LoadObject() function loads and adds the new object to the objectBuffer and then I compile the raw buffer data to be assigned to each of the buffers.

When I use the glBufferData() in the main function like this:

    GLuint VertexBuffer;
    glGenBuffers(1, &VertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, VBD.size() * sizeof(glm::vec3), &VBD[0], GL_DYNAMIC_DRAW);

    GLuint UVBuffer;
    glGenBuffers(1, &UVBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, UVBuffer);
    glBufferData(GL_ARRAY_BUFFER, UVBD.size() * sizeof(glm::vec2), &UVBD[0], GL_DYNAMIC_DRAW);

    GLuint NormalBuffer;
    glGenBuffers(1, &NormalBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, NormalBuffer);
    glBufferData(GL_ARRAY_BUFFER, NBD.size() * sizeof(glm::vec3), &NBD[0], GL_DYNAMIC_DRAW);

    GLuint IndexBuffer;
    glGenBuffers(1, &IndexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, IndexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, IBD.size() * sizeof(unsigned int), &IBD[0], GL_DYNAMIC_DRAW);

It works perfectly fine, however, in the CompileRawBufferData() function (above) it does not update the buffers, and doesn't cause any errors either. NOTE: I am 100% that this is not the fault of the object loader. Any help would be appreciated.


Solution

  • To update the buffers, I need to bind them like so:

        glBindBuffer(GL_ARRAY_BUFFER, VertexBuffer);
        glBufferData(GL_ARRAY_BUFFER, VBD.size() * sizeof(glm::vec3), &VBD[0], GL_DYNAMIC_DRAW);
    
        glBindBuffer(GL_ARRAY_BUFFER, UVBuffer);
        glBufferData(GL_ARRAY_BUFFER, UVBD.size() * sizeof(glm::vec2), &UVBD[0], GL_DYNAMIC_DRAW);
    
        glBindBuffer(GL_ARRAY_BUFFER, NormalBuffer);
        glBufferData(GL_ARRAY_BUFFER, NBD.size() * sizeof(glm::vec3), &NBD[0], GL_DYNAMIC_DRAW);
    
        glBindBuffer(GL_ARRAY_BUFFER, IndexBuffer);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, IBD.size() * sizeof(unsigned int), &IBD[0], GL_DYNAMIC_DRAW);
    

    Instead of calling glBufferData by itself. Credit to genpfault for the answer.