Vulkan API — урок 20. Графический конвейер, предисловие

Graphics pipeline – графический конвейер – то что будет описано в ближайших уроках, а именно как создать графический конвейер, который настроен на рисование нашего треугольника.

Графический конвейер представляет собой последовательность операций, которые преобразуют вершины и текстуры к соответствующим пикселям на экране. Ну а проще это будет понять по схеме:

pipeline

Здесь и далее наименования этапов будут писаться на английском языке и курсивом, что бы было проще понять о чем идет речь.

Input assembler (входящий транслятор, транслятор входящих данных) собирает исходные данные вершин из указанных вами буферов. Так же может буфер индексов дублирования некоторых элементов, без необходимости дублировать данные вершин.

Vertex shader (вершинный шейдер) запускается для каждой вершины и в целом производит преобразования для переноса позиций вершин из пространства моделей в пространство экрана. Он так же передает данные по вершинам далее по конвейеру.

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

Gometry shaders (геометрический шейдер) запускаются для каждого примитива (треугольник, линия, точка) и могут отбросить часть из них, либо же вывести больше примитивов, чем имелось ранее. Они аналогичны tessellation shaders, но более гибкие. Правда за эту гибкость приходится платить производительностью, потому ныне не особо распространены. Поговаривают что на большинстве видеокарт дело конечно неахти, но встроенные GPU от Intel с этим делом справляются не плохо, чего лично я подтвердить не могу, но могу сказать что вся щупанная мной встройка от синих – полных швах (но сталкивался года два назад последний раз).

Rasterization (растеризация) – дискретизация примитивов на фрагменты (fragments). Это пиксельные элементы, которыми заполняют фреймбуфер. Выходящие за пределы экрана фрагменты отбрасываются, и выдаваемые vertex shader’ом атрибуты интерполируются по фрагментам, как показано на рисунке. Обычно фрагменты, перекрываемые другими фрагментами так же отбрасываются благодаря тестированию глубины.

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

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

Шаги помеченные зеленым цветом известны как fixed-function – постоянные функции. Эти шаги можно настроить используя параметры, но как таковые алгоритмы предопределены.

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

Если вы использовали старые API на подобии OpenGL и Direct3D ранее, тогда вы будете использовать функции на подобии glBlendFunc и OMSetBlendState для возможности изменить какие-либо свойства по собственному желанию. Но вот графический конвейер в Vulkan’е практически полностью неизменен, так что придется воссоздавать его с нуля, если вы хотите изменить шейдеры, связать различные фреймбуферы или изменить функцию смешивания. Т.е. вам нужно создать несколько конвейеров для представления различных нужных комбинаций состояний (создание на ходу – штука ресурсозатратная). Однако вместе с тем вся информация о конвейере будет известна заранее, благодаря чем драйвер сможет гораздо лучше его оптимизировать.

Некоторые программируемые шаги вовсе не обязательны и вы можете их отключить при желании. К примеру tessellation и gometry shaders могут быть отключены, если ван нужно использовать лишь простейшую геометрию.

В следующих 5-ти уроках будет рассказано как создать графический конвейер. Постараюсь успеть до выходных.

Main Admin

2 Comments

  1. Будет ли краткое введение в шейдеры? Для полносты картины, так сказать…

    • Да, сегодня уже не успеваю, завтра будет 2 урока про шейдеры (но пока без буфера вершин), и еще 3 урока про остальные элементы конвейера.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *