Путать обмотки треугольника и трансформации - PullRequest
5 голосов
/ 29 августа 2011

Прежде всего, я хочу извиниться за такой длинный вопрос.Вам не нужно читать это.Вы можете сразу перейти к части 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) в мировых координатах.Теперь, как я понимаю, передние грани моего куба намотаны против часовой стрелки (то есть, если мы посмотрим на куб с любой позиции вне его и перечислим вершины в треугольниках, которые мы видим, мы получим намотку против часовой стрелки),

Итак, мне нужно 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 моего вектора глаза положительна, что означает, что я должен увидеть немногоПравая сторона, не немного левой стороны!

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

1 Ответ

9 голосов
/ 29 августа 2011

OpenGL по умолчанию предполагает правостороннюю систему координат, то есть положительную ось Z, указывающую OUT экрана. Ваше положение вершин куба указывает, что вы принимаете левостороннюю систему координат. Однако, если вы поместите эти значения в RHS, то ваши координаты LHS против часовой стрелки станут по часовой стрелке (1), грани на одной оси поменяются местами (2), и ваши предполагаемые преобразования глаз пойдут в противоположном направлении (3).

...