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