Просмотр или перспектива матриц возиться с отбраковкой - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть этот код, который почти работает нормально, но он отбирает передние грани вместо задних:

auto scaleMatrix = glm::scale(glm::mat4(1.0f), glm::fvec3(0.5f, 0.5f, 0.5f));
auto rotateMatrix = glm::rotate(glm::mat4(1.0f), glm::degrees(rotation), glm::fvec3{.0f, 1.f, 0.f});
auto modelMatrix = rotateMatrix * scaleMatrix;

int w, h;
glfwGetWindowSize(window, &w, &h);
auto perspectiveMatrix = glm::perspective(90.f, w/(float)h, .1f, 100.f);

auto viewMatrix = glm::lookAt(
        glm::vec3(-1, 0, -1),
        glm::vec3(0, 0, 0),
        glm::vec3(0, 1, 0)
        );

auto mvp = perspectiveMatrix * viewMatrix * modelMatrix;

glUniformMatrix4fv(gMVPLocation, 1, GL_FALSE, &mvp[0][0]);

Если я только передаю матрицу модели в шейдер, правильные грани отбраковываются,Но если я передаю матрицу MVP, передние грани отбраковываются, а задние грани отображаются.Не уверен, почему это может вызвать эту проблему, но мои вершины определены в порядке намотки по часовой стрелке и отлично работают, если я не использую матрицу вида или перспективы.Я не знаю, почему это здесь не работает.

1 Ответ

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

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

Если вы используете матрицу проекции вида из glm, у вас есть правосторонняя система координат, гдеОсь Z указывает на зрителя.Следовательно, ваша модель изменит свою ориентацию.Чтобы решить эту проблему, измените ориентацию лица или установите направление передних сторон, используя glFrontFace.

...