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