«Оскар» для Intel Embree – трассируем лучи славы

Как программисту получить самую известную и престижную кинопремию «Оскар»? Ударным трудом (по клавишам) заработать денег; пойти учиться на актёра, режиссера, оператора и так далее по списку номинаций Американской киноакадемии; и, наконец, поучаствовать в создании фильма, соответствующего новым правилам премии. Но есть и более короткий путь — достаточно просто хорошо поработать над проектом оптимизированной библиотеки ядер трассировки лучей Intel Embree, который в феврале 2021 года получил «Оскар» в номинации «Научные и технические достижения для киноиндустрии». Под катом — рассказ про этот оскароносный проект Intel.

fdrvj4o2kucesh5hup56vmm4dcc.jpeg

«Оскары» бывают разные


Премия Американской академии кинематографических искусств и наук, более известная как «Оскар», за долгие годы своего существования стала настолько известной, что даже далекие от кино люди наверняка смогут назвать несколько её номинаций — например, «Лучший фильм года», «Лучшая женская роль» и «Лучшая мужская роль». А те, для кого кино является важнейшим из искусств, с легкостью перечислят все 24 основные номинации кинопремии и их лауреатов за последние десять лет. Но даже эти знатоки, скорее всего, затруднятся назвать шесть специальных номинаций, также ежегодно вручаемых киноакадемией. Их обладатели определяются созданным для этой цели комитетом и награждаются вне основной церемонии, но не менее торжественно.

Из этих шести номинаций нас интересует одна — за «Научные и технические достижения», c 1931 года присуждаемая компаниям и отдельным лицам, чьи открытия и инновации внесли существенный и долговременный вклад в киноиндустрию. Так называемый «технический Оскар» в разные годы вручался например, основателю Pixar Эдвину Кэтмаллу (Edwin «Ed» Catmull) — за технологию рендеринга 3D-изображений RenderMan, а также дважды (!) инженеру Анатолию Кокушу за создание гиперстабилизированных операторских кранов, которые использовались при съемках во многих фильмах от «Форсажа» до «Гарри Поттера».

Среди компаний в разные годы награды в этой номинации получали уже упомянутый Pixar, Kodak, студия 20th century Fox, а также IMAX и Fuji. В 1991 году премию получил Научно-исследовательский кинофотоинститут (НИКФИ) за работы в области стереоскопического кинематографа. А в 93-ем сезоне премии лауреатами стали авторы Intel Embree — высокопроизводительной библиотеки ядер трассировки лучей. Конкретнее — пять ведущих разработчиков Embree: Свен Уп (Sven Woop), Карстен Бентин (Carsten Benthin), Аттила Афра (Attila Afra), Манфред Ернст (Manfred Ernst) и Инго Вальд (Ingo Wald), а также Джим Джефферс (Jim Jeffers) — руководитель подразделения Intel Advanced Rendering & Visualization.

В настоящее время Embree интегрирована в такие широко используемые киностудиями продукты для создания реалистичного 3D-контента, как Blender, V-Ray, MoonRay (собственная разработка DreamWorks Animation), Corona Render и Maxon Cinema 4D. А в список вышедших фильмов, использующих графику, сгенерированную с помощью Intel Embree, входят «Бамблби», «Как приручить дракона», «Лего Бэтмен», «Кролик Питер», «Тайная жизнь домашних животных 2», «Тролли» и многие другие.

yzkmvl4t0tlnvdp1wxkk-qx_aps.jpeg
Ко всем этим мультфильмам приложила свои лучи Intel Embree

После долгого вступления, наконец, пора пояснить каждое слово в выражении «высокопроизводительная библиотека ядер трассировки лучей» и добавить много другой информации об Embree.

Немного казино в жизни лучей


Хотя кинопроизводство и называют «фабрикой грёз», но на самом деле оно стремится к производству максимально реалистичных сцен — в случае компьютерной графики они должны быть неотличимы от реальной фотографии (даже если в кадре дракон борется с монстром). Для этого необходимо не только создать качественную трёхмерную сцену, но и отрисовать её, используя симуляцию физически точной модели распространения света — со всеми тенями, отражениями, преломлениями и рассеяниями.

И лучший метод для решения этой задачи — трассировка лучей методом Монте-Карло (Monte Carlo ray tracing). Это алгоритм, который отслеживает (трассирует) пути миллиардов лучей света в процессе отражения их от поверхностей сцены. В точках отражения, то есть пересечения лучей с поверхностями, и происходит перерасчёт их освещенности в соответствии с материалом поверхности, чьи свойства задаются для каждого объекта сцены при помощи специальной функции BRDF (Bidirectional Reflectance Distribution Function). А нахождением точек пересечения лучей с поверхностями занимаются компоненты, называемые «ядрами трассировки лучей». Ядра являются самой вычислительно затратной частью рендеринга изображения.

Как можно догадаться из названия метода «Монте-Карло», его ключевая концепция — это случайный выбор большого количества возможных по законам физики световых путей для каждого пикселя с последующим усреднением их вклада в результирующий цвет. Световой путь соединяет точку (пиксель) на плоскости изображения с источником света. Честно говоря, выбор световых путей не совсем случаен. Предпочтение отдается выбранным специальным алгоритмом путям, дающим максимум информации о данной сцене.

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

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

Разновидностей трассировки лучей методом Монте-Карло существует несколько. Embree использует трассировку пути (path tracing), то есть, отслеживание лучей от конечной точки — плоскости изображения (её еще иногда называют «камерой») к исходной — источникам света, а не наоборот. И еще очень важный нюанс: реализованный в Embree метод Монте-Карло использует так называемые некогерентные (incoherent) лучи. Этот термин отличается от физического, и относится только к геометрии — некогерентные лучи не исходят из одной точки и распространяются в произвольных, не выделенных направлениях.

urreebasq7eji95pj2fvegsz56m.jpeg
На рисунке слева — один из вариантов когерентных лучей, справа — нет

Это — ключевое отличие метода Монте-Карло от метода «трассировки лучей в реальном времени», в последнем лучи по всему своему пути остаются когерентными, соответственно могут быть легко обработаны «в одном пакете», что и обеспечивает высокую производительность метода. Но платой за это являются ограничения качества получаемого изображения — в нём возможен расчёт только теней с резкой границей, простых зеркальных отражений и преломления. Более сложные эффекты, присутствующие в реальном мире, например, такие как диффузные рассеяния, в этом случае не учитываются. В первой версии Embree был реализован только метод Монте-Карло, но позже в состав библиотеки были добавлены также и функции для работы с когерентными лучами.

BVH: всё то же, но еще быстрее


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

image-loader.svg
Это фотореалистичное изображение сгенерировано Intel Embree

Если решать задачу нахождения точек пересечения лучей с поверхностями полным перебором — то есть, проверяя пересечение каждого луча с каждым треугольником, то результата решения можно не дождаться. Поэтому в технологиях трассировки лучей для ускорения обычно применяется другой подход. А именно, треугольники сцены организуются в зависимости от своего расположения в пространстве в иерархические структуры, которые впоследствии и обходят ядра трассировки лучей, выполняя реальный поиск только среди достаточно небольшого множества «кандидатов» на наличие пересечений. Самая популярная из таких структур называется Иерархия Ограничивающих Объемов (bounding volume hierarchy, BVH).

BVH организует треугольники сцены в иерархию «коробок», ограничивающих определенную часть треугольников. На каждом уровне иерархии треугольники по одной из координат разделяются на две или более частей — «коробок», и так продолжается до достижения определенного предела.

image-loader.svg
Принцип BVH, поясняющая картинка из wikipedia

image-loader.svg
BVH на практике: визуализация реального объекта

В Embree в большинстве случаев коэффициент разделения равен четырём (BVH4). В результате использования BVH для каждого луча определение пересечения с поверхностью сводится к нескольким десяткам проверок на пересечение с «коробками» и всего нескольким проверкам на пересечение с треугольниками.

Ускоряем ускорение — аппаратные оптимизации


Создание ускоряющих структур — это само по себе дело не быстрое, поэтому в Embree оно оптимизировано — также, как и работа самих ядер трассировки лучей. А именно, построение BVH распараллелено и использует векторные процессорные инструкции.

Если же говорить про оптимизацию самого процесса трассировки лучей, то с распараллеливанием всё понятно — лучи независимы друг от друга, соответственно, разделение изображения на фрагменты с последующей обработкой лучей, исходящих из этих фрагментов на отдельных процессорных ядрах даёт почти линейный рост производительности с увеличением числа ядер CPU.

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

В случае некогерентных лучей так сделать нельзя — если вы вернетесь к рисунку выше, то увидите, насколько сильно расходятся пути лучей, требуя отдельной обработки. К счастью, эффективная стратегия векторизации была найдена и для этого случая. Вместо группировки лучей в векторные регистры группируются элементы ускоряющих структур. То есть, например, для BVH4 в векторные регистры помещаются данные (размеры) четырех ограничивающих объемов, после чего пересечение луча со всеми ними вычисляется параллельно. Подобная схема может быть применена и для расчета пересечения луча с треугольниками внутри ограничивающего объема.

На этом месте скептики могут спросить: «А зачем вообще делать трассировку лучей на CPU? Возможно, на GPU она будет работать лучше?» Причин для решения создать библиотеку ядер трассировки лучей именно на CPU несколько. Во-первых, учёт пожеланий конечных потребителей — в данном случае, студий-создателей графики. Одно из их пожеланий — независимость от железа, то есть, возможность запускать отрисовку создаваемого ими контента в любом облаке, фактически, на любом железе, а эта история уже совсем не про GPU. Во-вторых, доступный объём оперативной памяти на CPU обычно превосходит встроенную память видеокарт. Поэтому при отрисовке сложных сцен, занимающих большой объём памяти, CPU будет выигрывать.

И, наконец, очень показательные данные, сравнивающие производительность отрисовки различных сцен на Intel Embree/Xeon и NVIDIA/OptiX. Ни на одной сцене производительность GPU даже не приблизилась к программной реализации Embree.

dzmkuxukcsyqyjuwcm5p10lzqum.jpeg
Сравнительные результаты тестирования Intel Embree

Данные взяты из презентации Embree на конференции SIGGRAHP 2018, и являются, к сожалению, самыми свежими из публичных. Но зато публично и совершенно бесплатно доступна как сама Ebmree, как и показанные на диаграмме тестовые сцены, так что все желающие могут провести соответствующие тесты сами.

Что же такое Embree?


Embree появилась в 2010 году как небольшой исследовательский проект внутри подразделения Intel Lab. В ноябре 2011 года вышла первая публичная версия Embree 1.0, а на момент написания этой статьи доступна версия 3.13. С момента появления Embree является продуктом с открытым кодом, выпускаемым под лицензией Apache 2.0.

image
Embree — урожай созрел!

Как уже было сказано, Embree — не конечный продукт, а библиотека функций, которые можно использовать в составе различных приложений. Библиотека включает в себя оптимизированные функции для:

  • построения BVH;
  • обработки как отдельных когерентных и некогерентных лучей, так и световых пакетов и потоков (в первых может быть исключительно 4, 8 или 16 лучей, а во вторых — произвольное количество). Для них Embree может находить ближайшее и вообще любое пересечение с объектами сцены;
  • сглаживания поверхностей дополнительным разбиением сетки (Алгоритм Катмулла — Кларка);
  • генерации сложного размытия движения (multi segment motion blur);
  • дублирования геометрии объектов сцены (instancing).

image
Сложное размытие движения — лучше один раз увидеть

Embree поддерживает 3D-объекты не только с треугольной сеткой, но и c четырехугольной и регулярной сеткой-решёткой (grid mesh); различные типы кривых, с помощью которых можно моделировать волосы, мех и т.п.;, а также определенный пользователем тип геометрии: сферы, диски и так далее.

image-loader.svg
Котиков Embree тоже любит! Генерация шерсти

Embree — полностью кросс-платформенный продукт, она работает не только на x86 процессорах, но с версии 3.13 и на Apple M1, то есть на ARM!

Embree можно скомпилировать для Windows (32 и 64 битной версии), Linux (64 битный), и macOS (64-битный), используя компиляторы Microsoft, Intel, GCC и Clang. Для распараллеливания Embree используется библиотека Intel Threading Building Blocks (TBB), а для векторизации — intrinsic функции, поддерживающие векторные инструкции от SSE2 до AVX512 на x86 и NEON на ARM платформах.

Скачать исходный код Embree можно в репозитории на github, а множество дополнительных материалов — от примеров созданных с помощью Embree изображений до различных статей и презентаций — на отдельном сайте Embree. Кроме этого, Embree является важной составной частью oneAPI toolkit.

Что можно делать с Embree?


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


image-loader.svg
Intel Embree inside

И, наконец, участвовать в развитии Embree в качестве разработчика и ожидать благодарности от всего сообщества создателей компьютерной графики, а также — своего «Оскара». Тем более, что никаких специальных требований американской киноакадемии в номинации «Научные и технические достижения для киноиндустрии» нет.

© Habrahabr.ru