这些问题的根源就在于此 https://stackoverflow.com/questions/20820456/strange-behavior-in-application-using-glfw
但我决定用更少的文本数据和图片简化问题(现在我使用三角形)
我有两个对象 - 两个对象都在使用vbo。我使用构造函数和方法init
Character::Character() {
glm::vec3 vert[] = {
glm::vec3(-.5f, -.5f, 0.0f) ,
glm::vec3(.5f, -.5f, 0.0f) ,
glm::vec3(0.0f, .5f, 0.0f)
};
vertices.insert(vertices.begin(), vert, vert + 3);
}
void Character::init() {
glGenBuffers(1, &vertexbuffer);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * vertices.size(), &vertices[0], GL_STATIC_DRAW);
}
void Character::draw() {
glEnableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0);
glDrawArrays(GL_TRIANGLES, 0, vertices.size());
glDisableVertexAttribArray(0);
}
在另一个班级glfwinitializer
中,我将这两个对象保留在std::vector<Character>
中。所以在函数main
中,我创建了两个对象,然后push_back
将它们转换为向量。
绘制循环很简单 - 我遍历vector
并调用draw
方法
while(!glfwWindowShouldClose(window))
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
for(int i = 0; i < scene_items.size(); i++) {
scene_items[i]->draw();
}
this->navigator();
glfwSwapBuffers(window);
glfwPollEvents();
}
方法navigator
在选择对象时计算对象的新位置。在每个方法中,我更新向量vertices
的数据,我调用方法
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * vertices.size(), &vertices[0], GL_STATIC_DRAW);
例如(方法move_offset
在navigator
)
void Character::move_offset(double x_offset, double y_offset) {
for(int i = 0; i < vertices.size(); i++) {
vertices[i].x += x_offset;
vertices[i].y += y_offset;
}
glBufferData(GL_ARRAY_BUFFER, sizeof(glm::vec3) * vertices.size(), &vertices[0], GL_STATIC_DRAW);
};
但是屏幕上没有同时显示两个三角形 - 当我选择一个对象时 - 另一个对象消失。当我点击disappeared
三角形时 - 它出现,另一个消失。 (初始位置还有一个三角形,但不能移动)
为什么呢?缓冲区有问题吗?
编辑:用额外的LIBS重建项目
visual studio 2010项目(9 mb) project with libs
答案 0 :(得分:0)
我没有查看链接项目中的完整源代码,但是根据您在此处粘贴的内容,您似乎不会在glBindBuffer()
方法中调用move_offset()
- 从而覆盖缓冲区最后绑定的对象(可能是循环中绘制的最后一个对象)。