Растеризация в 3D графике от Классики до MeshShader

Растеризация в 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.

Radosław Paszkowski - MeshShaders (Digital Dragons - 2024)

Благодарю за прочтение и, разумеется,

Если у вас есть желание поддержать автора статьи, то вы можете:

-Бахнуть по кнопке лайк, чтобы она взорвалась ❤

-Поделиться этой статьёй с людьми, которым интересна тема компьютерной графики.

-Подписаться на мой блог:

Или boosty, куда я публикую статьи не влезающие в тему компьютерной граффики, подробнее тут

-Оставить фидбек под статьёй и пожелания о топиках, которые были бы вам интересны.

-Типнуть на кофеёк

Деловая почта: shakoretka@yandex.ru

2
2 комментария