我希望使用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最初是否填充了高分辨率数据或低分辨率数据,第一次运行始终有效,第二次运行始终失败。当从低分辨率数据开始时,当一些地形应该是高分辨率时,所有地形都保持低分辨率,然而,当首先以高分辨率开始时,太远而不是高分辨率的地形变成小条,这表明一些数据仍然在写或正在坚持:
向量当然具有正确的数据,并且长度正确,那么为什么glBufferData
使用失败?