2015-11-28 4 views

ответ

1

Существенным свойством проекции перспективы является то, что вы делите координаты x/y на глубину (расстояние от зрителя). Это делает объекты ближе к средству просмотра (которые имеют меньшие значения глубины) больше, а объекты дальше от зрителя (которые имеют большие значения глубины) меньше.

Следующая часть головоломки - как работают однородные координаты. (Х, у, г, ж) координаты в гомогенном пространстве производится с помощью вершинных шейдеров преобразуются в обычный 3D-координаты, разделив их на ш:

(x, y, z, w) --> (x/w, y/w, z/w, 1) 

Так что мы хотим деление на глубину, чтобы достичь точки зрения , и мы знаем, что координаты, создаваемые вершинным шейдером, будут разделены на w. Чтобы получить желаемый результат, мы можем просто поместить значение глубины в координатное пространство глаза в координату w.

Это как раз то, что делает последняя строка матрицы проекций. Скалярное произведение последней строки с входным вектором (которые являются глаза пространственные координаты вершины) производит значение Вт на выходе:

(0 0 -1 0) * (x y z 1) = -z 

Вы могли бы ожидать, что значение матричного элемента, чтобы быть 1 , чтобы просто скопировать значение z в пространстве глаза на значение w вывода вершинного шейдера. Причина, по которой мы используем -1 для инвертирования знака, основана на общем расположении координат пространства глаз в OpenGL.

Координаты глаз в OpenGL обычно имеют «камеру» в начале координат, глядя вниз отрицательный ось z. Таким образом, видимый диапазон z-координат имеет отрицательные значения. Поскольку нам нужно расстояние от зрителя в полученной w-координате, мы переворачиваем знак z-координаты z пространства глаз, который превращает отрицательные z-значения в положительные значения расстояния от начала координат.

Обратите внимание, что большая часть этого является общей политикой, частично связанной с устаревшим контуром фиксированной функции. С программируемым конвейером, используемым в текущих версиях OpenGL, у вас есть полная свобода в том, как вы упорядочиваете координатные пространства и преобразования. Например, вы можете легко использовать систему координат глазного пространства, где камера указывает положительное z-направление, а затем имеет 1 в последней строке матрицы проецирования вместо -1.