Как работает трассировщик пути в Cycles

9 ноября 2015 17 комментариев Артем Слаква Рендеринг и освещение

Сегодняшним уроком является небольшой отрывок из книги Руководство по Cycles. Он познакомит вас c основами работы трассировщика пути в Cycles и заодно позволит заглянуть в книгу, выход которой состоится уже совсем скоро.


Для каждого пикселя изображения создается луч. Все лучи исходят из камеры и до столкновения с чем-либо являются лучами камеры (camera ray). Если луч попадет на источник света (emission) или шейдер holdout, то он будет удален из сцены, а пиксель получит цвет источника света или станет прозрачным, в случае с holdout. Во всех остальных случаях поведение луча зависит от типа шейдера, назначенного поверхностям, об которые он ударяется. Самым простым примером будет идеальное зеркало (sharp glossy). В данном случае луч будет отражаться согласно простейшему правилу, тоесть под тем же углом, под которым и попал на поверхность. После этого луч уже продолжит свой путь как глянцевый луч (glossy ray). Допустим, далее он ударится о диффузную поверхность (diffuse). От данной поверхности луч отразится в случайном направлении. Если к этому моменту времени луч не достигнет максимального количества отскоков для него, то в конечном счете луч попадет на источник света. На этом его путь будет прекращен и пиксель получит цвет в зависимости от того, какой путь преодолел луч. Данный процесс повторяется такое количество раз, сколько сэмплов вы установите на вкладке рендера. В конце принимается среднее значение всех полученных цветов пикселя.
tracer_1_1
Рис 1.3) Количество клеток на сетке определяет количество пикселей изображения. Для каждой клетки будет выпущено столько лучей из камеры, сколько сэмплов вы установите на вкладке рендера.
tracer_1_2
Рис 1.4) Луч, вышедший из камеры, попадает на глянцевую поверхность и отразившись от нее, попадает на источник света.

На рисунке выше показан очень простой пример. Луч, вышедший из камеры, попадает на глянцевую поверхность и отражается на источник света. Путь луча после отскока окрашен в красный цвет и называется Glossy 0. Это означает, что луч поменял свой тип, с луча камеры (camera ray) на луч отражения (reflaction). 0 означает количество отскоков, проделанных лучом (Cycles начинает считать с 0). После отскока от поверхности, луч изменяет свой тип, в зависимости от типа поверхности, на которую он попал. В данном случае для поверхности назначен шейдер Glossy. Но разные лучи, вышедшие из камеры, могут отскакивать в различных направлениях и попасть на пол, который на рисунке ниже имеет диффузную поверхность. В таком случае луч, отразившийся от пола, станет диффузным лучом (diffuse ray).
tracer_1_3
Рис 1.5) Луч, вышедший из камеры попадает на глянцевую поверхность и отразившись от нее, попадает на диффузную поверхность.

В предыдущем примере объект имел лишь глянцевый шейдер. Но что будет, если объект имеет несколько шейдеров, что практически всегда и бывает с материалами? Чаще всего, это может быть смесь шейдеров diffuse и glossy. В данном случае Cycles будет случайным образом выбирать шейдер из материала. Если используется нод Mix, то шейдер с большим фактором смешивания будет иметь большую вероятность быть выбранным рендером. Давайте изменим глянцевую сферу на стеклянную и посмотрим, что произойдет:

tracer_1_4
Рис 1.6) Луч, вышедший из камеры, попадает на стеклянную поверхность. В данном случае у луча есть два пути: отразиться от поверхности или пройти сквозь нее.

Как видите, у луча достаточно много вариантов пути даже в простой сцене. Попадая на стеклянную поверхность, луч решает по какому пути ему пойти дальше. Давайте разберем полностью оба маршрута луча:

tracer_1_5
Рис 1.7) Луч, вышедший из камеры, попадает на стеклянную поверхность. В случае отражения от поверхности, он попадет на источник света и прекратит свое существование. В случае прохождения сквозь сферу, луч изменит свой тип на Transmission и выйдя из сферы, он все еще будет иметь тип Transmission до тех пор, пока не попадет на пол. После этого луч изменится на диффузный и в конце своего пути попадет на источник света, прекратив свое существование.

Решить отразиться ему от поверхности либо пройти сквозь нее, луч может на основе фактора Френеля. Первый пример мы уже разобрали (отражение луча от поверхности), теперь давайте рассмотрим путь сквозь объект. Попав внутрь и выйдя из объекта, луч будет иметь тип Transmission до тех пор, пока не попадет на пол. Так как пол имеет диффузный шейдер, луч соответственно станет диффузным, и продолжит отскакивать от поверхности до попадания на источник света. Весь путь данного луча состоит из 3-х отскоков, но он имеет лишь один отскок transmission и один diffuse. Если бы вы установили максимальное количество отскоков менее 3-х, то луч прекратил бы свое существование при ударе о стену, и не дошел бы до источника света.

Каждый луч, вышедший из камеры, возвращает значение интенсивности своего пикселя. Этот результат называют образцом (sample). Чтобы определить окончательный цвет пикселя, берется среднее значение всех образцов, полученных для него.

tracer_1_6
Рис 1.8) Для каждого из трех пикселей хранится 10 значений интенсивности. В результате пиксель получит цвет, основанный на среднем значении интенсивности всех 10-ти образцов.
tracer_1_7
Рис 1.9) Определение итогового значения интенсивности пикселя при 10-ти сэмплах.

Определение пути луча при попадании на поверхность

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

tracer_1_8
Рис 1.10) Слева – схематическое отображение вариантов отражения луча для глянцевой поверхности, справа – для диффузной. Длина зеленой стрелки соответствует вероятности отражения (чем длиннее, тем вероятнее).

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

tracer_1_9
Рис 1.11) На рисунке показаны возможные варианты направления луча после каждого отскока. Как видите, вероятность того, что луч пройдет по заданному нами пути крайне мала.

Как видите, вероятность добраться до задней стенки у луча не большая, но исходя из рисунка, мы видим, что задняя часть сцены должна быть освещена. Так как же этого достичь? Использовать пятизначные значения количества сэмплов? К счастью, в Cycles есть умный способ сбора информации об освещении для каждого отскока, который называется Light Sampling.

Light Sampling

…продолжение в книге “Руководство по Cycles” :)

comments powered by HyperComments

О сайте

На данном сайте Вы сможете найти множество уроков и материалов по графическому
редактору Blender.

Контакты

Для связи с администрацией сайта Вы можете воспользоваться следующими контактами:

Email:
info@blender3d.com.ua

Следите за нами

Подписывайтесь на наши страницы в социальных сетях.

На сайте Blender3D собрано огромное количество уроков по программе трехмерного моделирования Blender. Обучающие материалы представлены как в формате видеоуроков, так и в текстовом виде. Здесь затронуты все аспекты, связанные с Blender, начиная от моделирования и заканчивая созданием игр с применением языка программирования Python.

Помимо уроков по Blender, Вы сможете найти готовые 3D-модели и архивы высококачественных текстур. Сайт регулярно пополняется новым контентом и следит за развитием Blender.