Недостающие лица на кубе OPENGL - PullRequest
0 голосов
/ 02 февраля 2019

as you can see the cube has missing faces

я перепробовал все, я знаю, что моя программа рисует правильные вершины, я в основном указывал на индексы, вот основной цикл

void mainLoop() {

    while (!glfwWindowShouldClose(window)) {

        glfwSwapBuffers(window);
        glEnable(GL_DEPTH_TEST);
        glClearColor(0.1, 0.1, 0.3, 1.0);
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glfwPollEvents();
        glFrontFace(GL_CW);
        glDisable(GL_CULL_FACE);

        glfwGetFramebufferSize(window, &WIDTH, &HEIGHT);
        glViewport(1, 1, WIDTH, HEIGHT);

        glm::mat4 view = glm::lookAt(
            glm::vec3(1.2f, 1.2f, 1.2f),
            glm::vec3(0.0f, 0.0f, 0.0f),
            glm::vec3(0.0f, 0.0f, 1.0f)
        );


        glm::mat4 projectionmatrix = glm::perspective(glm::radians(45.0f), 800.0f / 800.0f, 1.0f, 10.0f);

        glm::mat4 identitymatrix = glm::mat4(1.0f);

        glm::mat4 modelmatrix = identitymatrix;

        MVPmatrix = projectionmatrix * view * modelmatrix;

        GLint loc = glGetUniformLocation(SHADERPROGRAM, "MVPmatrix");
        glUniformMatrix4fv(loc, 1, GL_FALSE, &MVPmatrix[0][0]);

        short vertex_index[] = { 2U, 4U, 1U, 8U, 6U, 5U, 5U, 2U, 1U, 6U, 3U, 2U, 3U, 8U, 4U, 1U, 8U, 5U, 2U, 3U, 4U, 8U, 7U, 6U, 5U, 6U, 2U, 6U, 7U, 3U, 3U, 7U, 8U, 1U, 4U, 8U };


        glEnableVertexAttribArray(0);

        glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);



        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(vertex_index) * sizeof(unsigned short), &vertex_index[0], GL_STATIC_DRAW);


        glBufferData(GL_ARRAY_BUFFER, temp_vertices.size() * sizeof(glm::vec3), &temp_vertices[0], GL_STATIC_DRAW); 

        glUseProgram(SHADERPROGRAM);
        glDrawElements(GL_TRIANGLES, sizeof(vertex_index) ,  GL_UNSIGNED_SHORT, (void*)0);


    }

}

я действительноне знаю, на данный момент, и я пытался целую вечность.Индексы прямо из файла obj, как и вершины.Также я попытался отключить отбраковку безуспешно, также я попытался добавить значения ручных индексов и даже попытался сместить их.

Импорт вершин для куба работает отлично, но как только я пытаюсь создать индексированный кубупс.

Ответы [ 2 ]

0 голосов
/ 02 февраля 2019

В дополнение к ответу Rabbid76 :

Я взял значения, предоставленные OP, и сделал эскиз:

Sketch of cube vertices

Затем я создал для него индексы вершин и получил:

GLushort vertex_index[] = {
  0, 1, 2, 2, 3, 0, // front
  0, 4, 5, 5, 1, 0, // right
  4, 7, 6, 6, 5, 4, // back
  7, 3, 2, 2, 6, 7, // left
  0, 3, 7, 7, 4, 0, // bottom
  1, 5, 6, 6, 2, 1 // top
};

Если я не ошибся (я тщательно помнил об ориентации треугольников), это должно работать даже сотбраковка задней поверхности (отображение только треугольников, ориентированных против часовой стрелки) для отображения только за пределами куба.

0 голосов
/ 02 февраля 2019

Я обнаружил в вашем коде 2 проблемы:

1.) Индексы элементов начинаются с 0, а не с 1.

Либо уменьшите все индексы вершин в массиве vertex_index, либодобавьте "фиктивную" координату вершины в начале temp_vertices, чтобы решить проблему.

2.) Второй параметр или glDrawElements - это число индексов, а не числоразмер буфера индекса в байтах:

glDrawElements(GL_TRIANGLES, sizeof(vertex_index), GL_UNSIGNED_SHORT, (void*)0);
glDrawElements(GL_TRIANGLES, sizeof(vertex_index)/sizeof(short), GL_UNSIGNED_SHORT, (void*)0);

Но я рекомендую поместить индексы в std::vector<short> и использовать std::vector::size().


Далее используйте WIDTH и HEIGHT при настройке матрицы проекции для расчета соотношения сторон окна просмотра.

Кроме того, ваш код работаетхорошо.Я использовал следующую матрицу проекции и вида

glm::mat4 view = glm::lookAt(
    glm::vec3(2.0f, 2.0f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 1.0f));
glm::mat4 projectionmatrix = glm::perspective(
    glm::radians(90.0f), (float)WIDTH / (float)HEIGHT, 0.1f, 10.0f);

И glPolygonMode

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

Для создания следующего изображения

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