В компьютерная графика, конвейер компьютерной графики, конвейер рендеринга или просто графический конвейер, представляет собой концептуальную модель, которая описывает, какие шаги графической системе необходимо выполнить для рендеринга 3D-сцены на 2D-экран.. После создания 3D-модели, например, в видеоигре или любой другой компьютерной 3D-анимации, графический конвейер представляет собой процесс преобразования этой 3D-модели в то, что отображает компьютер. Поскольку шаги, необходимые для этой операции, зависят от используемого программного и аппаратного обеспечения, а также от желаемых характеристик дисплея, универсального графического конвейера, подходящего для всех случаев, не существует. Однако графические интерфейсы прикладного программирования (API), такие как Direct3D и OpenGL, были созданы для объединения подобных шагов и управления графическим конвейером данного аппаратный ускоритель. Эти API абстрагируют базовое оборудование и удерживают программиста от написания кода для управления аппаратными ускорителями графики (AMD / Intel / NVIDIA и т. Д.).
Модель графического конвейера обычно используется при рендеринге в реальном времени. Часто большинство этапов конвейера реализовано аппаратно, что позволяет выполнять специальные оптимизации. Термин «конвейер» используется в том же смысле, что и конвейер в процессорах: отдельные шаги конвейера выполняются параллельно, но блокируются до тех пор, пока не будет завершен самый медленный шаг.
3D-конвейер обычно относится к наиболее распространенной форме компьютерного 3D-рендеринга, называемой 3D-рендеринг полигонов, в отличие от трассировки лучей и трассировки лучей. При трансляции лучей луч возникает в точке, где находится камера, и если этот луч попадает на поверхность, вычисляется цвет и освещение точки на поверхности, в которую попадает луч. При рендеринге трехмерных полигонов происходит обратное - вычисляется область, которая находится в поле зрения камеры, а затем создаются лучи из каждой части каждой поверхности в поле зрения камеры и прослеживаются обратно к камере.
Графический конвейер можно разделить на три основные части: приложение, геометрия и растеризация.
Этап приложения выполняется программным обеспечением на главном процессоре (CPU ). На этапе приложения изменения вносятся в сцену по мере необходимости, например, посредством взаимодействия с пользователем посредством устройств ввода или во время анимации. В современном игровом движке, таком как Unity, программист работает почти исключительно с этапом приложения и использует язык высокого уровня, такой как C #, а не на C или C ++. Новая сцена со всеми ее примитивами , обычно треугольниками, линиями и точками, затем передается на следующий этап конвейера.
Примерами задач, которые обычно выполняются на этапе приложения, являются обнаружение столкновений, методы анимации, морфинга и ускорения с использованием схем пространственного подразделения, таких как Quadtrees или Октябрь. Они также используются для уменьшения объема оперативной памяти, необходимой в данный момент. «Мир» современной компьютерной игры намного больше, чем то, что можно сразу уместить в памяти.
Шаг геометрии (с конвейер геометрии ), который отвечает за большинство операций с полигонами и их вершины (с конвейером вершин ) можно разделить на следующие пять задач. Это зависит от конкретной реализации того, как эти задачи организованы как фактические параллельные шаги конвейера.
Вершина (множественное число: вершины) - это точка в мире. Для соединения поверхностей используется множество точек. В особых случаях облака точек рисуются напрямую, но это все же исключение.
A треугольник - наиболее распространенный геометрический примитив компьютерной графики. Он определяется тремя вершинами и вектором нормали - вектор нормали служит для обозначения передней грани треугольника и является вектором, перпендикулярным поверхности. Треугольник может иметь цвет или текстуру (изображение «наклеено» поверх него). Треугольники всегда существуют на одной плоскости , поэтому они предпочтительнее прямоугольников.
Мировая система координат - это система координат, в которой создается виртуальный мир. Это должно соответствовать нескольким условиям, чтобы следующая математика могла быть легко применима:
Как определить единицу системы координат, остается на усмотрение разработчик. Следовательно, должен ли единичный вектор системы соответствовать в действительности одному метру или Ангстрему, зависит от приложения.
Объекты, содержащиеся в сцене (дома, деревья, автомобили), часто проектируются в своей собственной системе координат объекта (также называемой системой координат модели или локальной системой координат) по причинам более простого моделирования. Чтобы присвоить этим объектам координаты в мировой системе координат или глобальной системе координат всей сцены, координаты объекта преобразуются посредством перемещения, поворота или масштабирования. Это выполняется путем умножения соответствующих матриц преобразования . Кроме того, из одного объекта можно сформировать несколько по-разному преобразованных копий, например лес из дерева; Этот метод называется инстансированием.
Во-первых, нам нужны три матрицы вращения, а именно по одной для каждой из трех Оси самолета (вертикальная ось, поперечная ось, продольная ось).
Мы также используем матрицу перевода, которая mov например, самолет в нужную точку нашего мира: .
Теперь мы могли вычислить положение вершин самолета в мировых координатах, последовательно умножая каждую точку на эти четыре матрицы. Поскольку умножение матрицы на вектор довольно дорого (требует много времени), обычно выбирают другой путь и сначала умножают четыре матрицы вместе. Умножение двух матриц еще дороже, но должно выполняться только один раз для всего объекта. Умножение и эквивалентны. После этого полученную матрицу можно было применить к вершинам. На практике, однако, умножение на вершины все еще не применяется, но сначала определяются матрицы камеры - см. Ниже.
Порядок, в котором применяются матрицы: важно, потому что матричное умножение не является коммутативным. Это также относится к трем поворотам, что можно продемонстрировать на примере: точка (1, 0, 0) лежит на оси X, если повернуть ее сначала на 90 ° вокруг оси X, а затем вокруг оси Y, он заканчивается на оси Z (вращение вокруг оси X не влияет на точку, которая находится на оси). Если, с другой стороны, сначала вращается вокруг оси Y, а затем вокруг оси X, результирующая точка будет расположена на оси Y. Сама последовательность произвольна, если она всегда одинакова. Последовательность с x, затем y, затем z (крен, тангаж, курс) часто является наиболее интуитивно понятной, потому что вращение заставляет направление компаса совпадать с направлением «носа».
Есть также два соглашения для определения этих матриц, в зависимости от того, хотите ли вы работать с векторами-столбцами или векторами-строками. Здесь разные графические библиотеки имеют разные предпочтения. OpenGL предпочитает векторы-столбцы, DirectX векторы-строки. Решение определяет, с какой стороны точечные векторы должны быть умножены на матрицы преобразования. Для векторов-столбцов умножение выполняется справа, т.е. , где v out и v в - векторы-столбцы 4x1. Объединение матриц также выполняется справа налево, т.е., например, , при первом вращении, а затем при переключении.
В случае векторов-строк это работает с точностью до наоборот. Умножение теперь происходит слева как с векторами из 1x4 строк, а конкатенация составляет когда мы сначала вращаемся, а затем перемещаемся. Показанные выше матрицы действительны для второго случая, тогда как матрицы для векторов-столбцов транспонированы. Применяется правило , которое для умножения на векторы означает, что вы можете переключать порядок умножения, транспонируя матрицу.
Интересная особенность этой цепочки матриц состоит в том, что при каждом таком преобразовании определяется новая система координат. Это может быть расширено по желанию. Например, пропеллер летательного аппарата может быть отдельной моделью, которая затем переводится в носовую часть самолета. Этот перевод нужен только для описания перехода от системы координат модели к системе координат воздушного винта. Чтобы нарисовать весь самолет, сначала определяется матрица преобразования для самолета, преобразуются точки, а затем матрица модели воздушного винта умножается на матрицу самолета, а затем преобразуются точки пропеллера.
Рассчитанная таким образом матрица также называется мировой матрицей. Его необходимо определить для каждого объекта в мире перед рендерингом. Приложение может вносить здесь изменения, например изменять положение летательного аппарата в зависимости от скорости после каждого кадра.
В дополнение к объектам сцена также определяет виртуальную камеру или средство просмотра, которое указывает положение и направление обзора, с которого сцена должна быть визуализирована. Чтобы упростить последующее проецирование и обрезку, сцена трансформируется так, чтобы камера находилась в исходной точке, глядя вдоль оси Z. Результирующая система координат называется системой координат камеры, а преобразование называется преобразованием камеры или преобразованием вида.
Шаг преобразования 3D-проекции запишите объем вида в куб с координатами угловой точки (-1, -1, 0) и (1, 1, 1); Иногда также используются другие целевые тома. Этот шаг называется проекцией, даже если он преобразует объем в другой, поскольку полученные координаты Z не сохраняются в изображении, а используются только в Z-буферизации на более позднем этапе растрирования. На иллюстрации перспективы используется центральная проекция . Для ограничения количества отображаемых объектов используются две дополнительные плоскости отсечения; Таким образом, визуальный объем представляет собой усеченную пирамиду (frustum ). Параллельная или ортогональная проекция используется, например, для технических представлений, потому что она имеет то преимущество, что все параллели в пространстве объектов также параллельны в пространстве изображения, а поверхности и объемы имеют одинаковый размер независимо от расстояния от зрителя. Карты используют, например, ортогональную проекцию (так называемый ортофото ), но наклонные изображения ландшафта не могут использоваться таким образом - хотя их технически можно визуализировать, они кажутся настолько искаженными, что мы не можем сделать любое их использование. Формула для вычисления матрицы перспективного отображения:
Причины, по которым здесь необходимо указать наименьшее и наибольшее расстояние, заключаются, с одной стороны, в том, что это расстояние делится на, чтобы достичь масштабирования сцены (подробнее удаленные объекты меньше на перспективном изображении, чем близкие объекты), и, с другой стороны, масштабировать значения Z в диапазоне 0..1 для заполнения Z-буфера. Этот буфер часто имеет разрешение всего 16 бит, поэтому ближние и дальние значения следует выбирать осторожно. Слишком большая разница между ближним и дальним значением приводит к так называемому Z-бою из-за низкого разрешения Z-буфера. Также из формулы видно, что ближайшее значение не может быть 0, потому что эта точка является точкой фокусировки проекции. На данный момент нет изображения.
Для полноты формула для параллельной проекции (ортогональной проекции):
Из соображений эффективности камера и матрица проекции обычно объединяются в матрицу преобразования, так что система координат камеры опускается. Результирующая матрица обычно одинакова для одного изображения, тогда как мировая матрица выглядит по-разному для каждого объекта. Поэтому на практике вид и проекция предварительно рассчитываются, так что во время отображения необходимо адаптировать только мировую матрицу. Однако возможны более сложные преобразования, такие как. Также могут быть выполнены свободно программируемые геометрические шейдеры, которые изменяют геометрию.
На этапе фактического рендеринга вычисляется мировая матрица * матрица камеры * матрица проекции, которая затем применяется к каждой отдельной точке. Таким образом, точки всех объектов переносятся непосредственно в систему координат экрана (по крайней мере, почти, диапазон значений осей все еще -1..1 для видимого диапазона, см. Раздел «Окно-Видовой экран-Преобразование»).
Часто сцена содержит источники света, размещенные в разных положениях, чтобы освещение объектов выглядело более реалистичным. В этом случае коэффициент усиления текстуры вычисляется для каждой вершины на основе источников света и свойств материала, связанных с соответствующим треугольником. На более позднем этапе растеризации значения вершин треугольника интерполируются по его поверхности. Общее освещение (рассеянное освещение) применяется ко всем поверхностям. Это рассеянная и, следовательно, не зависящая от направления яркость сцены. Солнце - это направленный источник света, который можно считать бесконечно далеким. Освещение, создаваемое солнцем на поверхности, определяется путем формирования скалярного произведения вектора направления от солнца и вектора нормали к поверхности. Если значение отрицательное, поверхность обращена к солнцу.
Только примитивы, которые находятся в визуальном объеме, должны быть растрированы (нарисованы). Этот визуальный объем определяется как внутренняя часть пирамиды усеченной конструкции, имеющей форму пирамиды с срезанной вершиной. Примитивы, которые полностью находятся за пределами визуального объема, отбрасываются; Это называется отбраковкой пирамиды. Дополнительные методы отбраковки, такие как отбраковка обратной стороны, которые уменьшают количество примитивов, которые необходимо учитывать, теоретически могут выполняться на любом этапе графического конвейера. Примитивы, которые только частично находятся внутри куба, должны быть обрезаны относительно куба. Преимущество предыдущего шага проецирования заключается в том, что отсечение всегда происходит по одному и тому же кубу. Только - возможно обрезанные - примитивы, находящиеся в визуальном объеме, направляются на последний шаг.
Для вывода изображения в любую целевую область (область просмотра) экрана необходимо применить другое преобразование, преобразование Window-Viewport.. Это сдвиг с последующим масштабированием. Результирующие координаты являются координатами устройства вывода. Область просмотра содержит 6 значений: высота и ширина окна в пикселях, верхний левый угол окна в координатах окна (обычно 0, 0) и минимальное и максимальное значения для Z (обычно 0 и 1).
На современном оборудовании большинство шагов вычисления геометрии выполняется в вершинном шейдере . Это, в принципе, свободно программируется, но обычно выполняет, по крайней мере, преобразование точек и расчет освещенности. Для интерфейса программирования DirectX использование настраиваемого вершинного шейдера необходимо начиная с версии 10, в то время как более старые версии по-прежнему имеют стандартный шейдер.
Этап растеризации - это последний шаг перед конвейером фрагментного шейдера, на котором все примитивы растеризуются. На этапе растеризации дискретные фрагменты создаются из непрерывных примитивов.
На этом этапе графического конвейера точки сетки также называются фрагментами для большей различимости. Каждый фрагмент соответствует одному пикселю в буфере кадра, а это соответствует одному пикселю экрана. Они могут быть цветными (и, возможно, с подсветкой). Кроме того, необходимо определить видимый, ближе к наблюдателю фрагмент, в случае перекрытия полигонов. Z-буфер обычно используется для этого так называемого определения скрытой поверхности. Цвет фрагмента зависит от освещения, текстуры и других свойств материала видимого примитива и часто интерполируется с использованием свойств вершины треугольника. Если возможно, фрагментный шейдер (также называемый Pixel Shader ) запускается на этапе растрирования для каждого фрагмента объекта. Если фрагмент виден, теперь его можно смешивать с уже существующими значениями цвета в изображении, если используется прозрачность или множественная выборка. На этом этапе один или несколько фрагментов становятся пикселем.
Чтобы пользователь не увидел постепенную растеризацию примитивов, используется двойная буферизация. Растеризация выполняется в специальной области памяти. После того как изображение будет полностью растеризовано, оно копируется в видимую область памяти изображений.
Все используемые матрицы неособые и, следовательно, обратимые. Поскольку умножение двух невырожденных матриц создает другую невырожденную матрицу, вся матрица преобразования также является обратимой. Обратное значение требуется для пересчета мировых координат из координат экрана - например, для определения по положению указателя мыши объекта, по которому щелкнули мышью. Однако, поскольку экран и мышь имеют только два измерения, третье неизвестно. Таким образом, луч проецируется в мир в позиции курсора, а затем определяется пересечение этого луча с многоугольниками в мире.
Классические видеокарты все еще относительно близки к графическому конвейеру. С ростом требований к GPU ограничения были постепенно сняты, чтобы обеспечить большую гибкость. Современные видеокарты используют свободно программируемый конвейер, управляемый шейдером, который обеспечивает прямой доступ к отдельным этапам обработки. Чтобы разгрузить основной процессор, дополнительные этапы обработки были перенесены в конвейер и графический процессор.
Самыми важными шейдерными блоками являются пиксельные шейдеры, вершинные шейдеры и геометрические шейдеры. Унифицированный шейдер был введен, чтобы в полной мере использовать все возможности. Это дает вам единый большой пул шейдерных модулей. При необходимости пул разбивается на разные группы шейдеров. Следовательно, строгое разделение между типами шейдеров больше не полезно.
Также можно использовать так называемый вычислительный шейдер для выполнения любых вычислений вне отображения графики на GPU. Преимущество в том, что они работают очень параллельно, но с некоторыми ограничениями. Эти универсальные вычисления также называются вычислениями общего назначения на графических процессорах или для краткости GPGPU .
На Викискладе есть материалы, связанные с Графическим конвейером. |