Когда происходит переход от места клипа к координатам экрана?
Я изучал конвейер рендеринга, и когда я дошел до этапа отсечения, было объяснено, что с точки зрения (глаз или камера) мы должны перейти в пространство клипа, также называемое нормализованным пространством устройства (NDC), которое является кубическим пространством от -1 до 1.
Однако сейчас я не понимаю, когда происходит переход из этого пространства в экранное пространство координат:
-
Сразу после отсечения и до растеризации?
-
После растеризации и перед ножницами и z-тестом?
-
В конце перед записью в буфер кадра?
Ответы
Ответ 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 обычно представляет собой левую систему.