Slug рендерит текст на GPU прямо из контуров и не требует атласа
SDF vs. MSDF vs. Slug: GPU Text Rendering
Алгоритм Slug, запатентованный Eric Lengyel в 2019 году и переданный в общественное достояние 17 марта 2026 года, рисует глифы напрямую из их контуров во фрагментном шейдере, без текстурного атласа и тесселяции. Автор статьи объясняет, почему texture atlas, SDF и MSDF проигрывают при произвольном масштабе и 3D-трансформациях, и показывает, как Slug вычисляет покрытие пикселей через подсчёт пересечений лучей с кривыми Безье.
Slug вычисляет покрытие аналитически, для каждого пикселя, после трансформации, поэтому остаётся точным независимо от того, насколько близко, далеко или под каким углом находится наблюдатель, без ничего запечённого и без потолка, который можно было бы достичь.
- YuechenLi
В этой статье есть неточная информация, поскольку MSDF-атлас не обязательно запекать статически, так что «иероглиф CJK означает огромный атлас» — на самом деле не проблема, если можно асинхронно загружать их в атлас. (Асинхронное извлечение контуров немного сложнее для C-библиотек, поэтому конвейер в основном ограничен загрузкой в атлас).
Другое дело, что MSDF-рендеринг довольно дешёвый и его можно легко выполнять на CPU без GPU-шейдеров; генерация/загрузка атласа — дорогая часть, но это единоразовые затраты на символ на шрифт, поскольку атлас — это просто обычный файл растровой текстуры. Текст MSDF имеет чёткие края при большинстве разрешений увеличения, а мелкий текст в любом случае лучше обрабатывать простым CPU-растеризатором.
Я так и не увидел значительных преимуществ использования Slug вместо MSDF + растрового фолбэка для мелких шрифтов. Он определённо точнее, но я не уверен, что маргинальное улучшение разрешения стоит гораздо более сложного GPU-зависимого рендеринга, так что я бы очень хотел проверить это сам, когда будет время, вместо того чтобы верить на слово явно написанной ИИ статье.
- exDM69
Как хобби-проект я написал алгоритм растеризации шрифтов (на самом деле два алгоритма), который создаёт пиксель-в-пиксель сглаженные изображения (как Slug), используя похожий, но другой алгоритм. Вместо умного классификатора корней для кривых Безье из Slug, я разбиваю кривые Безье на монотонные участки, где вычисление числа витков намного проще и может выполняться параллельно для группы пикселей. Это хорошо работает на GPU с операциями warp/wave/subgroup и на CPU с использованием SIMD.
На первый взгляд, разбиение кривых Безье звучит как плохая идея (больше кривых Безье для растеризации), но это открывает двери для некоторого параллелизма, и большинство кривых Безье, встречающихся в шрифтах, и так монотонны (так что увеличение очень скромное). Это было вдохновлено этим занимательным, но не очень серьёзным видео о растеризации шрифтов [0].
Первая оптимизация параллелизма — проверка ограничивающей рамки кривой против прямоугольной (в uv-пространстве) области пикселей, что позволяет быстро определить, нужно ли вообще вычислять кривую Безье. Это можно делать для каждого GPU-варпа.
Вторая оптимизация работает только для прямоугольного преобразования (без поворота, наклона или перспективы). Решение квадратного уравнения включает квадратный корень и деление (которые сами по себе составляют >30% вычислений), и их можно вычислить для каждой строки и столбца пикселей вместо каждого пикселя (2n вместо n^2).
Обе оптимизации опираются на математические инварианты монотонности, то есть производная кривой Безье должна […]
- GuB-42
Однажды я реализовал рендеринг текста через SDF. Мне больше всего в этой технике нравится то, как легко добавлять поверх эффекты. Пара строк шейдерного кода — и у меня появились обводки и смягчение краёв (сглаживание). Я не пробовал вариант MSDF, так как меня не смущали неострые углы при увеличении, поэтому не знаю, ломаются ли эти эффекты на MSDF.
Slug, похоже, ничего из этого не поддерживает: он просто отвечает «для данной точки я внутри или снаружи?», но не говорит, насколько, что отлично на действительно высокоразрешённых дисплеях и больших размерах, но вы теряете возможность делать эффекты, доступные с SDF, и должны отдельно разбираться со сглаживанием.
- jdanford
Блин, я невероятно устал читать текст, сгенерированный LLM
- mattdesl
Я тоже работал над GPU-рендерером кривых, Windfoil, основанным на формулировке, которую изначально предложил мне Fable 5 во время направленного поиска [1]. Он в чём-то похож на Slug, не всегда такой же быстрый, но использует меньше шейдерной памяти (одна полоса вместо двух) и даёт более высокое качество сглаживания, то есть ближе к эталону с box-фильтрацией.
Возможно, это заинтересует некоторых разработчиков игр/графики здесь...