Объяснение перспективного разделения?


Согласно ряду источников NDC отличается от пространства клипов тем, что NDC-это просто пространство клипов после деления на W компонент. Примитивы обрезаются в пространстве клипов, которое в OpenGL равно от -1 до 1 по осям X, Y и Z (правка: это неверно, см. ответ). Другими словами, пространство клипа-это куб. Отсечение производится внутри этого куба. Если он падает внутрь, он виден, если он падает снаружи, он не виден.

Итак, давайте возьмем этот простой пример, мы смотрим сверху вниз на просмотр усеченное тело, вниз по отрицательной оси Y. ХАЛФФОВ равен 45 градусам, что означает, что ближняя и правая стороны одинаковы (в данном случае длина 2). Точка примера - (6, 0, -7).

Введите описание изображения здесь

Теперь, вот перспективная проекционная Матрица:

Введите описание изображения здесь

Для простоты будем использовать соотношение сторон 1: 1. Итак:
RIGHT = 2
LEFT = -2
TOP = 2
BOTTOM = -2
NEAR = 2
FAR = 8

Таким образом, заполняя наши значения, мы получаем матрицу проекции:

Введите описание изображения здесь

Теперь добавим однородную W к наша точка, которая была (6, 0, -7), и получаем получаем (6, 0, -7, 1).

Теперь мы умножаем нашу матрицу на нашу точку, что приводит к (6, 0, 6.29, 7). Эта точка сейчас (точка после умножения на проекционную матрицу, как предполагается, лежит в "пространстве клипа". Предположительно отсечение производится на этом этапе, выясняя, находится ли точка внутри или снаружи отсекающего Куба, и предположительно перед разделением с W. вот как это выглядит в " клипе пространство":

Введите описание изображения здесь

Из источников, которые я видел, отсечение выполняется на этом этапе, как это выглядит выше, перед разделением на W. если вы разделите на W сейчас, точка окажется в правой области Куба пространства отсечения. Вот почему я не понимаю, почему все говорят, что разделение перспективы делается после отсечения пространства. В этом пространстве до разделения перспективы точка лежит полностью снаружи и будет считаться находящейся вне отсекающего пространства, а не видимой. Однако после перспективного деления, деления на W, вот как это выглядит:

Введите описание изображения здесь

Теперь точка находится внутри куба пространства клипа, и можно судить, что она находится внутри и видна. Вот почему я думаю, что перспективное деление выполняется перед отсечением, потому что если отсечение пространства находится в пределах от -1 до +1 на каждой оси, и этап отсечения проверяет эти измерения, то для точки, находящейся внутри этого куба, она должна уже подвергнуться делению на W, иначе почти любая точка лежит внутри этого куба. вне отсечения пространства Куба и вовсе не видно. Так почему же все говорят, что сначала идет отсечение пространства, которое является результатом матрицы проекции, и только потом есть перспективное деление (деление на W), которое приводит к NDC?
1 3

1 ответ:

В пространстве клипов отсечение не выполняется для единичного Куба. Это делается против куба с длиной стороны w. точки находятся внутри видимой области, если каждая из их координат x, y, z меньше их координаты W.

В приведенном примере точка [6, 0, 6.29, 7] видна,поскольку все три координаты (x,y, z) меньше 7.

Обратите внимание, что для точек внутри видимой области это в точности эквивалентно тестированию x/w < 1. Проблемы начинаются с точек перед дальней плоскостью поскольку они могут быть спроецированы в видимую область однородным делением, потому что их w-значение отрицательно. Как мы все знаем, деление на отрицательное число в неравенстве переключило бы оператора, что неосуществимо на аппаратном обеспечении.

Дальнейшие показания:
алгоритм отсечения полигонов OpenGL sutherland-hodgman в однородных координатах
Почему отсечение должно быть сделано в CCS, а не NDCS
Почему GL делит gl_Position на W для вас, а не позволяет вам сделай это сам?