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

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

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

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

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

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

Ответы

Ответ 1

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

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

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

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


Обновить:

Введенный в OpenGL 4.5, расширение GL_ARB_clip_control позволяет вам принять соглашение GL_ARB_clip_control NDC в 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

Ответ 2

Клип-пространство и 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)

Ответ 3

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

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

Цитата:

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

Другая цитата из комментариев в примере кода:

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

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

Ответ 4

Место 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

Пространство NDC обычно представляет собой левую систему.