Как точно рассчитать покрытие перекрывающихся аналитических кривых?

10

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

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

Джон Калсбек
источник

Ответы:

10

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

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

образ

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

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

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

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

Аналитическая сцена

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

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

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

введите описание изображения здесь

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

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

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

Помните:

  • Расчет АА должен быть выполнен в линейном цветовом пространстве и преобразован обратно, чтобы использовать пространство.
joojaa
источник
Скажи, что нас не очень заботит эффективность. Как мы будем выполнять вычисления покрытия для логических операций с фигурами? Это возможно вообще или только для определенных форм?
Джон Калсбик,
@JohnCalsbeek хорошо, я начинаю строить аналитический ответ, это займет некоторое время
joojaa