Трассировка лучей в реальном времени в UE4 - Часть 1: эволюция
Впервые объявленная на GDC в марте 2018 года трассировка лучей в реальном времени (real-time ray tracing) в Unreal Engine прошла долгий и тернистый путь в 18 месяцев и продолжает изменяться. В этом обзоре мы постараемся посмотреть на путешествие от прототипа до доступной к использованию, проверенной в боях фичи, на ее эволюцию, и на то, с чем еще предстоит столкнуться при использовании данной технологии.
Для начала, что такое трассировка лучей?
Давайте быстро разберемся в определении понятия трассировки лучей. В общих чертах опишем, чем она отличается от растеризации (rasterization) — методе рендеринга, который традиционно применялся в игровых движках до появления метода трассировки.
Трассировка лучей (Ray tracing) — это метод определения цвета каждого пикселя изображения в финальном рендере за счет отслеживания всех отскоков лучей света в сцене с собиранием цветов объектов, от которых отражаются лучи, относительно камеры. Ввиду того, что подобный метод симулирует поведение физического света (фотонов), в итоговом результате будет гораздо более фотореалистичная картинка (с учетом отражений объектов за границами экрана и мягких детализированных теней) в отличие от метода растеризации.
Растеризация (Rasterization) — устоявшийся метод, при котором отрисовываются объекты в сцене от дальнего плана к переднему, отображая 3D объекты в 2D плоскости за счет трансформации матриц. Это определяет цвет каждого пикселя, основываясь на информации (цвет, текстура, нормаль), хранящийся в меш-объектах и комбинируется с освещением в сцене. Данный метод гораздо производительнее и быстрее, чем трассировка лучей, но он не может воспроизвести эффекты, основанные на отраженном свете, такие как реальное отражение, прозрачность и окклюзия окружающей среды (ambient occlusion).
Катализатор технологии
Трассировка лучей использовалась в индустрии кинопроизводства десятилетиями для достижения максимально реалистичного изображения. Но до последнего времени просчет трассировки лучей для одного кадра с пригодным для кинотеатров разрешением мог занимать несколько часов. Было сложно представить, что можно рендерить трассировку лучей 24 кадра в секунду (24 fps) и выше.
Затем появились две конкурирующие, изменившие наше представления о игровой графике технологии: DXR (DirectX Raytracing) фрэймворк от Microsoft и RTX платформа от NVIDIA. Сотрудничая с NVIDIA и ILMxLAB, Epic Games смогла представить общественности трассировку лучей в реальном времени впервые на GDC 2018 с невероятным техно-демо "Reflections" ("Отражения"), в котором использовались персонажи из Star Wars: The Last Jedi.
Были продемонстрированы текстурированные источники освещения типа Area lights (источник света данного типа светит во всех направлениях на одной стороне прямоугольной области плоскости), мягкие тени от них, честные отражения, окклюзия окружающей среды, кинематографичная глубина резкости (depth of field) и NVIDIA GameWorks ray tracing denoising (шумоподавление), и всё это — в реальном времени и за счет просчета трассировки лучей.
А из-за гибридного подхода к рендеру в Unreal Engine проходы просчетов кадра, которые не нуждаются в трассировке лучей, по-прежнему растеризуются, что повышает общую производительность.
Это было начало. Прототип кода Unreal Engine ещё не был доступен для пользователей; для запуска демонстрации в реальном времени требовался NVIDIA DGX с четырьмя графическими процессорами Tesla V100 ценой в районе 100 000 долларов. Поэтому ни программное обеспечение, ни оборудование нельзя было назвать доступным для среднестатистического пользователя.
Демократизация трассировки лучей в реальном времени
Спустя всего 5 месяцев, на SIGGRAPH 2018, снова с NVIDIA, но на сей раз с присоединившимися Porsche, Epic Games показала реал-тайм кинематографический трейлер "The Speed of Light" Porsche 911 Speedster Concept.
И по всем правилам закона Мура на это демо потребовалось две видео-карты NVIDIA Quadro RTX — все еще требующие крупных вложений, по 6 000 долларов каждая, но это все же значительно дешевле предыдущей конфигурации.
В "The Speed of Light" были показаны полупрозрачные и прозрачные шейдеры (translucent and clear coat shading models) и глобальное освещение (global illumination), основывающиеся на трассировке лучей. При этом при производстве синематика команда создала интерактивное демо, чтобы проиллюстрировать, что это реал-тайм сцена.
И вот уже в марте этого года, на GDC 2019, Epic Games была готова сделать функциональность трассировки лучей доступной в качестве бета-фичи в Unreal Engine версии 4.22. И чтобы показать, насколько технология продвинулась вперед за 12 месяцев, наши партнеры Goodbye Kansas и Deep Forest Films создали "Тролль" — реал-тайм кинематографический фильм с оцифрованным человеком.
"Тролль" на порядок сложнее "Отражений". При 24 fps в синематике "Тролль" — 62 миллиона треугольников, в "Reflections" — пять, 16 источников света против четырех в "Reflections", и полноценное разрешение FullHD 1080p против половинного с масштабированием. "Тролль" также использовал трассировку лучей для частиц и взаимодействия с другими компонентами кинематографического пайплайна Unreal Engine, такими как с кэшем геометрии Alembic, технологиями волос и шейдеров кожи. Несмотря на все это, "Тролль" был представлен на одном NVIDIA RTX 2080 Ti с текущей ценой 1 199 долларов.
На сегодняшний день бесплатная модель распространения Unreal Engine в купе с тем, что для покупки видеокарты не нужно грабить банк, делают технологию трассировки лучей в реальном времени доступной для всех.
Трассировка лучей в Unreal Engine 4.23
Epic Games работала над первоначальной реализацией трассировки лучей в то же самое время, когда Microsoft доделывала DXR framework, а NVIDIA работала над новым железом и драйверами. Более того, для поддержки трассировки пришлось произвести серьезный рефакторинг конвейера рендеринга (rendering pipeline). Оба этих фактора существенно влияли на нестабильность кода. Но уже в Unreal Engine 4.23, анонсированном на SIGGRAPH 2019, была проведена огромная работа над исправлениями ошибок.
Оптимизация и производительность также были сильно улучшены во многих элементах, таких как просчет неба (sky pass), глобальное освещение и шумоподавление (denoising). Оно, шумоподавление, в свою очередь, является критичной для трассировки в режиме реального времени из-за крайне малого количества самих лучей (чем больше лучей, тем ниже скорость рендеринга из-за увеличения количества просчетов отскоков).
Также были реализованы шейдеры пересечений (intersection shaders), позволяющие вам использовать собственные типы примитивов и отображать сложные геометрические объекты, такие как волосы или фракталы. Была начата работа по поддержке множественных GPU; низкоуровневый доступ, добавленный в 4.23, теперь позволяет контролировать, какой GPU будет выполнять каждый конкретный проход. И Epic Games продолжает поддерживать дополнительные шейдеры и типы геометрии, включая геометрию ландшафтов, инстанцирование мешей (instanced static meshes), процедурные меши (procedural meshes) и спрайтовую систему частиц Niagara.
Что ждет трассировку лучей в UE4 в будущем
И это, конечно, только начало. Epic Games неустанно работает над улучшением имплементации технологии в движок. И хоть в 4.23 команда добилась больших успехов в производительности и стабильности системы, еще предстоит проделать огромную работу, прежде чем фича будет "официально готова". С другой стороны, многие пользователи движка уже с радостью пользуются бета-функциональностью фичи и "Эпиков" это только радует, ведь они проводят стресс-тестирование кода (как и внутренняя команда кинематографистов Fortnite, которая сейчас активно имплементирует технологию трассировки лучей).
Выше в тексте упоминалось, что была добавлена возможность низкоуровневого доступа к GPU и мультипроцессорность в 4.23, на данный момент Epic Games стремится сделать эту функциональность отполированной и "под ключ". Также будет добавляться поддержка различных типов геометрии; одним из наиболее сложных, в качестве примера, можно назвать фолиаж со смещением по мировым координатам (foliage with world position offset) — для игрока это будет выглядеть, как красивые анимированные листья деревьев, колышущиеся на ветру.
Если вам интересно глубже погрузится в результаты работы, заглядывайте в Tech Talk с конференции SIGGRAPH 2019.
Epic Games выражает искреннюю благодарность всем, кто уже опробовал трассировку лучей в реальном времени в Unreal Engine и активно присылает свои ценные отзывы. Если вы еще не взяли его на тест-драйв, почему бы не загрузить последнюю версию Unreal Engine сегодня? Мы с нетерпением ждем ваших отзывов в комментариях.