Введение

Процедура преобразования 3D-сцен в 2D-изображения

Графический конвейер, также известный как конвейер рендеринга или графическая труба, представляет собой структуру в компьютерной графике, определяющую необходимые процедуры для преобразования трехмерной (3D) сцены в двухмерное (2D) представление на экране. После создания 3D-модели графический конвейер преобразует модель в визуально воспринимаемый формат на дисплее компьютера. Ввиду зависимости от конкретного программного обеспечения, аппаратных конфигураций и желаемых атрибутов отображения, универсального графического конвейера не существует. Тем не менее, графические интерфейсы программирования приложений (API), такие как Direct3D, OpenGL и Vulkan, были разработаны для стандартизации общих процедур и управления графическим конвейером конкретного аппаратного ускорителя. Эти API предоставляют уровень абстракции над базовым оборудованием, избавляя программистов от необходимости писать код, явно ориентированный на различные графические аппаратные ускорители, такие как AMD, Intel, Nvidia и другие. Модель графического конвейера обычно используется при рендеринге в реальном времени. Часто большинство этапов конвейера реализуются аппаратно, что позволяет проводить специальные оптимизации. Термин "конвейер" используется в аналогичном смысле, как и для конвейера в процессорах: отдельные этапы конвейера выполняются параллельно, пока у каждого этапа есть необходимые данные.

Концепция

3D-трубопровод обычно подразумевает наиболее распространенный метод компьютерного 3D-рендеринга – 3D-полигональный рендеринг, в отличие от трассировки лучей (Raytracing) и растеризации (Raycasting). В растеризации луч исходит из положения камеры, и если этот луч пересекает поверхность, вычисляется цвет и освещение точки пересечения. В 3D-полигональном рендеринге происходит обратное: сначала определяется область, видимая камере, а затем из каждой части каждой видимой поверхности создаются лучи, которые отслеживаются до камеры.

Структура

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

Применение

Шаг приложения выполняется программным обеспечением на основном процессоре (CPU). В ходе этого шага в сцену вносятся необходимые изменения, например, в результате взаимодействия пользователя с помощью устройств ввода или при воспроизведении анимации. Новая сцена со всеми ее примитивами, как правило, треугольниками, линиями и точками, затем передается на следующий этап графического конвейера. Примеры задач, выполняемых на этапе приложения, включают обнаружение столкновений, анимацию, морфинг и методы ускорения с использованием схем пространственного разбиения, таких как Quadtrees или Octrees. Они также используются для снижения объема необходимой оперативной памяти в определенный момент времени. "Мир" современной компьютерной игры значительно больше, чем объем памяти, доступный одновременно.

Геометрия

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

Определения

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

Освещение

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

Отрезка

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

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

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

Обратная

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

Шейдер

Классические видеокарты все еще относительно близки к графическому конвейеру. С ростом требований к GPU ограничения постепенно снимались для обеспечения большей гибкости. Современные видеокарты используют свободно программируемый, управляемый шейдерами конвейер, который обеспечивает прямой доступ к отдельным этапам обработки. Чтобы разгрузить центральный процессор, дополнительные этапы обработки были перенесены в конвейер и GPU. Наиболее важными шейдерными блоками являются вершинные шейдеры, геометрические шейдеры и пиксельные шейдеры. Объединенный шейдер был представлен для полного использования всех блоков. Это создает единый большой пул шейдерных блоков. По мере необходимости пул разделяется на различные группы шейдеров. Строгое разделение между типами шейдеров, таким образом, больше не имеет смысла. Также возможно использование так называемого вычислительного шейдера для выполнения любых вычислений, не связанных с отображением графики, на GPU. Преимущество заключается в их высокой степени параллельности, но существуют и ограничения. Эти универсальные вычисления также называются вычислениями общего назначения на графических процессорах, или GPGPU. Mesh-шейдеры – это недавнее дополнение, направленное на устранение узких мест фиксированной структуры геометрического конвейера.