Pull to refresh
Comments 10
Да вы что, разве это лонгрид? Это просто хорошая статья, достойная Хабра.
Автору спасибо за подробное объяснение. Единственное, что хотелось бы добавить, — вместе с мультисемплингом можно реализовать антиалиасинг, проще говоря, можно заодно с устранением шума сгладить границы полигонов фигур, если к значениям texcoord подмешивать случайное смещение на ±0.5 пикселя.
Спасибо вам уже сказали, а я, пожалуй, выскажу из всех мыслей, которые хочется высказать, две.
1. «Формула для расчета отраженного света от поверхности» совсем непонятно, откуда взялась, как мне получить такую же, как ей пользоваться и что она означает. Да, я соглашусь, тема сложная. Там непривычная физика и математика непростая, в двух словах не увяжешь. Но можно было бы хоть ссылку какую-нибудь оставить и на неё опереться. В итоге ни читатель, ни вы сами, понятия не имеете, что там происходит.
2. С генерацией направления в полусферу получилась жесть. Функция RandomSpherePoint стреляет не в сферу, а в полусферу — там хорошо видно, что z = cosTheta >= 0. Не так хорошо, но всё же видно, что распределение получается даже не равномерное в полусферу `p(theta, phi) = sin(theta) / 2pi`, а неравномерное, вытянутое к нормали `p(theta, phi) = sin(2 * theta) / 2pi`. Правда, эта самая неравномерность позволяет выкинуть cos(theta) из той непонятной формулы для расчёта света, будто его и не было. Соответственно, дальше от полусферы отрезается сектор, и лучи стреляют в порезанную полусферу, если я ничего не путаю. Если поправить, отрисовываться всё будет более корректно. Сейчас, как мне кажется, там какое-то месиво, но это я вполне могу чего-то не понять и упустить.
В общем, эту статью читать можно, но очень осторожно. Path tracing — представитель алгоритмов семейства «закодить просто; непросто понять, что где-то накосячил; сложно найти, где именно; очень сложно сделать всё корректно», поэтому без способности ориентироваться в теоретических его аспектах, браться за него — так себе идея.
1)Вы же про уравнение рендеринга? Да, я явно его не стал приводить, наверное все же стоит упомянуть вначале, но в этой статье я намеренно не хотел кидаться сложными формулами, потому что среднего программиста они скорее только смутят, чем внесут ясность.
2) да, нормали по полусфере генерируется не равномерно.тут используется cosine-weighted distribution, которое как раз и нужно, чтобы в итоге можно было выкинуть умножение на косинус угла из BDRF. В принципе замечание тоже верное, подправлю
Про вот это уравнение.
image
Явно приводить и в лицо им тыкать не стоит, я согласен, но в это уравнение рано или поздно упираешься сам. Просто я хорошо помню, как голову ломал, мол, какого чёрта это вообще работает, откуда берутся всякие странные коэффициенты, и ни в одной статейке не было написано ничего, что меня бы убедило. А когда взял это страшилище, помучался и сделал всё собственными руками, всё встало на свои места.
Cosine-weighted distribution нормально работает там, где из одной и той же точки испускается много лучей, как в старой «рекурсивной» Сишной трассировке. Если же от точки уходит только один луч, то будут артефакты, так как косинусно-взвешенное распределение будет работать только для первичных лучей (из камеры, из-за их большого количества), но не для вторичных. Лучше его не применять. Выбрасывание одного единственного косинуса не даёт никакого выигрыша в скорости, зато не будете ломать голову о том, что не так со светом или тенями.
Может на shadertoy.com выложить было бы нагляднее? Там, кстати, таких пример более чем море.
Очень интересная статья! Можете пожалуйста объяснить, что вы имеете ввиду под «нужным углом» в «Не забываем: сгенерированный нами луч хоть и лежит в одной полусфере с нормалью, но множество таких случайных лучей все еще не ориентировано под нужным нам углом»?

Мы генерируем точки в полусфере с z > 0. Но наш луч отражается по полусфере относительно положение поверхности, то есть её нормали. Поэтому мы переводим сгенерированные точки так, чтобы "вверх" полусферы был направлен в сторону нормали. Это хорошо иллюстрирует этот рисунок. Если интересно прочитать подробно, можете посмотреть сайт, откуда картинка и взята: https://www.scratchapixel.com/lessons/3d-basic-rendering/global-illumination-path-tracing/global-illumination-path-tracing-practical-implementation

Only those users with full accounts are able to leave comments. Log in, please.