Когда происходит переход от пространства клипа к координатам экрана?

Я изучал конвейер рендеринга, и когда я добрался до стадии отсечения, мне объяснили, что из пространства вида (глаза или камеры) мы должны перейти в пространство клипа, также называемое нормализованным пространством устройства (NDC), которое является кубическим пространством. от -1 до 1.

Однако теперь я не понимаю, когда происходит переход из этого пространства в пространство координат экрана:

  1. Сразу после отсечения и перед растеризацией?

  2. После растеризации и перед ножницами и z-тестом?

  3. В конце как раз перед записью в буфер кадра?

5 ответов

Решение

Нет, пространство клипа и пространство NDC - это не одно и то же.

Клип пространство на самом деле один шаг от НДЦ, все координаты делятся на Clip.W производить НДЦ. Все, что находится за пределами диапазона [ -1, 1 ] в результирующем пространстве NDC, соответствует точке, находящейся вне ограничивающего тома. Есть причина, по которой координатное пространство перед NDC называется клиповым пространством;)

Строго говоря, пространство NDC не обязательно является кубическим. Это правда, что пространство NDC является кубом в OpenGL, но в Direct3D это не так. В D3D координата Z в пространстве NDC составляет от 0,0 до 1,0, а в GL - от -1,0 до 1,0. X и Y ведут себя одинаково в GL и D3D (то есть в диапазоне от -1,0 до 1,0). NDC - это стандартное координатное пространство, но оно имеет различное представление в разных API.

Наконец, пространство NDC к пространству экрана (пространство окна AKA) происходит во время растеризации и определяется вашим окном просмотра и диапазоном глубины. Расположение фрагментов действительно не имеет смысла ни в каком другом координатном пространстве, и именно это приводит к растеризации: фрагменты.


Обновить:

Представлено в OpenGL 4.5, расширение GL_ARB_clip_control позволяет принять соглашение DDC DDC в GL.

Традиционное поведение OpenGL:

glClipControl (GL_LOWER_LEFT, GL_NEGATIVE_ONE_TO_ONE);

Поведение Direct3D может быть достигнуто через:

glClipControl (GL_UPPER_LEFT, GL_ZERO_TO_ONE); // Y-axis is inverted in D3D

Пространство клипа и NDC (нормализованные координаты устройства) - это не одно и то же, иначе они не будут иметь разных имен.

Пространство клипа - это место, где находятся точки пространства после преобразования точек с помощью матрицы проекции, но до нормализации по w,

Пространство NDC - это пространство, в котором находятся точки после нормализации w,

http://www.scratchapixel.com/lessons/3d-basic-rendering/perspective-and-orthographic-projection-matrix/projection-matrix-GPU-rendering-pipeline-clipping

Camera space --> 
x projection matrix ---> 
Clip space (before normalisation) --->
Clipping ---> 
Normalisation by w (x/w, y/w, z/w) --->
NDC space (in the range [-1, 1] in x and y)

По-видимому, согласно Apple, пространство клипа такое же, как у NDC.

https://developer.apple.com/documentation/metal/hello_triangle

Цитата:

"Основная задача функции вершины (также известной как вершинный шейдер) заключается в обработке входящих данных вершины и сопоставлении каждой вершины с позицией в области просмотра. Таким образом, последующие этапы в конвейере могут ссылаться на эту позицию области просмотра и отображать пиксели. в точное местоположение в чертеже. Функция вершины выполняет эту задачу, переводя произвольные координаты вершины в нормализованные координаты устройства, также известные как координаты пространства клипа."

Еще одна цитата из комментариев в примере кода:

"Выходная позиция каждого вершинного шейдера находится в пространстве клипа (также известном как нормализованное координатное пространство устройства или NDC)".

Возможно, это потому, что учебник в 2D? Вводящие в заблуждение заявления..

Вы можете представить себе переход от пространства клипа (от -1 до +1 на каждой оси, для чего-либо внутри вашего изображения) к координатам экрана, также называемым пространством видового экрана (от 0 до ResX в X, от 0 до rexY в Y и от 0 до 1 в Z, он же глубина), как это происходит непосредственно перед растеризацией, после вершинного процессора.

Когда вы пишете вершинный шейдер, вы выводите прогнозируемое положение вершины в пространстве клипа, но в шейдере фрагментов каждый фрагмент имеет свои собственные координаты экрана и глубину.

О пространстве клипа VS NDC

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

Его источник находится в середине объема клипа, его три оси выровнены, как указано в API. Например, точка с декартовыми координатами (+1,0,0) этого пространства появляется на правом конце изображения, а точка с декартовыми координатами (-1,0,0) - слева.

NDC (нормализованные координаты устройства), как следует из названия, представляет собой набор координат: это три декартовых координаты точки в пространстве отсечения. Например, возьмите точку в пространстве Clip с однородными координатами (3,0,0,3), которую вы также можете выразить как (30,0,0,30) и многими другими способами, и которая имеет декартовы координаты (1,0,0): его NDC (1,0,0).

Пространство NDC - это пространство клипа, пространство NDC - пространство окна создается аппаратно, происходит после NDC и перед растеризацией.

Есть API для установки ширины и высоты, значение по умолчанию такое же, как размер окна.

// metal
func setViewport(_ viewport: MTLViewport)
// OpenGL
void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);

Пространство NDC для OpenGL, диапазон XYZ [-1, 1]. Для металла Z составляет от 0 до 1

Пространство НДЦ обычно является левой системой.

Другие вопросы по тегам