Зачем использовать тентовый фильтр в трассировке пути?

12

99 строк трассировщика пути C Smallpt визуализирует субпиксельную сетку 2x2 для каждого пикселя, который он намеревается визуализировать, а затем выполняет фильтрацию тентов, чтобы объединить их.

Существует интересная презентация объяснить код здесь , и он упоминает палаточный фильтр , но не объясняет , почему он там.

Может ли кто-нибудь объяснить, почему в этом случае предпочтительнее тентовый фильтр по сравнению с размытым изображением (просто усредняя выборки)?

Будет ли лучше использовать фильтр для палаток, такой как бикубическая интерполяция Эрмита?

Алан Вульф
источник

Ответы:

13

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

Тентовый фильтр (треугольный фильтр), безусловно, больше напоминает центральный пик фильтра sinc, чем блочный фильтр:

sinc, triangle и box фильтры

Бикубический фильтр (например, Митчелл-Нетравали) может еще точнее улавливать форму синуса, включая его первые две отрицательные доли.

Реальность выбора фильтра немного более тонкая, чем «приблизительный sinc, насколько это возможно», так как существуют различные виды артефактов, которые могут генерироваться «неидеальными» фильтрами сглаживания, такими как сглаживание, чрезмерное размывание и вызов. Кроме того, различные фильтры могут быть более или менее вычислительно дорогими. Так что это попытка обменять различные артефакты друг на друга и на производительность. Различные сцены / изображения могут отдавать предпочтение тому или иному выбору, и это также отчасти эстетическое суждение.

Что касается того, почему smallpt, в частности, использует тентовый фильтр, я бы предположил сочетание производительности (это быстрый фильтр для оценки) и краткости - это можно сделать в виде пары строк кода, в то время как бикубический фильтр потребовал бы больше код.

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

субпиксельные фильтры тента

Я не уверен, было ли это преднамеренным, или просто так получилось. Я предполагаю, что это приводит к несколько более резкому изображению, чем если бы использовался один фильтр тента на пиксель (из-за более узкой поддержки), но, вероятно, также более заметное наложение.

Натан Рид
источник
Я не могу не сказать спасибо! Фактически, я сначала понимаю это как стратифицированную выборку с 4 стратами. И я настраиваю количество «слоев», например, 9, 16 ... Теперь я знаю, что это «трапециевидный» фильтр (не так часто встречается у других средств визуализации). И поскольку число моих "слоев" стремится к бесконечности, фильтр становится коробочным фильтром, где я рисую лилию ... Интересно!
хаосинк
3

Я только что посмотрел статьи в Википедии о билинейной интерполяции. Палаточный фильтр - это разновидность билинейной интерполяции. Билинейная интерполяция интерполируется на 2 измерения. Сначала он линейно интерполируется в одном измерении, а затем в другом.

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

Когда вы смотрите на это изображение, оно сначала делает это в столбце, а затем в строке, например.

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

Если все 4 точки находятся на фиксированных позициях на одинаковом расстоянии от центра, то вы получите ровно 25% вклада по всем точкам, это то же самое, что и усреднение.

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

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

Бикубическая интерполяция дает более плавный вид. Бикубическая: введите описание изображения здесь

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

Что лучше? Ну, это зависит от того, что вам нравится, и я не думаю, что будет огромная разница.

Мои источники: https://en.wikipedia.org/wiki/Reconstruction_filter#Image_processing

https://en.wikipedia.org/wiki/Bilinear_interpolation

https://en.wikipedia.org/wiki/Bicubic_interpolation

(Изображения из Википедии и являются общественным достоянием)

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

bram0101
источник