Графический конвейер

редактировать
3D-рендеринг

В компьютерная графика, конвейер компьютерной графики, конвейер рендеринга или просто графический конвейер, представляет собой концептуальную модель, которая описывает, какие шаги графической системе необходимо выполнить для рендеринга 3D-сцены на 2D-экран.. После создания 3D-модели, например, в видеоигре или любой другой компьютерной 3D-анимации, графический конвейер представляет собой процесс преобразования этой 3D-модели в то, что отображает компьютер. Поскольку шаги, необходимые для этой операции, зависят от используемого программного и аппаратного обеспечения, а также от желаемых характеристик дисплея, универсального графического конвейера, подходящего для всех случаев, не существует. Однако графические интерфейсы прикладного программирования (API), такие как Direct3D и OpenGL, были созданы для объединения подобных шагов и управления графическим конвейером данного аппаратный ускоритель. Эти API абстрагируют базовое оборудование и удерживают программиста от написания кода для управления аппаратными ускорителями графики (AMD / Intel / NVIDIA и т. Д.).

Модель графического конвейера обычно используется при рендеринге в реальном времени. Часто большинство этапов конвейера реализовано аппаратно, что позволяет выполнять специальные оптимизации. Термин «конвейер» используется в том же смысле, что и конвейер в процессорах: отдельные шаги конвейера выполняются параллельно, но блокируются до тех пор, пока не будет завершен самый медленный шаг.

Содержание
  • 1 Концепция
  • 2 Структура
    • 2.1 Приложение
    • 2.2 Геометрия
      • 2.2.1 Определения
      • 2.2.2 Мировая система координат
      • 2.2.3 Преобразование камеры
      • 2.2.4 Проекция
      • 2.2.5 Освещение
      • 2.2.6 Отсечение
      • 2.2.7 Преобразование окно-видовой экран
    • 2.3 Растеризация
    • 2.4 Инверсия
  • 3 Шейдер
  • 4 См. также
  • 5 Источники
  • 6 Ссылки
  • 7 Внешние ссылки
Концепция

3D-конвейер обычно относится к наиболее распространенной форме компьютерного 3D-рендеринга, называемой 3D-рендеринг полигонов, в отличие от трассировки лучей и трассировки лучей. При трансляции лучей луч возникает в точке, где находится камера, и если этот луч попадает на поверхность, вычисляется цвет и освещение точки на поверхности, в которую попадает луч. При рендеринге трехмерных полигонов происходит обратное - вычисляется область, которая находится в поле зрения камеры, а затем создаются лучи из каждой части каждой поверхности в поле зрения камеры и прослеживаются обратно к камере.

Структура

Графический конвейер можно разделить на три основные части: приложение, геометрия и растеризация.

Графический конвейер 2 en.svg

Приложение

Этап приложения выполняется программным обеспечением на главном процессоре (CPU ). На этапе приложения изменения вносятся в сцену по мере необходимости, например, посредством взаимодействия с пользователем посредством устройств ввода или во время анимации. В современном игровом движке, таком как Unity, программист работает почти исключительно с этапом приложения и использует язык высокого уровня, такой как C #, а не на C или C ++. Новая сцена со всеми ее примитивами , обычно треугольниками, линиями и точками, затем передается на следующий этап конвейера.

Примерами задач, которые обычно выполняются на этапе приложения, являются обнаружение столкновений, методы анимации, морфинга и ускорения с использованием схем пространственного подразделения, таких как Quadtrees или Октябрь. Они также используются для уменьшения объема оперативной памяти, необходимой в данный момент. «Мир» современной компьютерной игры намного больше, чем то, что можно сразу уместить в памяти.

Геометрия

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

Геометрический конвейер en.svg

Определения

Вершина (множественное число: вершины) - это точка в мире. Для соединения поверхностей используется множество точек. В особых случаях облака точек рисуются напрямую, но это все же исключение.

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

Мировая система координат

Мировая система координат - это система координат, в которой создается виртуальный мир. Это должно соответствовать нескольким условиям, чтобы следующая математика могла быть легко применима:

  • Это должна быть прямоугольная декартова система координат, в которой все оси масштабированы одинаково.

Как определить единицу системы координат, остается на усмотрение разработчик. Следовательно, должен ли единичный вектор системы соответствовать в действительности одному метру или Ангстрему, зависит от приложения.

Пример: если мы должны разработать имитатор полета, мы можем выбрать мировую систему координат так, чтобы начало координат было в центре Земли, а единица измерения была равна одному метру. Кроме того, чтобы упростить отсылку к реальности, мы определяем, что ось X должна пересекать экватор на нулевом меридиане, а ось Z проходит через полюса. В системе с правой рукой ось Y проходит через восточный меридиан 90 ° (где-то в Индийском океане ). Теперь у нас есть система координат, которая описывает каждую точку на Земле в трехмерных декартовых координатах. В этой системе координат мы теперь моделируем принципы нашего мира, гор, долин и океанов.
Примечание. Помимо компьютерной геометрии, географические координаты используются для земли, т. е. широта и долгота, а также высоты над уровнем моря. Приблизительное преобразование - если не учитывать тот факт, что Земля не является точной сферой - простое:
(xyz) = ((R + hasl) ∗ cos ⁡ (lat) ∗ cos ⁡ (long) (R + hasl) * cos ⁡ (лат) * sin ⁡ (длинный) (R + hasl) * sin ⁡ (lat)) {\ displaystyle {\ begin {pmatrix} x \\ y \\ z \ end {pmatrix}} = {\ begin {pmatrix} (R + {hasl}) * \ cos ({lat}) * \ cos ({long}) \\ (R + {hasl}) * \ cos ({lat}) * \ sin ({long }) \\ (R + {hasl}) * \ sin ({lat}) \ end {pmatrix}}}{\ displaystyle {\ begin {pmatrix} x \\ y \\ z \ end {pmatrix}} = {\ begin {pmatrix} (R + {hasl}) * \ cos ({lat}) * \ cos ({long}) \\ (R + {hasl}) * \ cos ({lat}) * \ sin ({long}) \\ (R + {hasl }) * \ sin ({lat}) \ end {pmatrix}}} с R = радиус Земли [6,378,137 м], широта = широта, долгота = Долгота, hasl = высота над уровнем моря.
Все следующие примеры применимы в системе с правой рукой. Для левосторонней системы знаки, возможно, потребуется поменять местами.

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

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

Во-первых, нам нужны три матрицы вращения, а именно по одной для каждой из трех Оси самолета (вертикальная ось, поперечная ось, продольная ось).

Вокруг оси X (обычно определяется как продольная ось в системе координат объекта)

R x = (1 0 0 0 0 cos ⁡ (α) sin ⁡ (α) 0 0 - sin ⁡ (α) соз ⁡ (α) 0 0 0 0 1) {\ displaystyle R_ {x} = {\ begin {pmatrix} 1 0 0 0 \\ 0 \ cos (\ alpha) \ sin (\ alpha) 0 \\ 0 - \ sin ( \ alpha) \ cos (\ alpha) 0 \\ 0 0 0 1 \ end {pmatrix}}}{\ displaystyle R_ {x } = {\ begin {pmatrix} 1 0 0 0 \\ 0 \ cos (\ alpha) \ sin (\ alpha) 0 \\ 0 - \ sin (\ alpha) \ cos (\ alpha) 0 \\ 0 0 0 1 \ end { pmatrix}}}

Вокруг оси Y (обычно определяется как поперечная ось в системе координат объекта)

R y = (cos ⁡ (α) 0 - грех ⁡ (α) 0 0 1 0 0 грех ⁡ (α) 0 соз ⁡ (α) 0 0 0 0 1) {\ displaystyle R_ {y} = {\ begin {pmatrix} \ cos (\ alpha) 0 - \ sin (\ alpha) 0 \\ 0 1 0 0 \\\ sin (\ alpha) 0 \ cos (\ alpha) 0 \\ 0 0 0 1 \ end {pmatrix}}}{\ displaystyle R_ {y} = {\ begin {pmatrix} \ cos (\ alpha) 0 - \ sin (\ alpha) 0 \\ 0 1 0 0 \\\ sin (\ alpha) 0 \ cos (\ alpha) 0 \\ 0 0 0 1 \ end {pmatrix}}}

Вокруг оси Z (обычно определяется как вертикальная ось в системе координат объекта)

R z = (cos ⁡ (α) sin ⁡ (α) 0 0 - sin ⁡ (α) cos ⁡ (α) 0 0 0 0 1 0 0 0 0 1) {\ Displaystyle R_ {z} = {\ begin {pmatrix} \ cos (\ alpha) \ sin (\ alpha) 0 0 \\ - \ sin (\ alpha) \ cos (\ alpha) 0 0 \\ 0 0 1 0 \\ 0 0 0 1 \ end {pmatrix}}}{\ displaystyle R_ {z} = {\ begin {pmatrix} \ cos (\ alpha) \ sin (\ alpha) 0 0 \ \ - \ sin (\ alpha) \ cos (\ alpha) 0 0 \\ 0 0 1 0 \\ 0 0 0 1 \ end {pmatrix}}}

Мы также используем матрицу перевода, которая mov например, самолет в нужную точку нашего мира: T x, y, z = (1 0 0 0 0 1 0 0 0 0 1 0 xyz 1) {\ displaystyle T_ {x, y, z} = { \ begin {pmatrix} 1 0 0 0 \\ 0 1 0 0 \\ 0 0 1 0 \\ x y z 1 \ end {pmatrix}}{\ displaystyle T_ {x, y, z} = {\ begin {pmatrix} 1 0 0 0 \\ 0 1 0 0 \\ 0 0 1 0 \\ x y z 1 \ end {pmatrix}}} .

Примечание: указанные выше матрицы транспонированы относительно тех, что в статье поворота матрица. См. Ниже объяснение, почему.

Теперь мы могли вычислить положение вершин самолета в мировых координатах, последовательно умножая каждую точку на эти четыре матрицы. Поскольку умножение матрицы на вектор довольно дорого (требует много времени), обычно выбирают другой путь и сначала умножают четыре матрицы вместе. Умножение двух матриц еще дороже, но должно выполняться только один раз для всего объекта. Умножение ((((v * R x) * R y) * R z) * T) {\ displaystyle ((((v * R_ {x}) * R_ {y}) * R_ {z}) * T)}{\ displaystyle ((((v * R_ {x}) * R_ {y}) * R_ {z}) * T)} и (v ∗ (((R x ∗ R y) ∗ R z) ∗ T)) {\ displaystyle (v * (((R_ {x} * R_ {y}) * R_ {z}) * T))}{\ displaystyle (v * (((R_ {x} * R_ {y}) * R_ {z}) * T))} эквивалентны. После этого полученную матрицу можно было применить к вершинам. На практике, однако, умножение на вершины все еще не применяется, но сначала определяются матрицы камеры - см. Ниже.

Однако для нашего примера, приведенного выше, перевод должен быть определен несколько иначе, поскольку общее значение Up - за исключением Северного полюса - не совпадает с нашим определением положительного Z ось, поэтому модель также необходимо вращать вокруг центра Земли: TK ugel = T x, y, z (0, 0, R + hasl) ∗ R y (Π / 2 - lat) ∗ R z (длинный) {\ displaystyle T_ {Kugel} = T_ {x, y, z} (0,0, R + {hasl}) * R_ {y} (\ Pi / 2- {lat}) * R_ {z} ( {long})}{\ displaystyle T_ {Kugel} = T_ {x, y, z } (0,0, R + {hasl}) * R_ {y} (\ Pi / 2- {lat}) * R_ {z} ({long})} На первом этапе исходная точка модели перемещается на правильную высоту над поверхностью земли, затем она поворачивается по широте и долготе.

Порядок, в котором применяются матрицы: важно, потому что матричное умножение не является коммутативным. Это также относится к трем поворотам, что можно продемонстрировать на примере: точка (1, 0, 0) лежит на оси X, если повернуть ее сначала на 90 ° вокруг оси X, а затем вокруг оси Y, он заканчивается на оси Z (вращение вокруг оси X не влияет на точку, которая находится на оси). Если, с другой стороны, сначала вращается вокруг оси Y, а затем вокруг оси X, результирующая точка будет расположена на оси Y. Сама последовательность произвольна, если она всегда одинакова. Последовательность с x, затем y, затем z (крен, тангаж, курс) часто является наиболее интуитивно понятной, потому что вращение заставляет направление компаса совпадать с направлением «носа».

Есть также два соглашения для определения этих матриц, в зависимости от того, хотите ли вы работать с векторами-столбцами или векторами-строками. Здесь разные графические библиотеки имеют разные предпочтения. OpenGL предпочитает векторы-столбцы, DirectX векторы-строки. Решение определяет, с какой стороны точечные векторы должны быть умножены на матрицы преобразования. Для векторов-столбцов умножение выполняется справа, т.е. vout = M ∗ vin {\ displaystyle v_ {out} = M * v_ {in}}{\ displaystyle v_ {out} = M * v_ {in}} , где v out и v в - векторы-столбцы 4x1. Объединение матриц также выполняется справа налево, т.е., например, M = T x ∗ R x {\ displaystyle M = T_ {x} * R_ {x}}{\ displaystyle M = T_ { x} * R_ {x}} , при первом вращении, а затем при переключении.

В случае векторов-строк это работает с точностью до наоборот. Умножение теперь происходит слева как vout = vin ∗ M {\ displaystyle v_ {out} = v_ {in} * M}{\ displaystyle v_ {out} = v_ {in} * M} с векторами из 1x4 строк, а конкатенация составляет M = R x ∗ T x {\ displaystyle M = R_ {x} * T_ {x}}{\ displaystyle M = R_ {x} * T_ {x}} когда мы сначала вращаемся, а затем перемещаемся. Показанные выше матрицы действительны для второго случая, тогда как матрицы для векторов-столбцов транспонированы. Применяется правило (v * M) T = MT * v T {\ displaystyle (v * M) ^ {T} = M ^ {T} * v ^ {T}}{\ displaystyle (v * M) ^ {T} = M ^ {T} * v ^ {T}} , которое для умножения на векторы означает, что вы можете переключать порядок умножения, транспонируя матрицу.

Интересная особенность этой цепочки матриц состоит в том, что при каждом таком преобразовании определяется новая система координат. Это может быть расширено по желанию. Например, пропеллер летательного аппарата может быть отдельной моделью, которая затем переводится в носовую часть самолета. Этот перевод нужен только для описания перехода от системы координат модели к системе координат воздушного винта. Чтобы нарисовать весь самолет, сначала определяется матрица преобразования для самолета, преобразуются точки, а затем матрица модели воздушного винта умножается на матрицу самолета, а затем преобразуются точки пропеллера.

Рассчитанная таким образом матрица также называется мировой матрицей. Его необходимо определить для каждого объекта в мире перед рендерингом. Приложение может вносить здесь изменения, например изменять положение летательного аппарата в зависимости от скорости после каждого кадра.

Преобразование камеры

Слева: положение и направление виртуального зрителя (камеры), определенные пользователем. Справа: размещение объектов после трансформации камеры. Светло-серая область - это видимый объем.

В дополнение к объектам сцена также определяет виртуальную камеру или средство просмотра, которое указывает положение и направление обзора, с которого сцена должна быть визуализирована. Чтобы упростить последующее проецирование и обрезку, сцена трансформируется так, чтобы камера находилась в исходной точке, глядя вдоль оси Z. Результирующая система координат называется системой координат камеры, а преобразование называется преобразованием камеры или преобразованием вида.

Матрица обзора обычно определяется из положения камеры, целевой точки (куда смотрит камера) и «вектора вверх» («вверх» с точки зрения наблюдателя). Требуются первые три вспомогательных вектора:
Zaxis = normal (cameraPosition - cameraTarget)
Xaxis = normal (cross (cameraUpVector, zaxis))
Yaxis = cross (zaxis, xaxis)
С нормальным (v) = нормализацией вектора v;
cross (v1, v2) = перекрестное произведение v1 и v2.
Наконец, матрица: (xaxis. xyaxis. xzaxis. x 0 xaxis. yyaxis. yzaxis. y 0 xaxis. zyaxis. zzaxis. z 0 - dot (xaxis, camera P osition) - dot (yaxis, camera P osition) - точка (zaxis, положение камеры) 1) {\ displaystyle {\ begin {pmatrix} {xaxis}.x {yaxis}.x {zaxis}.x 0 \\ {xaxis}.y {yaxis}.y {zaxis}.y 0 \\ {xaxis}.z {yaxis}.z {zaxis}.z 0 \\ - {dot} ({xaxis}, {cameraPosition}) - {dot} ({yaxis}, {cameraPosition}) - {dot} ({zaxis}, {cameraPosition}) 1 \ end {pmatrix}}}{\ displaystyle {\ begin {pmatrix} {xaxis}.x {yaxis}.x {zaxis}.x 0 \ \ {xaxis}.y {yaxis}.y {zaxis}.y 0 \\ {xaxis}.z {yaxis}.z {zaxis}.z 0 \\ - {dot} ({xaxis}, {cameraPosition}) - {точка} ({yaxis}, {cameraPosition}) - {dot} ({zaxis}, {cameraPosition}) 1 \ end {pmatrix}}}
с точкой (v1, v2) = скалярное произведение v1 и v2.

Проекция

Шаг преобразования 3D-проекции запишите объем вида в куб с координатами угловой точки (-1, -1, 0) и (1, 1, 1); Иногда также используются другие целевые тома. Этот шаг называется проекцией, даже если он преобразует объем в другой, поскольку полученные координаты Z не сохраняются в изображении, а используются только в Z-буферизации на более позднем этапе растрирования. На иллюстрации перспективы используется центральная проекция . Для ограничения количества отображаемых объектов используются две дополнительные плоскости отсечения; Таким образом, визуальный объем представляет собой усеченную пирамиду (frustum ). Параллельная или ортогональная проекция используется, например, для технических представлений, потому что она имеет то преимущество, что все параллели в пространстве объектов также параллельны в пространстве изображения, а поверхности и объемы имеют одинаковый размер независимо от расстояния от зрителя. Карты используют, например, ортогональную проекцию (так называемый ортофото ), но наклонные изображения ландшафта не могут использоваться таким образом - хотя их технически можно визуализировать, они кажутся настолько искаженными, что мы не можем сделать любое их использование. Формула для вычисления матрицы перспективного отображения:

(w 0 0 0 0 h 0 0 0 0 далеко / (близко - далеко) - 1 0 0 (близко * далеко) / (близко - далеко) 0) {\ displaystyle {\ begin {pmatrix} w 0 0 0 \\ 0 h 0 0 \\ 0 0 {far} / ({near-far}) - 1 \\ 0 0 ({near} * {far}) / ({near} - {far}) 0 \ end {pmatrix}}}{\ displaystyle {\ begin {pmatrix} w 0 0 0 \\ 0 h 0 0 \\ 0 0 {far} / ({near-far}) - 1 \\ 0 0 ({near} * {far}) / ({рядом} - {далеко}) 0 \ end {pmatrix}}}

С h = cot (fieldOfView / 2.0) (угол раскрытия камеры); w = h / aspectRatio (соотношение сторон целевого изображения); near = Наименьшее расстояние для видимости; far = Наибольшее расстояние, которое должно быть видно.

Причины, по которым здесь необходимо указать наименьшее и наибольшее расстояние, заключаются, с одной стороны, в том, что это расстояние делится на, чтобы достичь масштабирования сцены (подробнее удаленные объекты меньше на перспективном изображении, чем близкие объекты), и, с другой стороны, масштабировать значения Z в диапазоне 0..1 для заполнения Z-буфера. Этот буфер часто имеет разрешение всего 16 бит, поэтому ближние и дальние значения следует выбирать осторожно. Слишком большая разница между ближним и дальним значением приводит к так называемому Z-бою из-за низкого разрешения Z-буфера. Также из формулы видно, что ближайшее значение не может быть 0, потому что эта точка является точкой фокусировки проекции. На данный момент нет изображения.

Для полноты формула для параллельной проекции (ортогональной проекции):

(2.0 / w 0 0 0 0 2.0 / h 0 0 0 0 1.0 / (ближний - дальний) - 1 0 0 близко / (близко - далеко) 0) {\ displaystyle {\ begin {pmatrix} 2.0 / w 0 0 0 \\ 0 2.0 / h 0 0 \\ 0 0 1.0 / ({near-far}) - 1 \\ 0 0 {near } / ({near} - {far}) 0 \ end {pmatrix}}}{\ displaystyle {\ begin {pmatrix} 2.0 / w 0 0 0 \ \ 0 2.0 / h 0 0 \\ 0 0 1.0 / ({near-far}) - 1 \\ 0 0 {near} / ({near} - {far}) 0 \ end {pmatrix} }}

с w = ширина целевого куба (размерность в единицах мировой системы координат); H = w / aspectRatio (соотношение сторон целевого изображения); near = Наименьшее расстояние для видимости; far = Наибольшее расстояние, на котором должно быть видно.

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

На этапе фактического рендеринга вычисляется мировая матрица * матрица камеры * матрица проекции, которая затем применяется к каждой отдельной точке. Таким образом, точки всех объектов переносятся непосредственно в систему координат экрана (по крайней мере, почти, диапазон значений осей все еще -1..1 для видимого диапазона, см. Раздел «Окно-Видовой экран-Преобразование»).

Освещение

Часто сцена содержит источники света, размещенные в разных положениях, чтобы освещение объектов выглядело более реалистичным. В этом случае коэффициент усиления текстуры вычисляется для каждой вершины на основе источников света и свойств материала, связанных с соответствующим треугольником. На более позднем этапе растеризации значения вершин треугольника интерполируются по его поверхности. Общее освещение (рассеянное освещение) применяется ко всем поверхностям. Это рассеянная и, следовательно, не зависящая от направления яркость сцены. Солнце - это направленный источник света, который можно считать бесконечно далеким. Освещение, создаваемое солнцем на поверхности, определяется путем формирования скалярного произведения вектора направления от солнца и вектора нормали к поверхности. Если значение отрицательное, поверхность обращена к солнцу.

Отсечение

Отсечение примитивов по кубу. Синий треугольник отбрасывается, а оранжевый треугольник обрезается, создавая две новые вершины Frustum

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

Преобразование Window-Viewport

Window-Viewport-Transformation

Для вывода изображения в любую целевую область (область просмотра) экрана необходимо применить другое преобразование, преобразование Window-Viewport.. Это сдвиг с последующим масштабированием. Результирующие координаты являются координатами устройства вывода. Область просмотра содержит 6 значений: высота и ширина окна в пикселях, верхний левый угол окна в координатах окна (обычно 0, 0) и минимальное и максимальное значения для Z (обычно 0 и 1).

Формально: (xyz) = (vp. X + (1.0 + v. X) ∗ vp. Width / 2.0 vp. Y + (1.0 - v. Y) ∗ vp. Height / 2.0 vp. Minz + v. Z ∗ (vp. maxz - vp. minz)) {\ displaystyle {\ begin {pmatrix} x \\ y \\ z \ end {pmatrix}} = {\ begin {pmatrix} {vp}.X + ( 1.0 + vX) * {vp}. {Width} /2.0 \\ {vp}.Y + (1.0-vY) * {vp}. {Height} /2.0 \\ {vp}. {Minz} + vZ * ({ vp}. {maxz} - {vp}. {minz}) \ end {pmatrix}}}{\ displaystyle {\ begin {pmatrix} x \\ y \\ z \ end {pmatrix}} = {\ begin {pmatrix} {vp}.X + (1.0 + vX) * {vp}. {width} /2.0 \\ {vp}.Y + (1.0-vY) * {vp}. {height} /2.0 \\ {vp}. {minz} + vZ * ({vp}. {maxz} - {vp}. {minz}) \ end {pmatrix}}}
С vp = Viewport; v = Точка после проекции

На современном оборудовании большинство шагов вычисления геометрии выполняется в вершинном шейдере . Это, в принципе, свободно программируется, но обычно выполняет, по крайней мере, преобразование точек и расчет освещенности. Для интерфейса программирования DirectX использование настраиваемого вершинного шейдера необходимо начиная с версии 10, в то время как более старые версии по-прежнему имеют стандартный шейдер.

Растеризация

Этап растеризации - это последний шаг перед конвейером фрагментного шейдера, на котором все примитивы растеризуются. На этапе растеризации дискретные фрагменты создаются из непрерывных примитивов.

На этом этапе графического конвейера точки сетки также называются фрагментами для большей различимости. Каждый фрагмент соответствует одному пикселю в буфере кадра, а это соответствует одному пикселю экрана. Они могут быть цветными (и, возможно, с подсветкой). Кроме того, необходимо определить видимый, ближе к наблюдателю фрагмент, в случае перекрытия полигонов. Z-буфер обычно используется для этого так называемого определения скрытой поверхности. Цвет фрагмента зависит от освещения, текстуры и других свойств материала видимого примитива и часто интерполируется с использованием свойств вершины треугольника. Если возможно, фрагментный шейдер (также называемый Pixel Shader ) запускается на этапе растрирования для каждого фрагмента объекта. Если фрагмент виден, теперь его можно смешивать с уже существующими значениями цвета в изображении, если используется прозрачность или множественная выборка. На этом этапе один или несколько фрагментов становятся пикселем.

Чтобы пользователь не увидел постепенную растеризацию примитивов, используется двойная буферизация. Растеризация выполняется в специальной области памяти. После того как изображение будет полностью растеризовано, оно копируется в видимую область памяти изображений.

Обратный

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

Shader

Программируемый 3D-конвейер.

Классические видеокарты все еще относительно близки к графическому конвейеру. С ростом требований к GPU ограничения были постепенно сняты, чтобы обеспечить большую гибкость. Современные видеокарты используют свободно программируемый конвейер, управляемый шейдером, который обеспечивает прямой доступ к отдельным этапам обработки. Чтобы разгрузить основной процессор, дополнительные этапы обработки были перенесены в конвейер и графический процессор.

Самыми важными шейдерными блоками являются пиксельные шейдеры, вершинные шейдеры и геометрические шейдеры. Унифицированный шейдер был введен, чтобы в полной мере использовать все возможности. Это дает вам единый большой пул шейдерных модулей. При необходимости пул разбивается на разные группы шейдеров. Следовательно, строгое разделение между типами шейдеров больше не полезно.

Также можно использовать так называемый вычислительный шейдер для выполнения любых вычислений вне отображения графики на GPU. Преимущество в том, что они работают очень параллельно, но с некоторыми ограничениями. Эти универсальные вычисления также называются вычислениями общего назначения на графических процессорах или для краткости GPGPU .

См. Также
Источники
  • Томас Акенин-Мёллер, Эрик Хейнс: рендеринг в реальном времени. AK Peters, Natick, Mass. 2002, ISBN 1-56881-182-9.
  • Майкл Бендер, Манфред Брилл: Computergrafik: ein anwendungsorientiertes Lehrbuch. Hanser, München 2006, ISBN 3-446-40434-1.
  • Фишер, Мартин (2011-07-04). Пиксель-Фабрик. Wie Grafikchips Spielewelten auf den Schirm zaubern. c't Magazin für Computer Technik. Heise Zeitschriften Verlag. п. 180. ISSN 0724-8679.
Ссылки
  1. ^«Графический конвейер». Microsoft. 30 мая 2018 г. Дата обращения 15 июня 2015 г.
  2. ^«Лекция: Графический конвейер и анимация». Архивировано из оригинала 7 декабря 2017 г. Получено 15 июня 2015 г.
  3. ^Лоуренс, Джейсон (22 октября 2012 г.). «Конвейер отрисовки трехмерных полигонов» (PDF ). web.archive.org. Архивировано (PDF) из оригинала 29 декабря 2016 года. Дата обращения 19 сентября 2016 года.
  4. ^Томас Акенин-Мёллер, Эрик Хейнс: Рендеринг в реальном времени, S. 11. (PDF )
  5. ^К. Нипп, Д. Стоффер; Lineare Algebra; v / d / f Hochschulverlag der ETH Zürich; Zürich 1998, ISBN 3-7281 -2649-7.
Внешние ссылки
На Викискладе есть материалы, связанные с Графическим конвейером.
Последняя правка сделана 2021-05-22 05:15:38
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте