РАБОТА ТРАССИРОВЩИКА ПУТИ В ДВИЖКАХ ВИЗУАЛИЗАЦИИ ТРЁХМЕРНОЙ ГРАФИКИ

Введение

Движок визуализации трёхмерной графики или движок рендеринга выступает в качестве дополнения для программ разработки трёхмерной графики. Данные движки предназначены для создания изображения на основе трёхмерной сцены с использованием метода трассировки лучей с упором на интерактивность и простоту использования. Для материалов используется система узлов, с помощью которой можно создавать фотореалистичные материалы любой сложности. Большими преимуществами движка являются возможность быстрого просмотра результата непосредственно в окне 3D-вида, а также рендеринг с помощью графической карты (GPU) или процессора (CPU).

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

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

Терминология технологии визуализации

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

• BSDF (bidirectional scattering distribution function) — функция распределения двунаправленного рассеивания. Является наиболее общей функцией. Содержит в себе функции BRDF и BTDF.

• BSSRDF (bidirectional scattering-surface reflectance distribution function) — функция распределения двунаправленного рассеивания поверхности отражения. BSSRDF описывает, как свет перемещается между любыми двумя лучами, которые попали на поверхность. В случае с Cycles на данный момент используется лишь в шейдере Subsurface Scattering.

• BRDF (bidirectional reflectance distribution function) — функция распределения двунаправленного отражения. Представляет собой упрощенную BSSRDF, при условии, что свет отражается от поверхности в точке падения.

• BTDF (bidirectional transmittance distribution function) — функция распределения двунаправленного пропускания. Работает также, как и BRDF с той разницей, что луч выходит с противоположной стороны поверхности.

 2

Рисунок 1. – Поведение луча при использовании главных функций

Средства определяющие внешний вид объекта

Шейдеры определяют то, как будет взаимодействовать свет с мешем. Один или несколько шейдеров могут указать лучу отразиться от поверхности, пройти сквозь нее или поглотиться ею. Исключением является шейдер Emission, который управляет тем, как свет излучается из меша.

Материалы определяют внешний вид мешей. С их помощью можно влиять на внешний вид поверхности (surface), на внутренний объем поверхности (volume) и на смещение поверхности (displacement).

1

Рисунок 2. – Части воздействия света

Surface

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

Volume

Если луч не отразился и не поглотился на поверхности объекта, он попадает внутрь меша и проходит прямиком к обратной его стороне. В случае наличия шейдера объема будет описано взаимодействие света с объемом. Свет может рассеиваться, поглощаться или излучаться в любой точке объема. Поверхностные шейдеры и шейдеры объема могут быть объединены в одном материале. Это может быть полезно для таких материалов, как стекло, вода или лед, потому как вам необходимо контролировать поведение луча как на поверхности этих объектов, так и внутри них.

Displacement

Сама форма объектов может быть изменена с помощью материалов. Таким образом, текстуры могут быть использованы для того, чтобы сделать поверхность меша более детализированной. В зависимости от настроек, смещение может быть виртуальным (bump), при котором поверхность остается неизменной, а изменяется лишь направление нормалей, чтобы создать впечатление смещения. Также смещение может быть реальным (как при использовании модификатора displacement), или комбинированным: bump + displacement.

Контроль количества отскоков луча

Максимальное количество отскоков луча света можно контролировать. В идеале их должно быть очень много, но на практике мы не можем дожидаться рендеринга сцены бесконечно, поэтому приходится добиваться приемлемых результатов с ограниченным числом отскоков луча. Мы можем регулировать индивидуально количество отскоков для различных типов лучей: diffuse, glossy и transmission.

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

Основными источниками шума в сцене являются отражающая и преломляющая каустики. Их вы также можете отключить по желанию, в ущерб реалистичности изображения.

Сохранение энергии

Движок визуализации создан с учетом физических свойств объектов (к сожалению, не всех). Благодаря этому, значительно проще добиваться реалистичных результатов и сбалансированного освещения. Но есть несколько моментов, которые вы всегда должны держать в голове. Для того, чтобы материал выглядел реалистично с использованием глобального освещения, он должен следовать правилу сохранения энергии. Это правило гласит, что объект не может отразить больше света, чем на него попало.

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

Работа трассировщика пути

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

tracer_1_1

Рисунок 3. – Установка сэмлов пиксельного изображения

 

tracer_1_2

Рисунок 4. – Луч, вышедший из камеры

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

Попадая на стеклянную поверхность, луч решает по какому пути ему пойти дальше.

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

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

tracer_1_6

Рисунок 5. – Три пикселя с хранящимися значениями интенсивности

 

tracer_1_7

Рисунок 6. – Хранящиеся значения интенсивности

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

tracer_1_8

Рисунок 7. – Возможные варианты направления луча после каждого отскока

Выводы

Подведем итоги данной работы. Процесс, показанный выще, это упрощенная версия того, что движок делает в реальности. На самом деле во время каждого отскока создается еще один новый луч. Хитрость состоит в том, что программа заранее знает, где находятся источники света. Поэтому при попадании на поверхность, она в первую очередь создает луч в направлении к случайному источнику света. Этот процесс называется Light Sampling, а лучи — Shadow rays. Теневые лучи (shadow rays) либо находят путь к источнику света, либо блокируются другими объектами. В первом случае количество света от этого источника сохраняется. Затем движок случайным образом выбирает шейдер поверхности, на которую попал луч. Этот процесс называется "оценка шейдеров". Следующим шагом движок определяет в каком направлении луч пойдет дальше. Он случайным образом выберет одно из возможных направлений для данного шейдера. Этот процесс называется "выборка шейдеров". Луч продолжит свой путь в новом направлении.

Так в чем разница между "оценкой шейдеров" и "выборкой шейдеров"? Выборка используется для выбора нового направления луча, в зависимости от типа шейдера. Оценка же означает, что вы уже смотрите в определенном направлении и спрашиваете шейдер, насколько вероятно, что луч отразится в этом же направлении.

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

Camera — луч, вышедший из камеры. Reflection — луч, сгенерированный в результате отражения от поверхности. Transmission — луч, сгенерированный в результате прохождения сквозь поверхность. Shadow — луч, используемый для создания теней.

В свою очередь лучи Reflection и Transmission могут иметь следующие свойства:

Diffuse — луч, сгенерированный в результате диффузного отражения или прохождения сквозь полупрозрачный объект. Glossy — луч, сгенерированный в результате зеркального отражения или прохождения сквозь полупрозрачный объект. Singular — луч, сгенерированный в результате отражения от идеального зеркала (sharp glossy) или прохождения сквозь полупрозрачный объект.

Использованные источники:

1. Алямовский, А.А. SolidWorks 2007/2008. Компьютерное моделирование в инженерной практике / А.А. Алямовский. - М.: СПб: БХВ-Петербург, 2008. - 192 c.

2. Архипов, Г. И. Теория кратных тригонометрических сумм / Карацуба А. А., Чубариков В. Н. - М.: Наука. Гл. ред. физ.-мат. лит., 1987. – 368 с.

3. Аверин Г.В. Системодинамика: наука о закономерностях процессов изменения и развития систем во времени. – Palmarium Academic Publishing, 2014. – 488 с.

4. Лоу, А. М. Имитационное моделирование. Классика CS / Лоу, А. М., Кельтон, В. Дэвид. - М.: СПб: Питер, 2004. - 848 c

5. Прахов, А. Blender. 3D-моделирование и анимация. Руководство для начинающих / А. Прахов. - М.: БХВ-Петербург, 2009. - 272 c.

6. Falk G. Die Rolle der Axiomatik in der Physik, erlautert am Beispiel der Termodynamik // Die naturwissenschaften, 46, 1959, no. 16: 480–486.

7. Лазарев, А.И. Информация и безопасность. Композиционная технология информационного моделирования сложных объектов принятия решений / Лазарев, А. И. - М.: Московский городской центр научно-технической информации, 1997. - 336 c.

8. Чехлов, Дмитрий Визуализация в Autodesk Maya. Mental ray renderer / Дмитрий Чехлов. - М.: ДМК Пресс, 2016. - 696 c.

9. Hokr, B.H. Modeling focusing Gaussian beams in a turbid medium with Monte Carlo simulations / B.H. Hokr, J.N. Bixler, G. Elpers, B. Zollars, R.J. Thomas, V.V. Yakovlev, M.O. Scully // Optics Express. - 2015. -Vol. 23(7). - P. 8699-8705

10. Кравченко, С.В. Расчёт осесимметричных оптических элементов с двумя асферическими поверхностями для формирования заданных распределений освещённости / С.В. Кравченко, М.А. Моисеев, Л.Л. Досколович, Н.Л. Казанский // Компьютерная оптика. - 2011. - Т. 35, № 4. -С. 467-472.

11. Havran, V. Heuristic ray shooting algorithms / V. Havran // Faculty of Electrical Engineering, Czech Technical University - 2000.

12. Wald, I. On building fast kd-trees for ray tracing, and on doing that in O (N log N) / I. Wald, V. Havran // Interactive Ray Tracing. - 2006. - P. 61-69.

13. Rineau, L. A generic software design for Delaunay refinement meshing / L. Rineau, M. Yvinec // Computational Geometry. - 2007. - Vol. 38(1). - P. 100-110.

14. Hokr BH, Bixler JN, Elpers G, Zollars B, Thomas RJ, Yakovlev VV, Scully MO. Modeling focusing Gaussian beams in a turbid medium with Monte Carlo simulations. Optics Express 2015; 23(7): 8699-705.

15. Gunther J, Popov S, Seidel HP, Slusallek P. Realtime Ray Tracing on GPU with BVH-based Packet Traversal. Proceedings of the IEEE Symposium on Interactive Ray Tracing 2007; 1: 113-8.