Comments 15
Отличная статья, и спасибо автору за то, что он коснулся проблемы гамма-коррекции в цветовых каналах sRGB и показал "как привыкли" и "как надо" смешивать цвета.
Флэш делал круче — там не FOR shape FOR pixel там наоборот, для пикселя знаем шейпы, можем каждый шейп на этих 16 сэмплах прогнать и тут же их «схлопнуть», незачем их хранить, поэтому по памяти он не проседает.
Ещё есть особенность как эти 16 точек распределены внутри пикселя — там немного повёрнутая сетка, чтобы избежать общих артефактов.
А теперь прикол — canvas2d скотина переключается между MSAA и AAA, и может сотворить чушь иногда. Вот нет гарантии что он попользует, даже если он полностью на GPU, например если это OffscreenCanvas в хроме.
До AGG ещё не добрался, для этого надо чтобы он мне был реально нужен.
Приколы с переключением видел прямо в исходниках хрома, поэтому получается что 2d контекст не так надёжен по результату. В данный момент делаю плагин для pixi для кэширования сглаженных шейпов в текстурах, самое близкое решение к этому есть у AwayJS, но моё будет круче.
Знаю ещё особенность что MSAA врубается даже на обычном SVG если ты под виндой с видеокартой nvidia pascal. Апофеоз — то что флэш делал в лохматом году, SVG на главной странице гугла фейлит если у тебя не паскаль.
Это понятие идёт из темы цифровой обработки сигналов. "Квадрат" возникает, например, при передискретизации изображения из низкого разрешения в высокое методом ближайшего соседа. Один чёрный пиксель превращается в чёрный квадрат. При уменьшении картинки происходит обратный процесс — исходное изображение делится на квадраты, каждый из которых после вычисления среднего значения цвета превращается в один пиксель. "Квадрат" — это очень простой, но плохой фильтр, дающий заметный алиасинг. Для лучшего сглаживания мелких деталей перед уменьшением масштаба нужно пройтись по изображению фильтром нижних частот, т.е. удалить высокие частоты, чтобы избежать появления артефактов алиасинга.
Применительно к теме статьи — при рендеринге векторной графики, обладающей бесконечной чёткостью, в пиксельную, имеющую конечную чёткость, также имеет место передискретизация. Она может быть проведена без фильтра нижних частот (алгоритм Брезенхема), с простейшим фильтром — тот самый "квадрат" (алгоритм Ву), или с более сложным фильтром свёртки. На практике обычно на один пиксель редко приходится много мелких элементов векторной графики, и точности алгоритма Ву вполне хватает. Но если вы захотите, к примеру, отрендерить сетку из прямых чёрных линий, отстоящих друг от друга на 0.9 пикселя, то на каждые 9 квадратных пикселей придётся 10 линий, и вы получите артефакт алиасинга — 1 пиксель из 9 будет темнее остальных. В таком случае, чтобы получить равномерный фон, вам понадобится хороший фильтр нижних частот, а не "квадрат".
Что до меня, то SRC OVER реализовывал чисто умозрительно в течении 20 последних лет в разных средах чисто алгоритмически, по физическим и логическим принципам. Наконец то понял, что это и есть SRC OVER, один в один по результату.
А мужики-то и не знали)))
Как работает альфа-композитинг