Графический конвейер - Graphics pipeline
Эта статья поднимает множество проблем. Пожалуйста помоги Улучши это или обсудите эти вопросы на страница обсуждения. (Узнайте, как и когда удалить эти сообщения-шаблоны) (Узнайте, как и когда удалить этот шаблон сообщения)
|
В компьютерная графика, а конвейер компьютерной графики, конвейер рендеринга или простографический конвейер, представляет собой концептуальную модель, описывающую шаги, которые необходимо выполнить графической системе, чтобыоказывать 3D-сцену на 2D-экран.[1] Когда 3D модель был создан, например, в видео игра или любой другой компьютерной 3D-анимации, графический конвейер - это процесс преобразования этой 3D-модели в то, что отображает компьютер.[2] Поскольку шаги, необходимые для этой операции, зависят от используемого программного и аппаратного обеспечения и желаемых характеристик дисплея, универсального графического конвейера, подходящего для всех случаев, не существует. Однако графика интерфейсы прикладного программирования (API) Такие как Direct3D и OpenGL были созданы, чтобы унифицировать аналогичные шаги и управлять графическим конвейером данного аппаратный ускоритель. Эти API-интерфейсы абстрагируют базовое оборудование и удерживают программиста от написания кода для управления графическими аппаратными ускорителями (AMD /Intel /NVIDIA так далее.).
Модель графического конвейера обычно используется при рендеринге в реальном времени. Часто большинство этапов конвейера реализуется аппаратно, что позволяет оптимизации. Термин «конвейер» используется в том же смысле, что и конвейер в процессорах: отдельные шаги конвейера выполняются параллельно, но блокируются до тех пор, пока не будет завершен самый медленный шаг.
Концепция
3D-конвейер обычно относится к наиболее распространенной форме компьютерного 3D-рендеринга, называемой Рендеринг 3D-полигонов[нужна цитата ], в отличие от трассировка лучей и лучей. При трансляции лучей возникает луч в точке, где находится камера, и если этот луч попадает на поверхность, цвет и освещение точки на поверхности, куда рассчитывается попадание луча. При рендеринге 3D-полигонов происходит обратное - вычисляется область, которая находится в поле зрения камеры, а затем создаются лучи из каждой части каждой поверхности в поле зрения камеры и прослеживаются обратно к камере.[3]
Структура
Графический конвейер можно разделить на три основные части: приложение, геометрия и растеризация.[4]
Заявление
Шаг приложения выполняется программным обеспечением на главном процессоре (ЦПУ ). На этапе приложения изменения вносятся в сцену по мере необходимости, например, посредством взаимодействия с пользователем посредством устройства ввода или во время анимации. В современном Игровой движок Такие как Единство, программист имеет дело почти исключительно с этапом приложения и использует язык высокого уровня, такой как C #, в отличие от C или же C ++. Новая сцена со всеми ее примитивы, обычно треугольники, линии и точки, затем передаются на следующий шаг в конвейере.
Примеры задач, которые обычно выполняются на этапе приложения: обнаружение столкновения, методы анимации, морфинга и ускорения с использованием схем пространственного деления, таких как Quadtrees или же Octrees. Они также используются для уменьшения объема оперативной памяти, необходимой в данный момент. «Мир» современной компьютерной игры намного больше, чем то, что можно сразу уместить в памяти.
Геометрия
Шаг геометрии (с Геометрия конвейера ), который отвечает за большинство операций с полигоны и их вершины (с Вершинный трубопровод ), можно разделить на следующие пять задач. Это зависит от конкретной реализации того, как эти задачи организованы как фактические параллельные шаги конвейера.
Определения
А вершина (множественное число: вершины) - точка в мире. Для соединения поверхностей используется множество точек. В особых случаях облака точек рисуются напрямую, но это все же исключение.
А треугольник является наиболее распространенным геометрическим примитивом компьютерной графики. Он определяется своими тремя вершинами и нормальный вектор - вектор нормали служит для обозначения передней грани треугольника и является вектором, перпендикулярным поверхности. Треугольник может иметь цвет или текстура (изображение «наклеено» поверх него). Треугольники всегда существуют на одном самолет, поэтому они предпочтительнее прямоугольников.
Мировая система координат
Мир система координат - система координат, в которой создается виртуальный мир. Она должна удовлетворять нескольким условиям, чтобы следующая математика была легко применима:
- Это должна быть прямоугольная декартова система координат, в которой все оси имеют одинаковый масштаб.
Как определяется единица системы координат, остается на усмотрение разработчика. Следовательно, должен ли единичный вектор системы в действительности соответствовать одному метру или Ангстрем зависит от приложения.
- Будь правша или левша система координат может определяться используемой графической библиотекой.
- Пример: Если нам нужно разработать симулятор полета, мы можем выбрать мировую систему координат так, чтобы начало координат находилось в центре Земли, а единица измерения была установлена на один метр. Вдобавок, чтобы упростить отсылку к реальности, мы определяем, что ось X должна пересекать экватор на нулевом меридиане, а ось Z проходит через полюса. В системе с правой рукой ось Y проходит через восточный меридиан 90 ° (где-то в Индийский океан ). Теперь у нас есть система координат, которая описывает каждую точку на Земле в трехмерном виде. Декартовы координаты. В этой системе координат мы теперь моделируем принципы нашего мира, гор, долин и океанов.
- Примечание: Помимо компьютерной геометрии, географические координаты используются для земной шар, т.е. широта и долгота, а также высоты над уровнем моря. Приблизительное преобразование - если не учитывать тот факт, что Земля не является точной сферой - просто:
- где R = радиус Земли [6,378,137 м], широта = широта, долгота = долгота, hasl = высота над уровнем моря.
- Все следующие примеры применимы к системе с правой рукой. Для левосторонней системы, возможно, потребуется поменять местами знаки.
Объекты, содержащиеся в сцене (дома, деревья, автомобили), часто проектируются в своей собственной системе координат объекта (также называемой системой координат модели или локальной системой координат) из соображений упрощения моделирования. Чтобы присвоить этим объектам координаты в мировой системе координат или глобальной системе координат всей сцены, координаты объекта преобразуются посредством перемещения, поворота или масштабирования. Это делается путем умножения соответствующих матрицы преобразования. Кроме того, из одного объекта можно сформировать несколько по-разному преобразованных копий, например лес из дерева; Этот метод называется инстансированием.
- Чтобы разместить модель самолета в мире, мы сначала определяем четыре матрицы. Поскольку мы работаем в трехмерном пространстве, нам нужны четырехмерные однородные матрицы для наших расчетов.
Во-первых, нам нужно три матрицы вращения, а именно по одной для каждой из трех осей самолета (вертикальная ось, поперечная ось, продольная ось).
- Вокруг оси X (обычно определяется как продольная ось в системе координат объекта)
- Вокруг оси Y (обычно определяется как поперечная ось в системе координат объекта)
- Вокруг оси Z (обычно определяется как вертикальная ось в системе координат объекта)
Мы также используем матрицу трансляции, которая перемещает самолет в желаемую точку нашего мира:.
- Замечание: Вышеуказанные матрицы транспонированный относительно тех, что в статье матрица вращения. См. Ниже объяснение почему.
Теперь мы могли вычислить положение вершин самолета в мировых координатах, последовательно умножая каждую точку на эти четыре матрицы. Поскольку умножение матрицы на вектор довольно дорого (занимает много времени), обычно выбирают другой путь и сначала умножают четыре матрицы вместе. Умножение двух матриц еще дороже, но должно выполняться только один раз для всего объекта. Умножения и эквивалентны. После этого полученную матрицу можно было применить к вершинам. На практике, однако, умножение на вершины по-прежнему не применяется, а сначала определяются матрицы камеры - см. Ниже.
- Однако для нашего примера, приведенного выше, перевод следует определять несколько иначе, поскольку общее значение слова Вверх - за исключением Северного полюса - не совпадает с нашим определением положительной оси Z, и поэтому модель также должна вращаться вокруг центра Земли: На первом этапе исходная точка модели перемещается на правильную высоту над земной поверхностью, затем она поворачивается по широте и долготе.
Порядок, в котором применяются матрицы, важен, потому что матричное умножение является нет коммутативный. Это также относится к трем поворотам, что можно продемонстрировать на примере: точка (1, 0, 0) лежит на оси X, если повернуть ее сначала на 90 ° вокруг оси X, а затем вокруг оси Y , он заканчивается на оси Z (вращение вокруг оси X не влияет на точку, которая находится на оси). Если, с другой стороны, сначала вращается вокруг оси Y, а затем вокруг оси X, результирующая точка будет расположена на оси Y. Сама последовательность произвольна, если она всегда одинакова. Последовательность с x, затем y, затем z (крен, тангаж, курс) часто является наиболее интуитивно понятной, потому что вращение заставляет направление компаса совпадать с направлением «носа».
Есть также два соглашения для определения этих матриц, в зависимости от того, хотите ли вы работать с векторами-столбцами или векторами-строками. Здесь разные графические библиотеки имеют разные предпочтения. OpenGL предпочитает векторы-столбцы, DirectX векторы-строки. Решение определяет, с какой стороны точечные векторы должны быть умножены на матрицы преобразования. Для векторов-столбцов умножение выполняется справа, т.е. , где vиз и vв являются векторами-столбцами 4x1. Объединение матриц также выполняется справа налево, т.е., например, , при первом вращении, а затем при переключении.
В случае векторов-строк это работает с точностью до наоборот. Умножение теперь происходит слева как с векторами 1x4 и конкатенация когда мы сначала вращаемся, а потом движемся. Показанные выше матрицы действительны для второго случая, тогда как матрицы для векторов-столбцов транспонированы. Правило [5] применяется, что для умножения на векторы означает, что вы можете изменить порядок умножения, транспонируя матрицу.
Интересный момент в этой цепочке матриц заключается в том, что при каждом таком преобразовании определяется новая система координат. Это может быть расширено по желанию. Например, пропеллер летательного аппарата может быть отдельной моделью, которая затем переводится в носовую часть самолета. Этот перевод нужен только для описания перехода от системы координат модели к системе координат воздушного винта. Чтобы нарисовать весь самолет, сначала определяется матрица преобразования для самолета, преобразуются точки, а затем матрица модели воздушного винта умножается на матрицу самолета, а затем преобразуются точки пропеллера.
Вычисленную таким образом матрицу также называют мировая матрица. Его необходимо определить для каждого объекта в мире перед рендерингом. Приложение может вносить здесь изменения, например изменять положение летательного аппарата в зависимости от скорости после каждого кадра.
Трансформация камеры
В дополнение к объектам сцена также определяет виртуальную камеру или средство просмотра, которое указывает положение и направление обзора, с которого сцена должна визуализироваться. Чтобы упростить последующее проецирование и обрезку, сцена трансформируется так, чтобы камера находилась в исходной точке, глядя вдоль оси Z. Результирующая система координат называется системой координат камеры, а преобразование - трансформация камеры или же Просмотр трансформации.
- Матрица обзора обычно определяется из положения камеры, целевой точки (куда смотрит камера) и «вектора вверх» («вверх» с точки зрения зрителя). Требуются первые три вспомогательных вектора:
- Zaxis = нормальный (cameraPosition - cameraTarget)
- Xaxis = нормальный (cross (cameraUpVector, zaxis))
- Yaxis = крест (zaxis, xaxis)
- С normal (v) = нормализация вектора v;
- крест (v1, v2) = перекрестное произведение из v1 и v2.
- Наконец, матрица:
- с точкой (v1, v2) = скалярное произведение из v1 и v2.
Проекция
В 3D проекция step преобразует объем обзора в куб с координатами угловой точки (-1, -1, 0) и (1, 1, 1); Иногда также используются другие целевые тома. Этот шаг называется проекция, несмотря на то, что он преобразует объем в другой объем, поскольку полученные координаты Z не сохраняются в изображении, а используются только в Z-буферизация на более позднем этапе растрирования. В перспективная иллюстрация, а центральная проекция используется. Для ограничения количества отображаемых объектов используются две дополнительные плоскости отсечения; Таким образом, визуальный объем представляет собой усеченную пирамиду (усеченный ). Параллельный или ортогональная проекция используется, например, для технических представлений, потому что его преимущество состоит в том, что все параллели в пространстве объектов также параллельны в пространстве изображения, а поверхности и объемы имеют одинаковый размер независимо от расстояния от зрителя. Карты используют, например, ортогональную проекцию (так называемую ортофото ), но наклонные изображения ландшафта не могут быть использованы таким образом - хотя технически их можно визуализировать, они кажутся настолько искаженными, что мы не можем их использовать. Формула для расчета матрицы отображения перспективы:
- При h = cot (fieldOfView / 2.0) (угол раскрытия камеры); w = h / aspectRatio (соотношение сторон целевого изображения); near = Наименьшее расстояние для видимости; far = Наибольшее расстояние, на котором должно быть видно.
Причины, по которым здесь необходимо указать наименьшее и наибольшее расстояние, заключаются, с одной стороны, в том, что это расстояние делится, чтобы достичь масштабирования сцены (более удаленные объекты меньше на перспективном изображении, чем близкие объекты) , и, с другой стороны, масштабировать значения Z в диапазоне 0..1 для заполнения Z-буфер. Этот буфер часто имеет разрешение всего 16 бит, поэтому ближние и дальние значения следует выбирать осторожно. Слишком большая разница между ближним и дальним значением приводит к так называемому Z-файтинг из-за низкого разрешения Z-буфера. Также из формулы видно, что ближайшее значение не может быть 0, потому что эта точка является точкой фокусировки проекции. На данный момент нет изображения.
Для полноты формула параллельной проекции (ортогональной проекции):
- где w = ширина целевого куба (размерность в единицах мировой системы координат); H = w / aspectRatio (соотношение сторон целевого изображения); near = Наименьшее расстояние для видимости; far = Наибольшее расстояние, на котором должно быть видно.
Из соображений эффективности камера и матрица проекции обычно объединяются в матрицу преобразования, поэтому система координат камеры опускается. Результирующая матрица обычно одинакова для одного изображения, тогда как мировая матрица выглядит по-разному для каждого объекта. Поэтому на практике вид и проекция предварительно рассчитываются, так что во время отображения необходимо адаптировать только мировую матрицу. Однако более сложные преобразования, такие как вершинное смешение возможны. Свободно программируемый геометрические шейдеры которые изменяют геометрию, также могут быть выполнены.
На этапе фактического рендеринга вычисляется мировая матрица * матрица камеры * матрица проекции, которая затем применяется к каждой отдельной точке. Таким образом, точки всех объектов переносятся непосредственно в систему координат экрана (по крайней мере, почти, диапазон значений осей все еще -1..1 для видимого диапазона, см. Раздел «Окно-Видовой экран-Преобразование»).
Освещение
Часто сцена содержит источники света, размещенные в разных местах, чтобы освещение объектов выглядело более реалистично. В этом случае коэффициент усиления текстуры вычисляется для каждой вершины на основе источников света и свойств материала, связанных с соответствующим треугольником. На более позднем этапе растеризации значения вершин треугольника интерполируются по его поверхности. Общее освещение (рассеянное освещение) применяется ко всем поверхностям. Это рассеянная и, следовательно, не зависящая от направления яркость сцены. Солнце - это направленный источник света, который можно считать бесконечно далеким. Освещение, создаваемое солнцем на поверхности, определяется путем формирования скалярного произведения вектора направления от солнца и вектора нормали к поверхности. Если значение отрицательное, поверхность обращена к солнцу.
Вырезка
Только примитивы, находящиеся в визуальном объеме, должны быть растянутый (нарисовано). Этот визуальный объем определяется как внутренняя часть усеченный, фигура в виде пирамиды со срезанной вершиной. Примитивы, которые полностью находятся за пределами визуального объема, отбрасываются; Это называется выбраковка усеченной кости. Дополнительные методы отбраковки, такие как отбраковка обратной стороны, которые уменьшают количество примитивов, которые необходимо учитывать, теоретически могут выполняться на любом этапе графического конвейера. Примитивы, которые только частично находятся внутри куба, должны быть обрезанный против куба. Преимущество предыдущего шага проецирования заключается в том, что отсечение всегда происходит по одному и тому же кубу. Только - возможно обрезанные - примитивы, находящиеся в визуальном объеме, направляются на последний шаг.
Преобразование окно-видовой экран
Чтобы вывести изображение в любую целевую область (область просмотра) экрана, другое преобразование, Преобразование окно-видовой экран, необходимо применить. Это сдвиг с последующим масштабированием. Полученные координаты являются координатами устройства вывода. Область просмотра содержит 6 значений: высота и ширина окна в пикселях, верхний левый угол окна в координатах окна (обычно 0, 0) и минимальное и максимальное значения для Z (обычно 0 и 1).
- Формально:
- С vp = Viewport; v = точка после проецирования
На современном оборудовании большинство этапов вычисления геометрии выполняется в вершинный шейдер. Это, в принципе, свободно программируется, но обычно выполняет, по крайней мере, преобразование точек и расчет освещенности. Для интерфейса программирования DirectX использование настраиваемого вершинного шейдера необходимо начиная с версии 10, в то время как более старые версии по-прежнему имеют стандартный шейдер.
Растеризация
Шаг растеризации - это последний шаг перед конвейером фрагментного шейдера, на котором все примитивы растеризованный с. На этапе растеризации дискретные фрагменты создаются из непрерывных примитивов.
На этом этапе графического конвейера точки сетки также называются фрагментами для большей различимости. Каждый фрагмент соответствует одному пикселю в буфере кадра, а это соответствует одному пикселю экрана. Они могут быть цветными (и, возможно, с подсветкой). Кроме того, необходимо определить видимый, ближе к наблюдателю фрагмент, в случае перекрытия полигонов. Z-буфер обычно используется для этого так называемого определение скрытой поверхности. Цвет фрагмента зависит от освещения, текстуры и других свойств материала видимого примитива и часто интерполируется с использованием свойств вершины треугольника. Если возможно, фрагментный шейдер (также называемый Пиксельный шейдер ) запускается на этапе растрирования для каждого фрагмента объекта. Если фрагмент виден, теперь его можно смешивать с уже существующими значениями цвета в изображении, если используется прозрачность или множественная выборка. На этом этапе один или несколько фрагментов становятся пикселем.
Чтобы пользователь не увидел постепенную растеризацию примитивов, используется двойная буферизация. Растеризация выполняется в специальной области памяти. После того, как изображение будет полностью растрировано, оно копируется в видимую область памяти изображений.
Обратный
Все используемые матрицы неособый и поэтому обратимый. Поскольку умножение двух невырожденных матриц создает другую невырожденную матрицу, вся матрица преобразования также является обратимой. Обратное значение требуется для пересчета мировых координат из экранных координат - например, для определения по положению указателя мыши объекта, по которому щелкнули мышью. Однако, поскольку экран и мышь имеют только два измерения, третье неизвестно.Поэтому луч проецируется в мир в позиции курсора, а затем определяется пересечение этого луча с многоугольниками в мире.
Шейдер
Классические видеокарты все еще относительно близки к графическому конвейеру. С ростом требований к GPU, ограничения были постепенно сняты, чтобы обеспечить большую гибкость. Современные видеокарты используют свободно программируемый конвейер, управляемый шейдером, который обеспечивает прямой доступ к отдельным этапам обработки. Чтобы разгрузить основной процессор, дополнительные этапы обработки были перенесены в конвейер и графический процессор.
Наиболее важные шейдерные блоки: пиксельные шейдеры, вершинные шейдеры, и геометрические шейдеры. Унифицированный шейдер был введен, чтобы в полной мере использовать все возможности. Это дает вам единый большой пул шейдерных модулей. При необходимости пул разбивается на разные группы шейдеров. Следовательно, строгое разделение между типами шейдеров больше не полезно.
Также можно использовать так называемый вычислительный шейдер для выполнения любых вычислений вне отображения графики на графическом процессоре. Преимущество в том, что они работают очень параллельно, но с некоторыми ограничениями. Эти универсальные вычисления также называют универсальные вычисления на графических процессорах, или же ГПГПУ для краткости.
Смотрите также
Источники
- Томас Акенин-Мёллер, Эрик Хейнс: Рендеринг в реальном времени. А. К. Петерс, Натик, штат Массачусетс, 2002 г., ISBN 1-56881-182-9.
- Майкл Бендер, Манфред Брилл: Компьютерная графика: ein anwendungsorientiertes Lehrbuch. Hanser, Мюнхен, 2006 г., ISBN 3-446-40434-1.
- Фишер, Мартин (04.07.2011). Пиксель-Фабрик. Wie Grafikchips Spielewelten auf den Schirm zaubern. c't Magazin für Computer Technik. Heise Zeitschriften Verlag. п. 180. ISSN 0724-8679.
Рекомендации
- ^ «Графический конвейер». Microsoft. 30 мая 2018 г.. Получено 15 июн 2015.
- ^ «Лекция: Графический конвейер и анимация». Архивировано из оригинал 7 декабря 2017 г.. Получено 15 июн 2015.
- ^ Лоуренс, Джейсон (22 октября 2012 г.). «Конвейер отрисовки трехмерных полигонов» (PDF ). web.archive.org. В архиве (PDF) с оригинала 29 декабря 2016 г.. Получено 2019-09-19.
- ^ Томас Акенин-Мёллер, Эрик Хейнс: Рендеринг в реальном времени, С. 11. (PDF )
- ^ К. Нипп, Д. Стоффер; Линейная алгебра; v / d / f Hochschulverlag der ETH Zürich; Цюрих 1998, ISBN 3-7281-2649-7.