Введение
Многие из основных механизмов рендеринга векторной графики имеют алгоритмический недостаток. Они визуализируют каждую фигуру отдельно и сглаживают, вычисляя покрытие пикселей, а затем компонуют их друг на друга. Да, это просто, но правильные решения еще проще.
Это приводит к проблеме смешения, так как прозрачность связывает покрытие. Альфа-смешение следует правилу, которое не представляет ситуацию точно, например, взять пиксель, покрытый на 50%, который соседствует с пикселем, который также покрыт на 50%, не заканчивается со 100% -ным покрытием, он заканчивается с 75% -ым покрытием , Как это выглядит, зависит от того, как настроен алгоритм и других деталей, но по сути это известная ошибка. Кто-то даже пытался документировать различные ошибки движка вместе с написанием статьи, показывающей, как это можно сделать лучше.
Рисунок 1 : Совершенно нерепрезентативная выборка, отображающая фигуру из треугольников с увеличенной ошибкой в верхнем ряду. Источник SVG
Задача имеет простое наивное решение * просто супер образец без расчета покрытия и фильтрации изображения. В качестве бонуса вы можете использовать более качественные алгоритмы реконструкции изображений, чем блочная фильтрация (см. «Пиксель - не квадрат 3» ). Есть даже решения, которые имеют сопоставимую скорость с текущими решениями, и эти решения намного проще реализовать в конвейерах аппаратной растеризации (и вы редко видите эту ошибку на GPU, потому что она создана, чтобы избежать только этой проблемы).
Это тоже не проблема без затрат. Есть много людей, работающих в графическом дизайне, которые тратят нетривиальное количество времени, пытаясь обойти эту проблему вручную, следя за тем, чтобы здесь были совпадения, а не перекрытия, чтобы решить проблему, которую компьютер должен сделать для них. И эффектно проваливается во многих случаях. Но их клиенты не заботятся, почему ошибка там, они должны исправить это.
Вопрос
Как распространяется ошибка? Поскольку все они делают одну и ту же ошибку, можно сделать вывод, что они используют один и тот же источник для своего алгоритма. Что могло заставить дизайнеров выбрать этот алгоритм? Почему только 3D-программисты распознали эту ошибку и даже систематизировали ее роль в своих API и обучении, а 2D-программисты этого не сделали?
Как обеспечить, чтобы эта ошибка перестала распространяться дальше?
Приложение (но я не спрашиваю об этом)
* Очевидно, мое заявление о том, что суперсэмплинг работает без изъянов, является экстраординарным и требует экстраординарных доказательств. Итак, ключ к работе суперсэмплинга в том, что суперсэмплинг не выполняет обработку покрытия. По сути, супер-сэмплер рассматривает каждый образец как точечный. Поскольку точечная выборка не делает предположения о базовой области, она не вызывает альфа-сравнения там, где это не происходит.
Чтобы это работало последовательно, как описано в одном из ответов. Нам нужно сделать, чтобы обработать выборки с целочисленной выборкой для согласованности. Это гарантирует нам, что каждая точка, однажды преобразованная в пространство экрана, получит одно и то же решение для равных координат, и что ни один образец не будет затенен границей пикселя 2 раза. Для этого сэмпл может не запускать пиксель, если он включен, например, если это левый нижний сэмпл (поэтому мы устанавливаем правило, что точные ребра обрабатываются в> vs <=). Все, кроме одной консольной видеокарты, работают следующим образом. Это гарантирует, что нет необходимости кэшировать лишние данные и не нужно проводить дополнительное тестирование поблизости. Это решение является таким же стабильным, более общим и последовательным, чем решения на основе покрытия.
Алгоритм точно такой же, как и оригинал, с немного меньшим количеством кода и чуть большим количеством сэмплов Таким образом, он такой же непротиворечивый, если не более, чем алгоритм на основе покрытия. Мы знаем это, потому что мы использовали такие методы целую вечность практически в любой другой области обработки сигналов, а также в видеокартах.
Так есть ли у этого метода недостаток? Ну, это немного медленнее, если вы просто сделаете наивное предположение. Теоретически он имеет более быстрое асимптотическое поведение, чем растеризатор покрытия, немного похожий на трассировщик лучей, который все еще остается на одном уровне в типичных сценах. Также это может сделать использование эффектов на основе свертки более болезненным для реализации.