2014-12-29 1 views
3

В настоящее время я работаю над простым raytracer, и до сих пор я успешно реализовал несколько функций, таких как сглаживание, глубина резкости и мягкие тени с помощью огней области. Изображения представляющего свою работы может быть таким:Проблемы с реализацией картирования фотонов


(нет АА здесь)

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

Для этого я прочитал несколько статей, которые я нашел в Интернете, например, этот: http://graphics.stanford.edu/courses/cs348b-01/course8.pdf
который очень хорошо написан.

Теперь моя программа может снимать фотоны в сцене и хранить их после первого отскока (диффузного или зеркального), а затем масштабировать мощность каждого отдельного фотона до LIGHT_POWER/PHOTON_AMOUNT. прямая визуализация это представлено в этих изображениях, где я снимал 1000K и 50k фотонов, каждый разрешается подпрыгивать в 6 раз, в общей сложности 5000K и 250K фотонов в глобальной карте:

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

В моей Raytracer я следующим образом:

  1. для каждого пикселя я посылаю луч корыто его пересекающую сцену и рассчитать прямое освещение (dot(N, L) * primitive.color * primitive.diffuseFactor * light.power), а термин зеркальными;

  2. Вот сложная часть: Я смотрю на ближайшие фотонов, которые лежат в фиксированном радиусе диска вокруг точки пересечения и суммировать свет, излучаемый каждым из таким образом:

    для каждого фотона в радиусе рассчитать свет так же, как при прямом освещении (точка (-фотонДир, N) * примитив.цвет * photonColor) и суммировать все.

  3. Когда каждый интересный фотон обработан и добавлен его вклад в окончательный цвет, я делю его на область диска, которая определяет область поиска.

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

Изображение, представляющее проблему заключается в следующем:

Это было визуализируется с использованием 150K фотонов, с 4 отскоков каждый, и прямое освещение было разделено PI.

Кроме того, если вы знаете, как я могу удалить эти уродливые артефакты из углов, пожалуйста, скажите мне.

+0

Это выглядит довольно хорошо для меня. хорошо сделанный – ldgorman

+0

Спасибо, но поскольку вы видите потолок, который является моей главной проблемой, очень темный, и если я увеличиваю косвенное освещение, единственное, что произойдет, это то, что цветное кровотечение станет более заметным, а это не то, что я want – DI2edd

+0

Можно ожидать, что потолок будет темным: он не имеет прямого освещения. Если вы видите изображения в Интернете, в которых потолок не темный, это связано с каким-то окружающим светом, который был добавлен к нему (то есть вы даже увидите потолок, если бы не было источников света вообще). Цветное кровотечение также нереально, просто мы, люди, настолько приспособлены к игнорированию цветного света, которого мы обычно не понимаем. Вот почему вы часто видите, что свет фотона становится серым, чтобы соответствовать отображаемому изображению ожиданию, а не реальности. Единственный реальный артефакт - яркие линии в углах. – cmaster

ответ

4

Во-первых, большое спасибо за вашу помощь.

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

Я не понял, что я делал неправильно, может быть, алгоритм, чтобы получить случайное направление в полушарии, возможно, счёт сбора фотонов ... Дело в том, что после переформатирования бит кода (и после внедрения заключительный этап сбора и коррекция гамма-диаграммы 2,2), я смог отобразить следующее с 200k фотонами, 10 диффузными отскоками, 20 образцами для прямого освещения и 100 образцами FG (взятых в случайном - косинусное взвешенное направление).

The final result

Я очень доволен этим, так как он выглядит почти так же, как воспроизведение сцены в c4d Траектория с V-Ray.

Я все еще не понимаю, что такое утилита для хранения направления инцидента фотона, ахахахахахаха, но он работает, так что все в порядке.

Еще раз спасибо.

+0

«Что такое утилита для сохранения направления падения фотонов» Используется для любых BRDF более сложных, чем чистый диффуз. Поскольку вы, кажется, используете чистую модель Ламбертина, вам это не нужно. – MikeMx7f

+0

Ооо, так что нужно также оценивать brdf, когда фотон отскакивает? (Чтобы определить его интенсивность) – DI2edd

+0

Да, вы должны быть важной выборкой BRDF для каждого отскока, а также применения на шаге сбора. Однако для ламбертовских поверхностей это просто. – MikeMx7f