一次显示两个对象

时间:2013-12-30 20:01:16

标签: opengl glfw

这些问题的根源就在于此 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_offsetnavigator

中调用
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

1 个答案:

答案 0 :(得分:0)

我没有查看链接项目中的完整源代码,但是根据您在此处粘贴的内容,您似乎不会在glBindBuffer()方法中调用move_offset() - 从而覆盖缓冲区最后绑定的对象(可能是循环中绘制的最后一个对象)。