Прочитав несколько статей в Интернете, я могу с уверенностью сказать, что не знаю, как работает сглаживание, когда Рэй Трассинг работает .
Все, что я понимаю, это то, что один пиксель / луч разделен на 4 субпикселя и 4 луча, а не 1 .
Может кто-нибудь объяснить, как это делается (желательно с кодом)?
raytracing
antialiasing
pixels
ray
Арджан Сингх
источник
источник
foreach pixel : p{acc = 0; foreach subsample : s { acc+=sample_scene(s);} store(p, acc);}
Ответы:
Я думаю, можно с уверенностью сказать, что есть два разных способа выполнения АА в трассировке лучей:
1: если у вас есть окончательное изображение и изображение глубины, можно применить практически все существующие методы, которые используются в играх (FXAA и т. Д.). Они работают непосредственно с конечным изображением и не связаны с трассировкой лучей.
2: второй метод состоит в том, чтобы учитывать несколько лучей для каждого пикселя и затем усреднять результат. Для очень простой версии подумайте об этом так:
Есть и другие варианты этого метода. Например, вы можете адаптировать количество выборок для пикселей, которые находятся прямо на краю геометрии, что означает, что для некоторых пикселей у вас будет только 4 образца, а для других 16.
Проверьте ссылки в комментариях выше.
источник
Raxvan совершенно прав, что «традиционные» методы сглаживания будут работать в трассировке лучей, включая те, которые используют информацию, такую как глубина, для сглаживания. Вы можете даже сделать временное сглаживание в трассировке лучей, например.
Жюльен подробно остановился на 2-м пункте Раксвана, который был объяснением суперсэмплинга, и показал, как вы на самом деле это делаете, также упомянув, что вы можете рандомизировать расположение сэмплов в пикселе, но затем вы входите в страну обработки сигналов, которая очень глубже, и это определенно так!
Если вы сделаете это, вы все равно можете получить псевдоним. Это лучше, чем НЕ делать этого, потому что вы увеличиваете частоту дискретизации, поэтому сможете обрабатывать более высокочастотные данные (то есть более мелкие детали), но это все равно может вызывать алиасинг.
Когда вы используете только «обычные» случайные числа, как вы получаете из rand () или std ::iform_int_distribution, это называется «белый шум», потому что он содержит все частоты, например, как белый свет состоит из всех других цветов (частот). ) света.
Использование белого шума для рандомизации сэмплов в пикселе имеет проблему, заключающуюся в том, что иногда ваши сэмплы будут объединяться. Например, если вы усредняете 100 выборок в пикселе, но все они в конечном итоге оказываются в верхнем левом углу пикселя, вы не собираетесь получать ЛЮБУЮ информацию о других частях пикселя, поэтому ваш конечный цвет пикселя в результате будет отсутствовать информация о том, какого цвета это должно быть.
Лучшим подходом является использование так называемого синего шума, который содержит только высокочастотные компоненты (например, как синий свет - это высокочастотный свет).
Преимущество синего шума состоит в том, что вы получаете равномерное покрытие по пикселю, как вы получаете с равномерной сеткой выборки, но вы все равно получаете некоторую случайность, которая превращает наложение в шум и дает вам лучше выглядящее изображение.
К сожалению, синий шум может быть очень дорогим для вычисления, и все лучшие методы, кажется, запатентованы (какого черта ?!), но один из способов сделать это, изобретен Pixar (и запатентован тоже, я думаю, но не уверен на 100%) состоит в том, чтобы сделать четную сетку точек выборки, а затем произвольно сместить каждую точку выборки на небольшую величину - например, случайную величину между плюс или минус половиной ширины и высоты сетки выборки. Таким образом, вы получите своего рода выборку синего шума за довольно дешевую цену.
Обратите внимание, что это форма многоуровневой выборки, и выборка из пуассоновых дисков также является одной из форм, которая также является способом генерации синего шума: https://www.jasondavies.com/poisson-disc/
Если вы заинтересованы в том, чтобы углубиться, вы, вероятно, захотите проверить этот вопрос и ответить на него!
Какова основная причина сглаживания с использованием нескольких случайных выборок в пикселе?
Наконец, этот материал начинает уходить в область трассировки Монте-Карло, которая является распространенным методом фотореалистичной трассировки лучей. Если вы хотите узнать больше об этом, прочитайте это!
http://blog.demofox.org/2016/09/21/path-tracing-getting-started-with-diffuse-and-emissive/
источник
Давайте предположим довольно типичный основной цикл трассировки лучей:
Одна из возможных модификаций для выполнения 4 выборок MSAA:
Другая возможность состоит в том, чтобы сделать случайный джиттер (вместо основанного на матрице выше), но затем вы вскоре войдете в область обработки сигналов, и потребуется много чтения, чтобы узнать, как выбрать хорошую функцию шума.
Идея остается неизменной: считайте, что пиксель представляет крошечную квадратную область, и вместо того, чтобы снимать только один луч, проходящий через центр пикселя, снимайте много лучей, покрывающих всю область пикселя. Чем плотнее распределение лучей, тем лучше сигнал.
PS: я написал код выше на лету, поэтому я ожидал несколько ошибок в нем. Это только для того, чтобы показать основную идею.
источник