在我的代码中,我有一个名为 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% 确定这不是对象加载器的错。任何帮助将不胜感激。
要更新缓冲区,我需要像这样绑定它们:
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 的答案。