На самом деле не существует хорошего способа сделать это эффективно аналитически для всех угловых случаев. Большинство или все коммерческие 2D рендеры, которые пытаются выполнить аналитическое вычисление покрытия, допускают предсказуемые ошибки, которых нет у методов мультисэмплинга.
Типичная проблема - две перекрывающиеся фигуры, которые имеют один и тот же край. Обычная ситуация состоит в том, что альфа-каналы в сумме дают слишком толстый альфа-край, который слегка псевдоним. Или, если фигуры окрашены по-разному, система путает, какой цвет фона. Это очень раздражает.
Рисунок 1 : Механизм рендеринга путает покрытие и создает тонкий белый контур, где не должно быть контура.
Второе идеальное покрытие - это фильтрация блоков. Мы, безусловно, можем сделать лучше. Учитывая, что существует так много особых угловых случаев, которые требуют правильных логических операций над фигурами, суперсэмплинг все же лучше. Фактически оценки охвата могут использоваться для концентрации выборки там, где это наиболее вероятно необходимо.
Ситуацию можно упростить до многоугольников на подпиксельных уровнях, после чего можно решить дискретное аналитическое решение. Но это за счет гибкости. Например, не исключено, что будущие векторные системы могут захотеть использовать размытые линии переменной ширины, которые создают проблему для аналитических решений, как и другие объекты с разным цветом.
Как сделать это аналитически
Изображение 2 : Предположим, у вас есть эта сцена, вид в разобранном виде справа
Теперь вы не можете просто сделать это аналитически, каждый кусок отдельно, а затем объединить данные. Потому что это приводит к неверным данным. Посмотрите, что альфа-смешение позволит синему сиянию пробиться через пробелы, если вы сделаете это.
Вам нужно разделить сцену так, чтобы каждая фигура исключала то, что находится под другой:
Изображение 3 : Вам необходимо разрезать нижележащие поверхности.
Теперь, если все непрозрачно, тогда все прямо. просто рассчитайте площадь каждого куска и умножьте его на цвет и сложите их вместе. Теперь вы можете использовать что-то вроде этого .
Все это ломается, если ваши индивидуальные фигуры не непрозрачны, но даже это можно сделать на каком-то уровне.
Помните:
- Расчет АА должен быть выполнен в линейном цветовом пространстве и преобразован обратно, чтобы использовать пространство.