Растеризация в 3D графике от Классики до MeshShader
Tags: CG, 3D, Render, Pipeline, Shaders
Предисловие
Эта статья писалась для закрытого сообщества boosty, куда я пишу отдельные "Сжатые" статьи, подробнее в конце статьи... Но уж больно она подходит к тематике DTF блога, так что, хватайте пяй и чеченьки, будет на сложном, приятного прочтения :^>
Статья будет полезна всем, кто вникает в низкоуровневую компьютерную графику, пишет шейдера или собирает кастомные RenderPass.
В ней встречается много профессионального жаргона и требует от вас базового представления о структуре меша и шейдинге.
Классический пайплайн отрисовки при помощи растеризации можно описать как линейную последовательность. В ней каждый этап передает преобразованные данные следующему, а также использует глобальные данные, называемые Uniforms.
Как это работает:
1. Input Assembler - этап, на котором данные обретают форму. Вершины подготавливаются для Vertex Buffer: определяются типы данных и их размерность (позиция, UV, нормаль, Vertex ID и т.д.).
2. Vertex Shader - преобразует данные вершин и их положение в Clip Space пространстве с помощью перемножения матриц, подробнее о пространствах и преобразованиях в моей статье на DTF. Также в нем можно задавать новые параметры для вершин: цвет, псевдослучайные величины и т.д.
3. Tessellation - динамически усложняет геометрию, разделяя существующие примитивы для увеличения детализации. Применяется для локальных эффектов: следы на снегу, процедурный ландшафт или волны.
4. Geometry Shader - генерирует новую геометрию на основе полученных примитивов. Например, превращает линию из двух вершин в квад. Находит применение в создании травы, волос или систем частиц, чем активно пользовались разработчики Ghost of Tsushima.
5. Rasterizer - когда положение вершин определено, геометрия аппроксимируется во фрагменты на экране. Данные между вершинами вычисляются через интерполяцию в барицентрическом пространстве каждого треугольника. Здесь же отсекается всё, что вне экрана, и происходит Face Culling.
6. Fragment Shader - обрабатывает каждый фрагмент для определения цвета пикселя. Здесь происходит сэмплирование текстур на основе интерполированных UV или мировых координат (например, при трипланарном текстурировании).
7. Merger - финальный этап. Сравнивает значения пикселя с масками и глубиной (Depth Test), после чего записывает результат в Render Target. Это критически важно для работы прозрачности и Stencil Buffer.
Куда это движется дальше?
Классический пайплайн накладывает много ограничений. Тесселяцию и геометрические шейдеры сложно и дорого использовать, в индустрии их почти не трогают, а в некоторых студиях они вообще считаются табу. Кроме того, мы ограничены в работе с топологией: мы можем создавать геометрию, но не можем эффективно её вычитать.
На смену приходит Mesh Shader, который заменяет собой связку Vertex, Tessellation и Geometry стадий. По сути, это Compute Shader, адаптированный под задачи растеризации.
Mesh Shader работает в паре с Amplification Shader который определяет, сколько Mesh-шейдеров нужно запустить. Расчеты ведутся параллельно, распределяясь по потокам и образуя так называемые мешлеты (кластеры геометрии).
Технология еще изучается, и уже демонстрирует существенный прирост производительности и возможностей. Она позволяет куллить невидимые треугольники на лету, дает доступ к продвинутому динамическому лодированию и отлично справляется с процедурной генерацией, что наглядно продемонстрировали разработчики Alan Wake 2, полностью перейдя на MeshShaders.
Так как MeshShaders это новый подход к пайплайну, а не полное его изменение, Fragment контекст остается не тронут и не требует изменений. Very круто 👍
Если вам это напомнило принципы работы Nanite в Unreal... вы смотрите в верном направлении :^>
Подробнее можно узнать из лекции Radosław Paszkowski на конференции Digital Dragons.
Благодарю за прочтение и, разумеется,
Если у вас есть желание поддержать автора статьи, то вы можете:
-Бахнуть по кнопке лайк, чтобы она взорвалась ❤
-Поделиться этой статьёй с людьми, которым интересна тема компьютерной графики.
-Подписаться на мой блог:
Или boosty, куда я публикую статьи не влезающие в тему компьютерной граффики, подробнее тут
-Оставить фидбек под статьёй и пожелания о топиках, которые были бы вам интересны.
-Типнуть на кофеёк
Деловая почта: shakoretka@yandex.ru