C++ 使用glBufferData()调整大小后VBO大小不正确

C++ 使用glBufferData()调整大小后VBO大小不正确,c++,opengl,vbo,C++,Opengl,Vbo,我希望为程序生成的地形创建一个深度级别系统,每个对象使用2组向量和一组VBO。一组矢量vertexData、vertexNormals、vertexIndices中有大量数据,而另一组lowData、lowNormals、LowIndex中的数据要少得多 加载块时,以及相机在高/低分辨率模型的范围内/范围外时,调用以下代码: if (thisLOD == HIGH) { std::cout << "HIGH: "; glBindBuffer(GL_ARRAY_BUFF

我希望为程序生成的地形创建一个深度级别系统,每个对象使用2组向量和一组VBO。一组矢量vertexData、vertexNormals、vertexIndices中有大量数据,而另一组lowData、lowNormals、LowIndex中的数据要少得多

加载块时,以及相机在高/低分辨率模型的范围内/范围外时,调用以下代码:

if (thisLOD == HIGH)
{
    std::cout << "HIGH: ";
    glBindBuffer(GL_ARRAY_BUFFER,vertexDataBuffer);
    glBufferData(GL_ARRAY_BUFFER,vertexData.size() * sizeof(glm::vec3),&vertexData[0],GL_DYNAMIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vertexIndexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,vertexIndices.size()*sizeof(unsigned int),&vertexIndices[0],GL_DYNAMIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER,vertexNormalBuffer);
    glBufferData(GL_ARRAY_BUFFER,vertexNormals.size()*sizeof(glm::vec3),&vertexNormals[0],GL_DYNAMIC_DRAW);

}
else
{
    std::cout << "LOW: ";
    glBindBuffer(GL_ARRAY_BUFFER,vertexDataBuffer);
    glBufferData(GL_ARRAY_BUFFER,lowData.size() * sizeof(glm::vec3),&lowData[0],GL_DYNAMIC_DRAW);

    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vertexIndexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,lowIndices.size()*sizeof(unsigned int),&lowIndices[0],GL_DYNAMIC_DRAW);

    glBindBuffer(GL_ARRAY_BUFFER,vertexNormalBuffer);
    glBufferData(GL_ARRAY_BUFFER,lowNormals.size()*sizeof(glm::vec3),&lowNormals[0],GL_DYNAMIC_DRAW);
}
glFinish();
GLint s;
glGetBufferParameteriv(GL_ARRAY_BUFFER,GL_BUFFER_SIZE,&s);
GLint s2;
glGetBufferParameteriv(GL_ELEMENT_ARRAY_BUFFER,GL_BUFFER_SIZE,&s2);
std::cout << "New size: " << s <<" | Should Be Size: " << lowNormals.size()*sizeof(glm::vec3) << " or " << vertexNormals.size()*sizeof(glm::vec3) << std::endl;
std::cout << "New index size: " << s2 <<" | Should Be Size: "<<lowIndices.size()*sizeof(unsigned int) << " or " << vertexIndices.size()*sizeof(unsigned int) << std::endl;
但是,在生成块后更改块的深度级别时,报告的缓冲区大小是完全错误的:

HIGH: New size: 0 | Should Be Size: 5292 or 1087212
New index size: 1994090432 | Should Be Size: 9600 or 2160000
无论VBO最初填充的是高分辨率数据还是低分辨率数据,第一次运行始终有效,第二次运行始终失败。当以低分辨率数据开始时,当某些地形应为高分辨率时,所有地形将保持低分辨率,但是,当首先以高分辨率开始时,距离太远而无法达到高分辨率的地形将变成小碎片,这表明某些数据仍在写入中,或正在持续:


向量中当然包含正确的数据,并且长度正确,那么为什么使用glBufferData会失败呢?

想法:您是否考虑过VBO和IBO是以字节计算的

看:非常好的教程


在glBufferData调用后插入glGetError,并检查是否返回任何错误。这可能会给你一个机会hint@Amadeusz是,这将为不工作的调用提供错误代码1282 GL_无效_操作。仍然不确定原因,但这肯定是朝着正确方向迈出的一步,这可能与几个gl上下文的使用有关?是否还有其他地方可以修改缓冲区句柄vertexDataBuffer、indexDataBuffer等。。。?在两个glGetBufferParameteriv调用之后插入glGetError。查看它是否在非工作过程中返回任何错误。@Ripi2是的,每个块的第二次调用实际上是从一个单独的线程调用的,在该线程中没有活动的OpenGL上下文。通过上下文共享创建一个隐藏的GLFW窗口,并在此线程中激活它,解决了这个问题。他的数据由无符号整数和glm::vec3s组成,后者是浮点的三分量向量。此外,这与这个问题有什么关系?错误的对齐可能会导致性能下降或内存操作错误,但这里的问题是报告的缓冲区大小,它与数据的实际表示形式没有任何联系。
HIGH: New size: 0 | Should Be Size: 5292 or 1087212
New index size: 1994090432 | Should Be Size: 9600 or 2160000