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