Рендеринг каждого объекта в пространство независимо и рендеринг 2D сцены поверх 3D сцены - PullRequest
2 голосов
/ 22 мая 2019

Спойлер: эта проблема длинная, поэтому, пожалуйста, наберитесь терпения и читайте до конца.

Задача № 1: Я делаю проект пула и хочу визуализировать каждый объект отдельно из-за независимого перемещения каждого объекта. Что касается сейчас, я собираю его в один буфер и рендеринг в один кусок. (примечание: каждый объект Ball и объект Table включают в себя вершины и нормали.)

Задача № 2: Я пытаюсь визуализировать 2D-бар (который отражает силу удара), и он не будет отображаться. Я звоню после того, как я рендеринг 3D сцены

Я смотрел это видео несколько раз и не понял, что я сделал не так.

Что я сейчас делаю (после помещения объектов в вершинный буфер и нормальный буфер): ( оригинальный источник )

  do {

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    glUseProgram(programID);
    glUniform3f(LightID, 0, 6, 4);
    computeMatricesFromInputs();
    ProjectionMatrix = getProjectionMatrix();
    ModelMatrix = glm::mat4(1.0);
    MVP = ProjectionMatrix * viewMatrix * ModelMatrix;
    glUniformMatrix4fv(MatrixID, 1, GL_FALSE, &MVP[0][0]);
    glUniformMatrix4fv(ModelMatrixID, 1, GL_FALSE, &ModelMatrix[0][0]);
    glUniformMatrix4fv(ViewMatrixID, 1, GL_FALSE, &viewMatrix[0][0]);

    glEnableVertexAttribArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glVertexAttribPointer(
        0,                  // attribute
        3,                  // size
        GL_FLOAT,           // type
        GL_FALSE,           // normalized?
        0,                  // stride
        (void*)0            // array buffer offset
    );


    glEnableVertexAttribArray(2);
    glBindBuffer(GL_ARRAY_BUFFER, normalbuffer);
    glVertexAttribPointer(
        2,                                // attribute
        3,                                // size
        GL_FLOAT,                         // type
        GL_FALSE,                         // normalized?
        0,                                // stride
        (void*)0                          // array buffer offset
    );

    glDrawArrays(GL_TRIANGLES, 0, vertices.size());
    DrawHUD();
    // Swap buffers
    glfwSwapBuffers(window);
    glfwPollEvents();
} // Check if the ESC key was pressed or the window was closed
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
    glfwWindowShouldClose(window) == 0);

То, что я хочу, чтобы это было:

do{
        for (int i = 0;  i < BALL_NUMBER; i++)
    {
        balls[i].draw();
    }

} // Check if the ESC key was pressed or the window was closed
while (glfwGetKey(window, GLFW_KEY_ESCAPE) != GLFW_PRESS &&
    glfwWindowShouldClose(window) == 0); 

что должно содержать draw и как мне это сделать?

1 Ответ

1 голос
/ 22 мая 2019

Ваш цикл верхнего уровня должен:

  • Очистить буферы цвета и глубины с помощью glClear
  • Установка униформ для всей сцены, таких как идентификатор света, проекция и матрица просмотра
  • Визуализация каждого шара отдельно: (т.е. метод Ball::draw)
    • Установите униформу матрицы модели для вращения и / или изменения положения шара в мировом пространстве. Для этого может потребоваться пересчет формы MVP, в зависимости от кода вашего шейдера
    • (опционально) Как-то идентифицировать шар (другой цвет через форму или связать другую текстуру)
    • Визуализация общей сетки шаров (при желании свяжите VAO для шаров, а затем вызовите glDrawArrays)
  • Визуализация HUD
  • Замена буфера

Весь код установки (загрузка сеток, создание буферов массива и VAO, настройка привязок единообразных атрибутов) должен быть выполнен заранее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...