В трассировке лучей / трассировке путей, один из самых простых способов сглаживания изображения - это суперсэмплирование значений пикселей и усреднение результатов. IE. вместо того, чтобы снимать каждую семпл через центр пикселя, вы смещаете семплы на некоторое количество.
При поиске в интернете я нашел два разных способа сделать это:
- Сгенерируйте образцы так, как вы хотите, и взвесьте результат с помощью фильтра.
- Одним из примеров является PBRT
- Генерация образцов с распределением, равным форме фильтра
- Два примера smallpt и Бенедикту Bitterli «s Вольфрам Renderer
Генерировать и взвешивать
Основной процесс:
- Создавайте выборки так, как вы хотите (случайным образом, стратифицированные, последовательности с низким расхождением и т. Д.)
- Смещение луча камеры с использованием двух образцов (x и y)
- Рендеринг сцены с лучом
- Вычислите вес, используя функцию фильтра и расстояние образца по отношению к центру пикселя. Например, фильтр коробки, фильтр тента, фильтр Гаусса и т. Д.)
- Применить вес к цвету от рендера
Генерация в форме фильтра
Основная предпосылка состоит в том, чтобы использовать выборку обратного преобразования для создания выборок, которые распределяются в соответствии с формой фильтра. Например, гистограмма выборок, распределенных в форме гауссиана, будет иметь вид:
Это может быть сделано либо точно, либо путем объединения функции в отдельный pdf / cdf. smallpt использует точный обратный cdf фильтра для палаток. Примеры метода биннинга можно найти здесь
Вопросов
Каковы плюсы и минусы каждого метода? И почему вы используете один поверх другого? Я могу думать о нескольких вещах:
Генерация и взвешивание кажутся наиболее надежными, позволяя любую комбинацию любого метода выборки с любым фильтром. Тем не менее, он требует от вас отслеживать вес в ImageBuffer, а затем сделать окончательное решение.
Генерация в форме фильтра может поддерживать только положительные формы фильтра (т. Е. Без Митчелла, Кэтмулла Рома или Ланцоша), поскольку у вас не может быть отрицательного PDF. Но, как упоминалось выше, это легче реализовать, так как вам не нужно отслеживать какие-либо веса.
Хотя, в конце концов, я думаю, вы можете думать о методе 2 как об упрощении метода 1, поскольку он по сути использует неявный вес Box Filter.