Чёрная буква на белом экране выглядит монолитной лишь до тех пор, пока не посмотреть на неё в лупу. Под увеличением выясняется, что дисплей вообще не умеет рисовать белым или чёрным: каждый его пиксель на жидкокристаллической панели состоит из трёх узких вертикальных полосок, красной, зелёной и синей, и любая "белая" точка есть просто все три полоски, зажжённые одновременно. Субпиксельный рендеринг шрифтов строится на дерзком допущении: раз полоски физически разнесены по горизонтали на треть пикселя, экран способен адресовать их по отдельности, и тогда эффективное горизонтальное разрешение при отрисовке текста утраивается. Именно на этой идее основана технология ClearType, сделавшая читаемым шрифт 9 пунктов на матрицах конца прошлого века, и именно её ограничения объясняют цветные каёмки на буквах, развал текста при повороте монитора и тихий отказ индустрии от субпиксельной хитрости в эпоху Retina-экранов.

Три полоски вместо одной точки

Пиксель типичной LCD-панели, будь то TN, IPS или VA, устроен как тройной светофильтр. За подложкой с жидкими кристаллами стоит маска, разрезающая каждую квадратную ячейку на три вертикальных сегмента, и перед каждым сегментом расположен свой краситель. Сегменты управляются независимо: у каждого субпикселя собственный тонкоплёночный транзистор, и контроллер матрицы выставляет ему яркость одним из 256 уровней. Когда смотришь на экран с нормального расстояния, глаз усредняет три потока света и видит один смешанный цвет.

Классическое сглаживание воспринимает пиксель как неделимую единицу. Край буквы, проходящий через середину пикселя, даёт ему половину яркости, и из таких полутонов складывается видимость плавного контура. Но половина яркости всего пикселя и полное зажигание, скажем, только красного субпикселя дают одинаковую суммарную энергию света, попадающую в глаз, при этом геометрически это совершенно разные события: первое - серая точка в середине ячейки, второе - узкое свечение с краю. Субпиксельный рендеринг эксплуатирует второй случай. Растратор вычисляет покрытие глифа не в пикселях, а в тройках субпикселей, то есть фактически в сетке с горизонтальным шагом втрое мельче. Для чёрного текста на белом фоне это означает, что позицию края штриха можно зафиксировать с точностью до трети пикселя, а не до целой ячейки.

Эффект заметен прежде всего на вертикальных штрихах и крутых дугах, которым не хватает именно горизонтального разрешения. Межбуквенный зазор в узком кегле, толщина штриха строчной "l", сход диагоналей в вершине "A" - всё это при тройном горизонтальном разрешении перестаёт дрожать между соседними колонками пикселей и ложится на свои математические места. На типичных панелях того времени, где плотность составляла от 72 до 110 точек на дюйм, выигрыш воспринимался как скачок качества на класс железа вверх.

ClearType и арифметика утроенного разрешения

ClearType появился публично в Microsoft Reader в 2000 году и вошёл в Windows XP в 2001-м. Технически это конвейер из нескольких стадий. Сначала контур глифа растеризуется с утроенным горизонтальным масштабом, причём шрифтовой хинт для ClearType пишется иначе, чем для чёрно-белого режима: инструкции теперь могут цепляться за субпиксельную сетку, и знаменитая жёсткость обычного хинтования, округляющая контрольные точки к целым пикселям, ослабляется по горизонтали и сохраняется в основном по вертикали. Затем растр проходит фильтрацию, о которой речь ниже, и только потом значения трёх каналов записываются в кадровый буфер как будто это обычный цвет. Монитор, не подозревая о подвохе, зажигает субпиксели с указанной яркостью, а зрительная система человека достраивает картинку.

Почему фокус работает, объясняет физиология зрения. Глаз гораздо острее различает контраст яркости, чем контраст цвета: хроматическая составляющая картинки обрабатывается зрительной корой с заметно меньшим пространственным разрешением. Небольшая цветная окраска по краям буквы при корректной яркостной структуре просто не регистрируется как дефект, она растворяется в сером контуре. На этом же принципе, кстати, строится цветовая субдискретизация в видеосжатии, где каналы цветности хранятся с вдвое и вчетверо меньшим разрешением, чем яркость, и зритель этого не замечает.

Важно, что выигрыш строго анизотропен. Утраивается только горизонтальное разрешение, потому что полоски стоят вертикально и разнесены по оси X. По вертикали пиксель остаётся неделимым, и ClearType ничего не даёт для горизонтальных штрихов и малых зашибок - поэтому в тексте на латинице выигрыш виден в первую очередь, а в письменностях с доминирующими горизонтальными элементами вклад скромнее. Отсюда же следует главная хрупкость всей схемы: она жёстко привязана к ориентации и порядку расположения полосок на конкретной матрице.

Цветные каёмки и джиттер-фильтрация

Наивная реализация, которая просто пишет вычисленное покрытие напрямую в каналы R, G и B, неминуемо оставляет у краёв букв заметные цветные кромки: одна сторона вертикального штриха оттеняется красноватым, другая голубоватым. Для глаза с чувствительным к хроме зрением, а таких людей немало, текст рябит. Причина понятна: каждый субпиксель вносит не только яркость, но и собственный цветовой оттенок, и суммарный оттенок локальной группы субпикселей может отклоняться от нейтрального.

Против этого работает так называемая джиттер-фильтрация, часто называемая цветокомпенсационным или балансирующим фильтром. Идея в том, что освещённость каждого субпикселя немного размазывается по соседям так, чтобы суммарный цвет любой локальной окрестности оставался как можно ближе к серому. Практически применяется свёртка растра с коротким ядром: из классики - фильтр из пяти отводов с симметричными весами, например пропорции, где центральный элемент получает львиную долю энергии, а остаток распределяется на соседние субпиксели слева и справа. Энергия, отданная соседям, берётся из расчёта, что сумма весов равна единице, и тогда полная яркость участка не меняется, меняется лишь её распределение между цветовыми каналами.

Плата за фильтрацию - лёгкое размытие: утроенное разрешение частично расходуется на подавление цветового шума. Поэтому веса ядра - инженерный компромисс. Узкое ядро сохраняет чёткость, но оставляет радугу на краях; широкое ядро даёт идеально серый текст ценой мягкости контура. В ClearType, в рендере FreeType с режимом LCD и в Quartz используются разные варианты таких фильтров, и холивары о том, чей шрифт "чётче", часто сводятся именно к выбору компромисса между цветовым шумом и резкостью. Пользователь с высокой чувствительностью к хроме предпочтёт сильную фильтрацию, любитель сухих штрихов - слабую.

Поворот монитора и поломка геометрии

Поверните панель на 90 градусов, и вся нежная конструкция рушится с удовлетворительной полнотой. Физические полоски субпикселей, управляемые видеопамятью построчно, в новой ориентации оказываются горизонтальными и идут сверху вниз: бывшая ось утроения становится осью Y, по которой ClearType вообще не работает. Вдобавок шрифтовой хинт, рассчитанный на вертикальные полоски, начинает отдавать растратору координаты, лежащие в другой системе измерения. Текст превращается в "рваный" ковёр из цветных чёлок и дыр: горизонтальные штрихи получают субпиксельную подсветку, которой там быть не должно, вертикальные теряют её поддержку, буквы покрываются разноцветной бахромой.

Операционная система может сделать три вещи, и хорошие реализации делают все три по порядку:

  1. Обнаружить поворот логического дисплея и автоматически переключить режим сглаживания: в портретной ориентации классический горизонтальный ClearType отключается и заменяется либо на монохромный серый антиалиасинг, либо на субпиксельный режим, переориентированный на вертикальное утроение, если растратор умеет такой вариант.
  2. Учесть порядок полосок. Панели выпускаются с раскладкой RGB и BGR, а в повороте добавляются варианты снизу вверх и сверху вниз; неверно угаданный порядок субпикселей даёт эффект, похожий на поворот: красные и синие каёмки у краёв штрихов. Поэтому в настройках ClearType существует явный выбор RGB или BGR, а тюнер ориентации проверяет, как именно матрица колотит пиксель.
  3. Перегрузить или отключить субпиксельный кеш глифов. Отрисованные один раз глифы хранятся в кеше с привязкой к режиму растеризации, и смена ориентации требует инвалидировать кеш, иначе на повёрнутом экране продолжат всплывать глифы, нарисованные для ландшафтной геометрии.

На практике Windows при повороте экрана оставляет работающий ClearType в его исходной форме, что приводит к видимому ухудшению текста в портретном режиме на дешёвых панелях, и виной тому - привязка субпиксельного хинта к ориентации. Отдельные приложения и браузеры пытаются подстраховаться, отключая субпиксельный рендер для своего содержимого при обнаружении портрета, но всеобщего перекраивания сглаживателя на лету не происходит, и инженер, покупающий поворотный кронштейн под чтение кода, заранее смиряется с серым сглаживанием на вертикальном мониторе.

OLED, PenTile и нестандартная геометрия

Классическая схема ClearType предполагает строгую регулярность: равные вертикальные полоски, одинаковая ширина, предсказуемый порядок. OLED-панели ломают все три предположения. В раскладке PenTile, массово применяемой в AMOLED-экранах, зелёных субпикселей вдвое больше, чем красных и синих, и синий элемент сделан крупнее красного, чтобы компенсировать его быстрое старение. Субпиксели здесь образуют не вертикальные тройки, а шахматную мозаику из ромбовидных ячеек, соседние пиксели буквально делят между собой красные и синие элементы. Понятия "треть пикселя по горизонтали" для красного канала тут просто не существует: красных элементов на строке вдвое меньше, чем кажется по разрешению экрана.

Субпиксельный рендер, натренированный на тройки, на PenTile даёт двойной проигрыш. Во-первых, фактическое разрешение для красного и синего каналов ниже заявленного, и адресация "левого красного" попадает не туда, куда думает растратор. Во-вторых, цветовой баланс после такого рендера съезжает, потому что зелёный канал имеет вдвое плотнее сетку отсчётов, и балансирующие фильтры из мира LCD оставляют после себя зелёно-пурпурный рейс. Общая практика поэтому - выключать субпиксельное сглаживание на OLED-экранах полностью и полагаться на высокую плотность панели и монохромный антиалиасинг. Инженеры, настраивающие рендер текста под смартфоны, давно признали: попытка выжать из PenTile субпиксельную точность обходится дороже, чем она приносит.

Серый запасной путь и эпоха высокой плотности

Монохромный, или полутоновой, антиалиасинг никуда не девался и остаётся универсальным запасным ходом. Он работает с любым дисплеем, любой ориентацией, любой раскладкой; он единственный корректно переживает трансформации: повёрнутый или наклонённый текст, каскадные слои с прозрачностью, аппаратное масштабирование - всё это по определению ломает привязку к субпиксельной сетке, и современные браузеры молча откатывают положенные элементы на серое сглаживание, когда элемент анимируется или поворачивается. Ровно поэтому длинный текст в вебе иногда "прыгает" по толщине после завершения анимации: движок возвращает субпиксельный рендер статичному блоку.

Параллельно рос аргумент против самой необходимости субпиксельного трюка - плотность пикселей. При 200 и более точках на дюйм одиночный пиксель становится настолько мелким, что глаз перестаёт различать и контур, построенный на полном пикселе, и выигрыш от утроения сходит на нет, а его недостатки остаются. Apple пошла этим путём решительнее всех: с выходом macOS Mojave компания убрала субпиксельное сглаживание из системного рендера, аргументируя это тем, что вся экспозиция техники за внешними экранами давно ведётся на высокой плотности, а iOS и вовсе никогда не применяла субпиксельный рендер - мобильные экраны поворачиваются в руке, и любая привязка к ориентации полосок там заранее обречена. Windows сохранила ClearType как опцию, но её собственный новый текстовый стек и магазин приложений всё чаще ложатся на полутоновую растеризацию, особенно когда речь идёт о масштабировании интерфейса под 150 и 200 процентов.

Тюнер, диагностика и немного истории

Настройка субпиксельного рендера под конкретную матрицу остаётся ручной процедурой, потому что восприятие цветных каёмок субъективно. В Windows эта процедура называется ClearType Text Tuner и запускается вводом "cttune" в строке поиска. Мастер проходит пользователя через серию экранов, где нужно выбрать наиболее чёткий образец текста из нескольких вариантов; за кулисами каждый выбор переключает параметры: включён ли субпиксельный режим вообще, каков порядок полосок RGB или BGR, какова сила цветового баланса и как ведёт себя гамма-коррекция контура. Настройки сохраняются привязанными к конкретному монитору, то есть ноутбук с внешней панелью живёт с двумя разными наборами параметров, и тюнер корректно предлагает пройтись по обоим экранам.

Сама идея старше ClearType на четверть века. В 1976 году инженер Стив Возняк столкнулся с артефактом цветного выхода Apple II: графический режим этого компьютера порождал цветные полоски там, где программа зажигала соседние точки, и из этого дефекта выросло наблюдение, что каждую цветную составляющую экрана можно адресовать в одиночку как квази-пиксель с вдвое большим разрешением. В 1988 году исследователь Стив Гибсон оформил эту идею в техническом описании для Apple II, показав, что текст на цветном дисплее выигрывает отдельным управлением полосок, и основал компанию Gibson Research, продвигавшую субпиксельный рендер под названием Sub-Pixel Font Rendering Technology. Microsoft купила у него лицензию на патенты в конце девяностых, несколько лет доводила технологию до пригодности на LCD-матрицах и представила ClearType как одну из витринных новелл Windows XP. Дальше история сделала круг: плотность экранов выросла в разы, панели сменили раскладки и подложки, и технология, когда-то выдававшая чудо из 96 точек на дюйм, всё чаще оказывается выключенной настройкой для тех, у кого монитор помнит времена, когда пиксель был большим, а полосок в нём - видно невооружённым глазом.