Сглаживание / фильтрация в трассировке лучей


20

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

При поиске в интернете я нашел два разных способа сделать это:

  1. Сгенерируйте образцы так, как вы хотите, и взвесьте результат с помощью фильтра.
    • Одним из примеров является PBRT
  2. Генерация образцов с распределением, равным форме фильтра


Генерировать и взвешивать

Основной процесс:

  1. Создавайте выборки так, как вы хотите (случайным образом, стратифицированные, последовательности с низким расхождением и т. Д.)
  2. Смещение луча камеры с использованием двух образцов (x и y)
  3. Рендеринг сцены с лучом
  4. Вычислите вес, используя функцию фильтра и расстояние образца по отношению к центру пикселя. Например, фильтр коробки, фильтр тента, фильтр Гаусса и т. Д.) Формы фильтра
  5. Применить вес к цвету от рендера


Генерация в форме фильтра

Основная предпосылка состоит в том, чтобы использовать выборку обратного преобразования для создания выборок, которые распределяются в соответствии с формой фильтра. Например, гистограмма выборок, распределенных в форме гауссиана, будет иметь вид:
Гауссова гистограмма

Это может быть сделано либо точно, либо путем объединения функции в отдельный pdf / cdf. smallpt использует точный обратный cdf фильтра для палаток. Примеры метода биннинга можно найти здесь


Вопросов

Каковы плюсы и минусы каждого метода? И почему вы используете один поверх другого? Я могу думать о нескольких вещах:

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

Генерация в форме фильтра может поддерживать только положительные формы фильтра (т. Е. Без Митчелла, Кэтмулла Рома или Ланцоша), поскольку у вас не может быть отрицательного PDF. Но, как упоминалось выше, это легче реализовать, так как вам не нужно отслеживать какие-либо веса.

Хотя, в конце концов, я думаю, вы можете думать о методе 2 как об упрощении метода 1, поскольку он по сути использует неявный вес Box Filter.


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

Может быть? Позвольте мне немного
поиграться

1
Хорошо, если вы отслеживаете нули функции, вы можете abs () выводить в pdf. Затем при выборке вы можете проверить, отрицательный ли вы. Пример кода здесь: gist.github.com/RichieSams/aa7e71a0fb4720c8cb41
RichieSams

Ответы:


9

На эту тему вышла отличная статья 2006 года « Выборочная фильтрация» . Они предлагают ваш метод 2, изучают свойства и в целом высказываются за него. Они утверждают, что этот метод дает более плавные результаты рендеринга, поскольку он одинаково взвешивает все выборки, которые вносят вклад в пиксель, тем самым уменьшая дисперсию в конечных значениях пикселей. Это имеет некоторый смысл, так как это общая максима в рендеринге Монте-Карло, что выборка по важности даст меньшую дисперсию, чем взвешенные выборки.

Преимущество метода 2 также состоит в том, что его немного легче распараллелить, потому что вычисления каждого пикселя не зависят от всех других пикселей, тогда как в методе 1 результаты выборки распределяются между соседними пикселями (и, следовательно, их необходимо каким-то образом синхронизировать / передавать, когда пиксели распараллелены между несколько процессоров). По той же причине проще сделать адаптивную выборку (больше выборок в областях с высокой дисперсией изображения) с помощью метода 2, чем метода 1.

В статье они также экспериментировали с фильтром Митчелла, отбирая из abs () фильтра, а затем взвешивая каждую выборку с +1 или -1, как предложено @trichoplax. Но в итоге это фактически увеличило дисперсию и стало хуже, чем в методе 1, поэтому они пришли к выводу, что метод 2 применим только для положительных фильтров.

Тем не менее, результаты этого документа могут быть не универсально применимы, и это может быть в некоторой степени зависит от сцены, какой метод выборки лучше. Я написал сообщение в блоге, исследуя этот вопроснезависимо, в 2014 году, используя синтетическую «функцию изображения», а не полную визуализацию, и нашел способ 1 для получения более визуально приятных результатов благодаря более плавному сглаживанию высококонтрастных краев. Бенедикт Биттерли также прокомментировал этот пост, сообщая о сходной проблеме со своим рендерером (избыточный высокочастотный шум вокруг источников света при использовании метода 2). Кроме того, я обнаружил, что основное различие между методами заключалось в частоте результирующего шума: метод 2 дает более высокочастотный шум «пиксельного размера», в то время как метод 1 дает «зерна» шума, которые имеют ширину 2-3 пикселя, но амплитуда шума была одинаковой для обоих, поэтому, какой вид шума выглядит менее плохим, вероятно, является вопросом личных предпочтений.


Благодарность! Это большие ресурсы. Итак, в конце концов, есть 3 метода? 1. Генерация и взвешивание с разбрызгиванием 2. Генерация и взвешивание без разбрызгивания 3. Генерация в форме фильтра
RichieSams

Знаете ли вы о каких-либо работах, блогах и т. Д., В которых рассказывается, как распараллелить создание и вес с разбрызгиванием? Вдобавок ко мне, вы можете иметь мьютекс на плитку или сделать каждый пиксель атомарным.
RichieSams

2
@RichieSams Я не знаю, почему вы бы использовали «генерировать и взвешивать без разбрызгивания», на самом деле - кажется, что в любом случае это будет хуже, чем выборка важности фильтра. Я предполагал, что «генерировать и взвешивать» подразумевает разбрызгивание. Что касается распараллеливания сплаттинга, то в верхней части моей головы одним из способов было бы разделить изображение на тайлы, но дать каждой плитке границу размером 2–3 пикселя, чтобы поймать знаки, пересекающие край плитки. Затем в последнем проходе аддитивно соедините граничные плитки вместе в окончательное изображение.
Натан Рид
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.