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

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

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

    const float a = 0.5f; //half of the cube side length
    float positions[nComponents] =
    {
        //front face
        -a, -a, -a,
         a, -a, -a,
         a,  a, -a,

        -a, -a, -a,
         a,  a, -a,
        -a,  a, -a,

        //back face
        -a, -a,  a,
         a,  a,  a,
         a, -a,  a,

        -a, -a,  a,
        -a,  a,  a,
         a,  a,  a,

        //up face
        -a,  a, -a,
         a,  a, -a,
         a,  a,  a,

        -a,  a, -a,
         a,  a,  a,
        -a,  a,  a,

        //down face
        -a, -a, -a,
         a, -a,  a,
         a, -a, -a,

        -a, -a, -a,
        -a, -a,  a,
         a, -a,  a,

         //right face
         a, -a, -a,
         a, -a,  a,
         a,  a,  a,

         a, -a, -a,
         a,  a,  a,
         a,  a, -a,

         //left face
         -a, -a, -a,
         -a,  a,  a,
         -a, -a,  a,

         -a, -a, -a,
         -a,  a, -a,
         -a,  a,  a,
    };

И это предполагаемые цвета моих лиц :

float face_colors[nFaces * dim] =
{
    1,0,0, //front RED
    1,1,1, //back  WHITE
    0,0,1, //up    BLUE
    0,1,1, //down  SKY BLUE
    0,1,0, //right GREEN
    1,1,0, //left  YELLOW
};

Как видно из комментариев, я использую термины вверх, вниз, влево, вправо и т. Д. Эти слова получают свое значение, если мы предположим, что смотрим на куб с позиции, скажем, (0, 0, -3a) в мировых координатах. Теперь, как я понимаю, передние грани моего куба намотаны против часовой стрелки (то есть, если мы смотрим на куб из любого положения ion вне его, и пронумеровав вершины в треугольниках, которые мы видим, мы получим намотку против часовой стрелки).

Итак,Мне нужно 1. Включить отбраковку. 2. Скажите, что это передняя грань против часовой стрелки. 3. Отберите заднюю грань. Вот код для этого:

glEnable(GL_DEPTH_TEST);
glEnable(GL_CULL_FACE);
glFrontFace(GL_CCW);
glCullFace(GL_BACK);

Моя матрица проекции - это матрица перспективной проекции, а матрица modelView - это просто матрица LookAt. Они передаются как униформы в вершинный шейдер.

ProjectionMatrix = glm::perspective(45.0f, (float)w/h, 0.1f, 100.0f);
glm::vec3 center(0.0f, 0.0f, 0.0f);
glm::vec3 eye(1.0f, 2.0f, -3.0f);
glm::vec3 up(0.0f, 1.0f, 0.0f);
ModelViewMatrix = glm::lookAt(eye, center, up);
glUniformMatrix4fv(locP, 1, false, glm::value_ptr(ProjectionMatrix));
glUniformMatrix4fv(locMV, 1, false, glm::value_ptr(ModelViewMatrix));

Мой вершинный шейдер определен следующим образом:

#version 400
layout(location = 0) in vec4 vVertex;
layout(location = 1) in vec4 vColor;
uniform mat4 P;
uniform mat4 MV;
out vec4 vFragColor;
void main(void)
{
   vFragColor = vColor;
   gl_Position = P * MV * vVertex;
}

Мой фрагментный шейдер тривиален - он просто выводит интерполированный цвет.

Теперь ... вот результат, который я получаю :

enter image description here

Если я изменю glFrontFace (GL_CCW); на glFrontFace (GL_CW); , или, альтернативно, заменю glCullFace (GL_BACK) на glCullFace (GL_FRONT) , я получаю ожидаемый (по крайней мере, более ожидаемый, чем предыдущий, см. Второй и третий вопросы) визуализацию:

enter image description here

Я вижу здесь три проблемы, каждая из которых описана в вопросе:

АКТУАЛЬНЫЕ ВОПРОСЫ:

Q1: Почему намотка обратная, как я предполагал? Разве я не намотал вершины против часовой стрелки для лицевых граней?
Q2 Почему мои «левая» грань и «правая» грань поменялись местами? Левая грань должна была быть желтой, а правая - зеленой, а не наоборот! Что не так с моим преобразованием?
Q3 Там что-то не так с моим преобразованием, потому что координата x моего вектора глаза положительна, что означает, что я действительно должен видеть часть правой стороны, ни капли левой стороны!

Я задал эти вопросы вместе, потому что думаю, что все они связаны и, вероятно, с чем-то очень простым, чего мне не хватает. Большое спасибо за то, что нашли время прояснить эти вещи.

5
задан Armen Tsirunyan 29 August 2011 в 17:52
поделиться