Rasterization (растеризация) — это процесс преобразования векторного описания трёхмерных примитивов (треугольников, линий, точек) в набор пикселей (фрагментов) для отображения на экране. По данным Khronos Group, 2025, растеризация является автоматическим (непрограммируемым) этапом графического конвейера, расположенным между Vertex Shader и Fragment Shader. Rasterization определяет, какие пиксели экрана принадлежат какому треугольнику, и вычисляет интерполированные атрибуты для каждого фрагмента.
Главное
Rasterization — это этап графического конвейера, который преобразует геометрические примитивы (треугольники, линии) в набор фрагментов для дальнейшей обработки Fragment Shader. Входные данные — вершины треугольника в экранных координатах и их атрибуты (цвет, нормали, UV). Выход — набор фрагментов с интерполированными атрибутами.
В отличие от программируемых шейдеров (Vertex и Fragment Shader), растеризация является фиксированным (непрограммируемым) этапом. Разработчик не может изменить алгоритм растеризации, но может управлять его параметрами: режимом отсечения (culling), шириной линии, смещением глубины (polygon offset) и мультисэмплингом.
Практически вся современная real-time графика — игры, UI, AR/VR — использует растеризацию. Это самый производительный метод рендеринга, способный обрабатывать миллионы треугольников за кадр при 60 FPS. GPU-растеризаторы оптимизированы для параллельной обработки тысяч треугольников одновременно через специализированные блоки ROP (Render Output Units).
Растеризация треугольника начинается после того, как Vertex Shader преобразовал вершины в экранные координаты. GPU берёт три вершины треугольника и определяет, какие пиксели экрана находятся внутри этого треугольника.
Процесс включает три последовательных шага: определение bounding box треугольника в пикселях — проверка каждого пикселя внутри bounding box на принадлежность треугольнику (edge function) — вычисление интерполированных атрибутов (barycentric coordinates) для каждого покрытого пикселя. Edge function — это линейное уравнение, определяющее, с какой стороны грани треугольника находится точка.
| Этап | Описание | Результат |
|---|---|---|
| Clipping | Отсечение треугольников за границами viewport | Видимые примитивы |
| Viewport transform | Преобразование в экранные координаты | Пиксельные координаты |
| Triangle setup | Вычисление edge-функций и bounding box | Параметры растеризации |
| Fragment generation | Проверка покрытия и интерполяция | Фрагменты + атрибуты |
Rasterization может быть реализована различными алгоритмами, каждый из которых имеет свои компромиссы между производительностью и качеством. Современные GPU используют комбинацию нескольких подходов.
Классический алгоритм растеризации, разработанный для ранних GPU. Треугольник обрабатывается строка за строкой (scanline): для каждой строки экрана определяются точки входа и выхода треугольника, и все пиксели между ними заполняются. Scanline conversion эффективен для больших треугольников, но требует сложной логики для треугольников произвольной формы.
Современные GPU используют метод half-space растеризации: для каждой стороны треугольника вычисляется edge function — линейное уравнение, положительное с одной стороны и отрицательное с другой. Пиксель принадлежит треугольнику, если все три edge functions положительны. Half-space rasterization легко распараллеливается и хорошо подходит для SIMD-архитектур GPU.
Мобильные GPU (Qualcomm Adreno, ARM Mali) используют Tile-Based Rendering (TBR). Экран делится на небольшие тайлы (16x16 или 32x32 пикселя), и растеризация выполняется для каждого тайла отдельно. Это минимизирует количество обращений к видеопамяти за счёт хранения кадрового буфера в быстрой локальной памяти (tile memory). TBR снижает энергопотребление, что критично для мобильных устройств.
Rasterization и ray tracing — два принципиально разных подхода к рендерингу 3D-графики. Растеризация доминирует в real-time приложениях, ray tracing — в офлайн-рендеринге и постепенно проникает в real-time (на RTX-совместимых GPU).
| Параметр | Rasterization | Ray Tracing |
|---|---|---|
| Принцип | Треугольник → фрагменты | Луч → пересечение со сценой |
| Скорость | Очень быстрый (миллионы треугольников/кадр) | Медленный (тысячи лучей/кадр) |
| Качество | Требует дополнительных техник (тени, отражения) | Физически корректные тени и отражения |
| Мобильные GPU | Стандартный метод | Ограниченная поддержка (A17 Pro, Snapdragon Gen 3) |
| Энергопотребление | Низкое | Высокое |
При растеризации возникает проблема aliasing — ступенчатые края (jaggies) на границах треугольников. Это происходит потому, что пиксель дискретен и не может частично покрываться треугольником. Для борьбы с aliasing применяется мультисэмплинг (MSAA).
MSAA (Multisample Anti-Aliasing) выполняет растеризацию с увеличенной частотой сэмплирования (2x, 4x, 8x). Вместо одного сэмпла на пиксель используется несколько суб-сэмплов, каждый из которых проверяется на покрытие треугольником. MSAA 4x обрабатывает 4 суб-сэмпла на пиксель, что даёт заметное сглаживание краёв без полного увеличения разрешения рендеринга.
В отличие от MSAA, методы пост-процесс сглаживания (FXAA, SMAA, TAA) работают уже после растеризации, анализируя финальное изображение. FXAA (Fast Approximate Anti-Aliasing) определяет края изображения и применяет размытие для сглаживания, работая значительно быстрее MSAA, но с менее качественным результатом.
Rasterization на современных GPU выполняется специализированными аппаратными блоками — ROP (Render Output Units). Количество ROP напрямую влияет на скорость заполнения (fill rate) — количество пикселей, которое GPU может обработать за секунду.
Для мобильных GPU (Tile-Based Rendering) критически важны: минимизация overdraw через раннюю отбраковку (early-Z), использование back-face culling для удаления невидимых треугольников и скрытое удаление поверхностей (occlusion culling) для отбраковки треугольников, полностью перекрытых другими объектами.
Часто задаваемые вопросы
Растеризация — это процесс превращения треугольников в пиксели на экране. GPU берёт трёхмерный треугольник, определяет, какие пиксели экрана он закрывает, и передаёт их Fragment Shader для окрашивания.
Растеризация проецирует треугольники на экран и определяет покрытие пикселей (очень быстро). Трассировка лучей пускает лучи от камеры и проверяет пересечение с геометрией (физически точнее, но значительно медленнее).
При растеризации пиксель либо полностью принадлежит треугольнику, либо нет — отсюда ступенчатые края (aliasing). MSAA сглаживает края за счёт множественных суб-сэмплов на пиксель, а FXAA применяет фильтр к готовому изображению.
Нет, растеризация — фиксированный этап графического конвейера. Разработчик не может изменить алгоритм, но может управлять настройками: culling, polygon offset, режим растеризации (точки, линии, треугольники) и параметры MSAA.
Tile-Based Rendering (TBR) делит экран на тайлы и обрабатывает их в быстрой локальной памяти, а не в глобальной VRAM. Это радикально снижает энергопотребление и bandwidth, что критично для мобильных устройств с батарейным питанием.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также