Проблемы OpenGL с рендерингом нескольких объектов - PullRequest
0 голосов
/ 27 ноября 2018

Я новичок в OpenGL и испытываю некоторые трудности при рендеринге нескольких объектов.

У меня есть вектор, каждый из которых имеет свой собственный VertexBuffer.Затем в цикле while я рисую каждую фигуру самостоятельно.

Все хорошо, когда у меня много одинаковых объектов (несколько кубов и т. Д.), Однако, когда я добавляю треугольную сетку, все выходит из строя.

У меня может быть много кубов

enter image description here

У меня может быть один треугольник:

enter image description here

Но, когда я пытаюсь получить куб, а затем треугольную сетку, я получаю:

enter image description here

IЯ в полном недоумении от того, что происходит.Код для моего цикла приведен ниже.

while (!glfwWindowShouldClose(window))
    {

        // Get the size of the window
        int width, height;
        glfwGetWindowSize(window, &width, &height);

        float aspect_ratio = 1 * float(height)/float(width); // corresponds to the necessary width scaling

        double xpos, ypos;
        glfwGetCursorPos(window, &xpos, &ypos);

        // Clear the framebuffer
        glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        // Enable depth test
        glEnable(GL_DEPTH_TEST);

        glUniform3f(program.uniform("triangleColor"), 1.0f, 1.0f, 1.0f);

        glUniformMatrix4fv(program.uniform("proj"), 1, GL_FALSE, projection.data());
        glUniformMatrix4fv(program.uniform("view"), 1, GL_FALSE, view.data());

        int tally = 0;
    for (int i = 0; i < surfaces.size(); i++) {

        Surface *s = surfaces[i];

        Vector3f color = s->getColor();

        int tempIndex = triangleIndex;
        Matrix4f model = s->getModel();

        // Convert screen position to world coordinates
        double xworld = ((xpos/double(width))*2)-1;
        double yworld = (((height-1-ypos)/double(height))*2)-1; // NOTE: y axis is flipped in glfw

        if (isPressed && mode == "translate") { 
            if(tempIndex == i) {
                Vector4f center = s->getCenter() + model.col(3);
                Vector4f displacement = Vector4f(xworld, yworld, 0, 1) - center;
                Matrix4f translation = translateMatrix(displacement(0), displacement(1), displacement(2));
                model = translation * s->getModel();
                s->setModel(model);
            }
        }
        glUniform3f(program.uniform("triangleColor"), color(0), color(1), color(2));
        glUniformMatrix4fv(program.uniform("model"), 1, GL_FALSE, model.data()); 
        glDrawArrays(GL_TRIANGLES, 0, s->getVertices().size());
    }

И я инициализирую каждый VBO при создании объекта как

VertexBufferObject VBO;
VBO.init();
VBO.update(Vertices);
program.bindVertexAttribArray("position", VBO);

Surface* s = new Surface(VBO, Vertices, percentScale, 0, transformedCenter, SmoothNormals, FlatNormals, color);
s->setModel(model);
surfaces.push_back(s);

И где Program :: bindVertexAttribArray определяется как

GLint Program::bindVertexAttribArray(
        const std::string &name, VertexBufferObject& VBO) const
{
  GLint id = attrib(name);
  if (id < 0)
    return id;
  if (VBO.id == 0)
  {
    glDisableVertexAttribArray(id);
    return id;
  }
  VBO.bind();
  glEnableVertexAttribArray(id);
  glVertexAttribPointer(id, VBO.rows, GL_FLOAT, GL_FALSE, 0, 0);
  check_gl_error();

  return id;
}

1 Ответ

0 голосов
/ 28 ноября 2018

Вы не привязываете никаких буферов перед вызовом отрисовки.Вы, вероятно, просто рисуете буфер, который вы в последний раз связывали при инициализации.Вам нужно что-то вроде этого в конце цикла до glDrawArrays:

...
program.bindVertexAttribArray("position", VBO); // where VBO is the buffer of surface s
glUniform3f(program.uniform("triangleColor"), color(0), color(1), color(2));
glUniformMatrix4fv(program.uniform("model"), 1, GL_FALSE, model.data()); 
glDrawArrays(GL_TRIANGLES, 0, s->getVertices().size());
...