Разработчики Slughorn сравнили SDF, MSDF, Slug и Rive для текста на GPU

Авторы Slughorn, реализации техники Slug на C++20, опубликовали обзор способов вывода текста на GPU. Поводом стало то, что Эрик Ленгиел (Eric Lengyel) опубликовал алгоритм Slug в 2017 году, запатентовал его в 2019-м, а 17 марта 2026 года передал патент в общественное достояние. По словам авторов, именно поэтому они построили Slughorn и теперь могут открыто рассказывать, как Slug работает и где выигрывает.
Глиф в шрифте, это не картинка, а набор замкнутых контуров из отрезков и кривых Безье (в TrueType, квадратичных, в OpenType с CFF, кубических), а внутренность определяется правилом заливки, обычно правилом ненулевой намотки. Рендерер должен правильно залить контур, дать чистые сглаженные края и сохранить резкость и на 8 пикселях в меню, и на весь экран на щите, повёрнутом в перспективе.
Метод 1, текстурный атлас: каждый глиф один раз растеризуется в общую текстуру, на экране рисуется текстурным прямоугольником. Быстро и переносимо, но при увеличении сверх запечённого размера появляется размытие, при уменьшении, мерцание, каждый нужный размер требует своего атласа, а китайский, японский и корейский с десятками тысяч глифов дают проблему памяти. В перспективе текст на 3D-поверхности выглядит мягким.
Метод 2, поля знаковых расстояний (SDF): по работе Криса Грина (Chris Green, Valve, SIGGRAPH 2007) в каждом текселе хранится расстояние до ближайшего края, а шейдер берёт порог по нулю. Небольшая текстура выдерживает сильное увеличение и даёт дешёвое сглаживание. Но это всё равно запечённая текстура: острый угол, разрыв поля расстояний, билинейная интерполяция его скругляет, а при сильном увеличении или очень малом размере тонкие штрихи ломаются.
Метод 3, многоканальные SDF (MSDF): по работе Виктора Хлумски (Viktor Chlumsky; диссертация 2015 года, статья 2018 года) вместо одного канала хранятся три (красный, зелёный, синий), каждый для своего подмножества краёв, а шейдер берёт медиану трёх. Углы почти идеально сохраняются; msdfgen Хлумски распространяется под лицензией MIT. Минусы: это по-прежнему атлас, поэтому динамический текст и огромные наборы глифов вроде CJK требуют конвейеров запекания и бюджета памяти, генерация дороже, а трёхканальная выборка тяжелее по пропускной способности.
Метод 4, тесселяция и покрытие (Loop-Blinn, NV_path_rendering, Pathfinder, Rive): контур превращается в геометрию. Loop-Blinn рисует кривые треугольники и отбрасывает лишнее в шейдере, но надёжное сглаживание трудно; stencil-then-cover (расширение NVIDIA NV_path_rendering) качественно, но зависит от вендорных расширений; Pathfinder разбивает края на микротреугольники и копит покрытие в вычислительном проходе; рендерер Rive, открытый в 2024 году, сводит векторные контуры к уникальным треугольным заплаткам и, как сказано в тексте, выдаёт 120 кадров/с на анимированной векторной графике. Семейство действительно не зависит от разрешения и часто подходит для анимированной векторной графики, но платит за тесселяцию при смене геометрии, рост числа треугольников для сложных глифов и сложность чистого аналитического сглаживания.
Метод 5, Slug: глиф хранится как список квадратичных кривых Безье и отрезков в небольшом буфере GPU, плюс лёгкая структура ускорения, разбивающая глиф на горизонтальные полосы, чтобы пикселю приходилось учитывать только ближайшие кривые. Покрытие считается прямо во фрагментном шейдере: для каждого пикселя по сути пускается луч, считаются его пересечения с кривыми и вычисляется число намотки. Ключевой приём Ленгиела, проверка «root eligibility» (допустимость корней): точное правило, какие пересечения луча с кривой учитывать, чтобы в общих конечных точках кривых не было трещин и двойного счёта. По утверждению авторов, нет запечённого разрешения, поэтому глиф одинаково резок и на 6 пикселях, и на 6000; сохраняется резкость при любых 2D- и 3D-преобразованиях, включая перспективу; атласа нет, так что сотни тысяч глифов CJK стоят объёма данных контуров шрифта; текст можно менять каждый кадр без затрат на запекание; всё делается одним вызовом отрисовки обычным фрагментным шейдером без расширений. Тесселяция, единственное другое семейство с такой же точностью при любом ракурсе, но с затратами на тесселяцию и более сложным сглаживанием. Поэтому авторы рекомендуют Slughorn для интерактивного 3D, AR и VR, пролётов камеры, движущихся HUD и навигации в CAD или цифровых двойниках.
Визуальный тест: заглавную R отрисовали Slughorn (через интеграцию osgSlug), одноканальным SDF, MSDF, рендерером Rive и битовой картой osgText вместе с производным от неё SDF. Все текстурные варианты получили одинаковый бюджет, 64 текселя на em. Прямо и в запечённом размере пять из шести вариантов практически неотличимы: Slughorn, Rive и MSDF повторяют контур, одноканальные SDF лишь слегка скругляют углы у ножки буквы, а выбивается битовая карта osgText (изображение 64 px/em, увеличенное примерно в четыре раза). В скользящей перспективе Slughorn и три варианта на полях расстояний держат букву на месте с чистыми краями, битовая карта osgText размывается при удалении, а R у Rive получает неверную форму: его рендерер принимает только 2D-аффинные преобразования, а перспектива не аффинна, поэтому результат, приближение, точное в центре и уходящее к краям. При экстремальном увеличении ровный чистый край дают только рендереры на кривых, Slughorn и Rive (Rive за счёт повторной тесселяции на каждом кадре); на полях расстояний появляются зазубрины. Доступный текст на этом месте обрывается.
Ключевые факты
- Эрик Ленгиел опубликовал алгоритм Slug в 2017 году, запатентовал в 2019-м и 17 марта 2026 года передал патент в общественное достояние; авторы статьи на этой основе сделали Slughorn, реализацию на C++20.
- Обзор сравнивает пять подходов: текстурный атлас, SDF, MSDF, тесселяцию и покрытие (Loop-Blinn, NV_path_rendering, Pathfinder, Rive) и Slug, который считает покрытие по контуру прямо во фрагментном шейдере.
- В тесте с буквой R (64 текселя на em для текстурных вариантов) в прямом виде пять из шести вариантов почти одинаковы; в перспективе ошибается Rive, принимающий только 2D-аффинные преобразования, а при сильном увеличении чистый край дают лишь Slughorn и Rive.
- Авторы рекомендуют Slughorn для интерактивного 3D, AR и VR, движущихся HUD, CAD и цифровых двойников, а MSDF называют отличным выбором, если готовы запекать атлас.
- Сравнение сделано разработчиками Slughorn, то есть заинтересованной стороной; независимых тестов и цифр производительности Slug в доступном тексте нет.
Почему это важно
Рендеринг текста на GPU десятилетиями упирался в компромиссы запечённых атласов, а Slug позволяет отказаться от атласа и тесселяции, считая покрытие прямо по контуру глифа. Раньше этому мешал патент; по тексту, его владелец Эрик Ленгиел 17 марта 2026 года передал его в общественное достояние. Статья служит обзором того, какой метод где уместен.
Кому это важно
Разработчикам графических движков, игровых интерфейсов, AR и VR, CAD-приложений и инструментов визуализации, которым нужен чёткий текст при произвольном масштабе и ракурсе. Также тем, кто работает с большими наборами глифов вроде CJK или с текстом, меняющимся каждый кадр.
Как это применить
По логике статьи: если размеры и углы обзора ограничены и вы готовы запекать атлас, подойдёт MSDF (msdfgen под лицензией MIT); простой атлас годится там, где важны скорость и переносимость; Rive авторы считают естественным выбором для анимированной векторной графики; Slughorn предлагается для свободной 3D-камеры, крупных планов и скользящих углов. Условия распространения и лицензия Slughorn в доступном тексте не указаны.
Можно ли доверять
Объяснения по SDF, MSDF и атласам согласуются с общеизвестными источниками (работы Грина и Хлумски названы по годам). Но статью написали разработчики Slughorn, то есть заинтересованная сторона, и независимых тестов они не приводят. Доступный текст оборван в разделе про увеличение, поэтому выводы и итоговые рекомендации авторов видны не полностью.
Риски и подводные камни
Доказательства в статье визуальные, на одной букве R, без цифр производительности Slug или Slughorn (кадровое время, нагрузка на GPU). Утверждения о «точности при любом ракурсе», слова авторов. Ограничение Rive с перспективой касается именно его рендерера, а не всех методов на основе тесселяции. Что именно передача патента означает для других реализаций, в видимом тексте не поясняется.