Охват - недостаток в алгоритме - как избавиться от его использования?

10

Введение

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

Это приводит к проблеме смешения, так как прозрачность связывает покрытие. Альфа-смешение следует правилу, которое не представляет ситуацию точно, например, взять пиксель, покрытый на 50%, который соседствует с пикселем, который также покрыт на 50%, не заканчивается со 100% -ным покрытием, он заканчивается с 75% -ым покрытием , Как это выглядит, зависит от того, как настроен алгоритм и других деталей, но по сути это известная ошибка. Кто-то даже пытался документировать различные ошибки движка вместе с написанием статьи, показывающей, как это можно сделать лучше.

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

Рисунок 1 : Совершенно нерепрезентативная выборка, отображающая фигуру из треугольников с увеличенной ошибкой в ​​верхнем ряду. Источник SVG

Задача имеет простое наивное решение * просто супер образец без расчета покрытия и фильтрации изображения. В качестве бонуса вы можете использовать более качественные алгоритмы реконструкции изображений, чем блочная фильтрация (см. «Пиксель - не квадрат ). Есть даже решения, которые имеют сопоставимую скорость с текущими решениями, и эти решения намного проще реализовать в конвейерах аппаратной растеризации (и вы редко видите эту ошибку на GPU, потому что она создана, чтобы избежать только этой проблемы).

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

Вопрос

Как распространяется ошибка? Поскольку все они делают одну и ту же ошибку, можно сделать вывод, что они используют один и тот же источник для своего алгоритма. Что могло заставить дизайнеров выбрать этот алгоритм? Почему только 3D-программисты распознали эту ошибку и даже систематизировали ее роль в своих API и обучении, а 2D-программисты этого не сделали?

Как обеспечить, чтобы эта ошибка перестала распространяться дальше?


Приложение (но я не спрашиваю об этом)

* Очевидно, мое заявление о том, что суперсэмплинг работает без изъянов, является экстраординарным и требует экстраординарных доказательств. Итак, ключ к работе суперсэмплинга в том, что суперсэмплинг не выполняет обработку покрытия. По сути, супер-сэмплер рассматривает каждый образец как точечный. Поскольку точечная выборка не делает предположения о базовой области, она не вызывает альфа-сравнения там, где это не происходит.

Чтобы это работало последовательно, как описано в одном из ответов. Нам нужно сделать, чтобы обработать выборки с целочисленной выборкой для согласованности. Это гарантирует нам, что каждая точка, однажды преобразованная в пространство экрана, получит одно и то же решение для равных координат, и что ни один образец не будет затенен границей пикселя 2 раза. Для этого сэмпл может не запускать пиксель, если он включен, например, если это левый нижний сэмпл (поэтому мы устанавливаем правило, что точные ребра обрабатываются в> vs <=). Все, кроме одной консольной видеокарты, работают следующим образом. Это гарантирует, что нет необходимости кэшировать лишние данные и не нужно проводить дополнительное тестирование поблизости. Это решение является таким же стабильным, более общим и последовательным, чем решения на основе покрытия.

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

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

joojaa
источник
Добавлю фотографии для моего амнендума, как только мой рабочий день закончится. После всего этого графическая обработка имеет визуальную интерпретацию
joojaa

Ответы:

6

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

И я думаю, что это причина, по которой вы ищете: если вам нужен алгоритм, который не требует много памяти и времени выполнения, все становится намного сложнее, чем при наивном подходе «прозрачности».

Док Браун
источник
Вам на самом деле не нужно хранить образцы, все, что вам нужно сделать, это сохранить настройки растеризации. Метод, основанный на покрытии, также не сохраняет их, поэтому это не является шагом назад. Наивный метод представлен только потому, что его легко понять, вы можете легко сделать выборку на основе приоритетов. Также, если вы хотите перенести свои решения на основе покрытия в графический процессор, вам потребуется проделать большую дополнительную работу, и вы будете несовместимы с его моделью.
Джуджаа
@joojaa: можете ли вы обрисовать, что вы подразумеваете под «хранением настроек растеризации», или дать ссылку, где подход объясняется так, что вам не нужно копаться в> 20-страничной научной статье?
Док Браун,
Каждый пиксель не зависит друг от друга, поэтому вам нужно сохранять сэмплы только во время работы с пикселем, после чего вы можете безопасно отбросить их. Если вы хотите использовать сборщик более высокого порядка, вы можете сохранить только ограниченное представление. Так что все, что вам действительно нужно сделать, это выделить память для вашего процессорного ядра, так что, может быть (16-256 байт на поток)
joojaa
ой, извините, вам даже не нужно хранить сэмплы, если вы делаете коробочную фильтрацию, вы можете просто использовать формулу для скользящего / скользящего среднего, которая не требует, чтобы вы
сохраняли
@joojaa: Я не понимаю - разве вам не нужно вычислять сэмплы в первую очередь связанных фигур , может быть, сотни или тысячи, а затем отфильтровывать их до отображения растра?
Док Браун,
6

Суперсэмплинг вообще не решит проблему: он просто сделает ее менее заметной. Если пиксели в два раза меньше, проблема будет вдвое менее заметной, но не исчезнет.

Архитектурный аспект этих проектов заключается в том, что мы хотим, чтобы команда «рендеринг треугольника ABC» имела определенный смысл. Мы не хотим, чтобы он был неоднозначным, за исключением случаев, когда он рассматривается как часть набора команд рисования - например, имеет одно значение, когда «рендеринг треугольника BCD» также находится в коллекции (с тем же или другим цветом), и другое значение, когда это не так

Учитывая, например, тысячу треугольников, даже найти все треугольники, которые разделяют сторону или часть стороны с ABC, вычислительно тяжело (помня, что это нужно делать тысячу раз). Есть также много других практических проблем: в частности, все исходные запросы на рендеринг должны быть сохранены, даже если они были нарисованы давно, на случай, если их нужно будет переоценить из-за нового, дополнительного запроса.

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

Мартин Кочански
источник
Это проблема расчета покрытия, если моя суперсэмплинг НЕ выполняет расчет покрытия, тогда у него нет проблем, так как он будет сходиться к реальному ответу, а не только уменьшит проблему. Вам нужен код, чтобы доказать это? Вот как ваша видеокарта работает, и она не получает эту проблему. В противном случае каждая игра, которую вы видите, будет представлять проблему. Я не покупаю этот ответ, поскольку он основан на ложной логике.
Джуджаа
Игры @joojaa либо не сглаживают, либо используют суперсэмплинг для сглаживания, который обычно дает четыре уровня сглаживания. Этого недостаточно для графики с презентационным качеством, где требуется около 64 уровней сглаживания. Так что игры меняют одну проблему на другую.
Пит Киркхем,
@PeteKirkham зависит от ваших настроек. Некоторые гаммы позволяют вам указывать количество образцов. В любом случае вам не нужно более 16 сэмплов для создания AA уровня представления, если вы используете фильтр более высокого порядка, чем блочная фильтрация. Обратите внимание, что изображение без ошибок в моем примере выполняется суперсэмплингом внутри аппаратного реастератора.
joojaa