Сглаживание. Как Точно Рассчитать Покрытие Перекрывающихся Аналитических Кривых?

  • Автор темы Woolfus
  • Обновлено
  • 18, Oct 2024
  • #1

Сглаживание 2D-фигур сводится к вычислению доли пикселя, покрываемой формой. Для простых непересекающихся фигур это не так уж сложно: обрежьте фигуру по пиксельному прямоугольнику и вычислите площадь получившейся фигуры. Но это становится сложнее, если несколько фигур перекрывают один и тот же пиксель. Простое суммирование площадей может привести к тому, что вычисленное покрытие будет слишком большим, если при этом пренебречь тем, насколько одна фигура покрывает другую фигуру. Например, см. раздел «Ограничения» этой статьи по рендерингу шрифтов. Вы также можете оказаться в ситуации, когда две кривые происходят от разных объектов разного цвета (поэтому речь идет не об общем покрытии объединения двух фигур, а о покрытии каждой из них в отдельности).

Как бы это было вычислено, если бы вы заботились о полной точности? Еще сложнее: как точно рассчитать покрытие для перекрывающихся неполигональных фигур, таких как кривые? Есть ли момент, когда у вас нет другого выбора, кроме как вернуться к методам мультисэмплинга или стохастическим методам?

#антиалиасинг #кривая

Woolfus


Рег
14 Dec, 2006

Тем
93

Постов
189

Баллов
684
  • 26, Oct 2024
  • #2

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

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

Изображение 1: механизм рендеринга путает покрытие и создает тонкий белый контур там, где контура быть не должно.

Второе идеальное покрытие представляет собой блочную фильтрацию. Мы, конечно, можем добиться большего. Учитывая, что существует так много особых угловых случаев, для правильного выполнения которых потребуются логические операции над фигурами, супервыборка по-прежнему лучше. Фактически оценки охвата могут использоваться для концентрации выборки там, где она наиболее вероятна.

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

Как это сделать аналитически

Изображение 2: Предположим, у вас есть эта сцена, покомпонентный вид справа.

Теперь нельзя просто сделать это аналитически, каждую часть отдельно, а затем объединить данные. Потому что это приводит к неверным данным. Посмотрите, если бы вы это сделали, альфа-смешение позволило бы синему сиять сквозь промежутки.

Что вам нужно, так это разделить сцену так, чтобы каждая фигура исключала то, что находится под другой:

Изображение 3: Вам необходимо разрезать нижележащие поверхности.

Теперь, если все непрозрачно, то все просто. просто вычислите площадь каждой части, умножьте ее на цвет и просуммируйте. Теперь вы можете использовать что-то вроде этот.

Все это не работает, если ваши отдельные фигуры, конечно, не непрозрачны, но даже это можно сделать на каком-то уровне.

Помнить:

  • Расчет AA необходимо выполнять в линейном цветовом пространстве и конвертировать обратно в используемое пространство.
 

Mashinis


Рег
24 Nov, 2007

Тем
65

Постов
191

Баллов
546
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно