glBufferData() 不更新主函数之外的缓冲区?

问题描述 投票:0回答:1

在我的代码中,我有一个名为 CompileRawBufferData() 的函数,该函数将我的自定义类数组编译成缓冲区可以读取的原始数据。

VBufferObject
s 的数组实际上与普通数据相同,除了带有 bufferSignature 以便我可以在需要从缓冲区中删除对象时识别该对象。 VBufferObject 看起来像这样:

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

然后将其传递到我的 CompileRawBufferData() 函数中,如下所示:

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

所以每次我想更新场景中的对象(添加或删除它们)我调用:

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

LoadObject() 函数加载新对象并将其添加到 objectBuffer,然后我编译要分配给每个缓冲区的原始缓冲区数据。

当我像这样在主函数中使用 glBufferData() 时:

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

它工作得很好,但是,在 CompileRawBufferData() 函数(上面)中它不会更新缓冲区,也不会导致任何错误。注意:我 100% 确定这不是对象加载器的错。任何帮助将不胜感激。

c++ opengl buffer glm-math
1个回答
0
投票

要更新缓冲区,我需要像这样绑定它们:

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

而不是自己调用glBufferData。感谢 genpfault 的答案。

© www.soinside.com 2019 - 2024. All rights reserved.