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 нормально работает там, где из одной и той же точки испускается много лучей, как в старой «рекурсивной» Сишной трассировке. Если же от точки уходит только один луч, то будут артефакты, так как косинусно-взвешенное распределение будет работать только для первичных лучей (из камеры, из-за их большого количества), но не для вторичных. Лучше его не применять. Выбрасывание одного единственного косинуса не даёт никакого выигрыша в скорости, зато не будете ломать голову о том, что не так со светом или тенями.
Очень интересная статья! Можете пожалуйста объяснить, что вы имеете ввиду под «нужным углом» в «Не забываем: сгенерированный нами луч хоть и лежит в одной полусфере с нормалью, но множество таких случайных лучей все еще не ориентировано под нужным нам углом»?

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

Sign up to leave a comment.

Articles