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

时间:2018-01-29 11:39:18

标签: c++ opengl vbo

我希望使用2组向量和每个对象的一组VBO为程序生成的地形创建一个深度系统级别。一组向量(vertexData, vertexNormals, vertexIndices)包含大量数据,而另一组(lowData, lowNormals, lowIndices)则少得多。

加载块时调用以下代码,然后当摄像机进入/超出高/低分辨率模型的范围时调用:

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;

第一次填充缓冲区时(在块加载时),该函数按预期运行,并在VBO中输入正确的数据并显示正确的大小:

LOW: New size: 5292 | Should Be Size: 5292 or 1087212
New index size: 9600 | Should Be Size: 9600 or 2160000

然而,一旦生成块的深度更改,报告的缓冲区大小是完全错误的:

HIGH: New size: 0 | Should Be Size: 5292 or 1087212
New index size: 1994090432 | Should Be Size: 9600 or 2160000

无论VBO最初是否填充了高分辨率数据或低分辨率数据,第一次运行始终有效,第二次运行始终失败。当从低分辨率数据开始时,当一些地形应该是高分辨率时,所有地形都保持低分辨率,然而,当首先以高分辨率开始时,太远而不是高分辨率的地形变成小条,这表明一些数据仍然在写或正在坚持: enter image description here

向量当然具有正确的数据,并且长度正确,那么为什么glBufferData使用失败?

1 个答案:

答案 0 :(得分:-1)

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

看看:非常好的教程

enter image description here