![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0001.jpg)
Q2VKPT — это первая играбельная игра с полным рейтрейсингом, эффективно симулирующая полностью динамическое освещение в реальном времени с помощью тех же современных технологий, которые используются в киноиндустрии (см. Disney's practical guide to path tracing).
Недавний выпуск моделей GPU с функциями трассировки лучей (raytracing) открыл абсолютно новые возможности для будущего игровой графики, однако правильное использование рейтрейсинга — нетривиальная задача. В то время, как некоторые разработчики игр начали исследовать открывающиеся возможности в рендеринге теней и отражений, Q2VKPT стал первым проектом, реализовавшим эффективное общее решение для всех видов переноса света: прямого, рассеянного и отражённого освещения (см. раздел «Медиа»). В киноиндустрии такая унификация привела к значительному улучшению гибкости и продуктивности. Существует вероятность, что подобное развитие технологий в играх обещает схожее улучшение визуальной точности и реализма графики в течение ближайших нескольких лет. Этот проект должен служить подтверждением концепции для области исследований компьютерной графики и игровой индустрии; к тому же он позволяет фанатам игр взглянуть на потенциальное будущее игровой графики. Кроме использования аппаратно ускоряемого рейтрейсинга, Q2VKPT в основном обеспечивает свою эффективность благодаря технике адаптивной фильтрации изображения, которая интеллектуальным образом отслеживает изменения в освещённости сцены, чтобы повторно использовать как можно больше информации из предыдущих вычислений.
О проекте
Проект выпущен как open source на GitHub. Он интегрирует наш трассировщик лучей Vulkan в клиент Q2PRO. Проект возник из-за необходимости в исследованиях компьютерной графики быстро работающего тестового контента. Он мотивирован первыми интригующими результатами рендерера трассировки пути, написанного в 2016 году.
История
VKPT и Q2VKPT были созданы как хобби-проект Кристофом Шидом (Christoph Schied) для проверки результатов исследований компьютерной графики в настоящей игре. В данный момент проект включает в себя 12 тысяч строк кода и полностью заменяет оригинальный графический код Quake II. Изначально его прототип был написан на OpenGL с участием Иоганнеса Ханика (Johannes Hanika) (экспериментальный рейтрейсинг, шейдеры, исправления GL/Vulkan), Аддисом Диттебрандтом (иерархия освещения, визуализация отладки), Тобиасом Цирром (Tobias Zirr) (сэмплирование освещения, руководство хакингом, веб-сайт, информационные тексты) и Флорианом Райболдом (первоначальная иерархия освещения). Дополнительную помощь оказывали Стефан Бергманн, Эмануэль Шраде, Алиса Юнг и Кристоф Петерс (немного шума).
Скачиваемые материалы
- Репозиторий Github
- Двоичный файл Windows на Github
- Quake 2 Demo (для игры в q2vkpt нужны файлы .pak из демо или полной версии игры)
Видео
Неудачные кадры в разработке: видео с глитчами 1, видео с глитчами 2.
Скриншоты
Советуем посмотреть видео или самим сыграть в игру, потому что полностью динамическое освещение гораздо лучше ощущается в движении.
Полностью динамическое глобальное освещение, созданное с помощью трассировки лучей. Тени созданы трассировкой лучей, добавлены глянцевые отражения и один этап отражения непрямого освещения
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0002.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0003.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0004.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0005.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0006.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0007.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0008.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0009.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0002.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0003.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0004.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0005.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0006.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0007.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0008.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0009.jpg)
![](http://brechpunkt.de/q2vkpt/images/q2vkpt_0010.jpg)
![](https://habrastorage.org/webt/dg/dq/9r/dgdq9rnapdtqhqzu0ybhoilxbh0.png)
Вывод трассировщика пути (слева) и применённый фильтр снижения шума (справа)
Сравнение скриншотов
![](http://brechpunkt.de/q2vkpt/images/denoised_720p.png)
![](http://brechpunkt.de/q2vkpt/images/denoised_720p.png)
![](http://brechpunkt.de/q2vkpt/images/path_tracer_720p.png)
Технология
Q2VKPT реализован на Vulkan API, чтобы иметь возможность использования новых аппаратных функций рейтрейсинга, появившихся в прошлом году. Благодаря им игра может приблизиться к 60 FPS (2560x1440, RTX2080Ti) при полном рейтрейсинге и динамическом затенении с реалистичными моделями глобального освещения, вычисляемыми в реальном времени. Использование трассировки пути для полностью динамического освещения позволяет сильно повысить детализацию затенения игровых сцен, естественным образом создавая сложное взаимодействие резких и плавных теней, блестящие материалы и перспективно корректные отражения. Более того, свет может естественным образом распространяться повсюду, связывая сцены так, как это происходит в реальном мире. Традиционные решения с предварительно вычисленным освещением или грубыми растровыми аппроксимациями реального времени никогда не смогут достичь такой детализации при сравнимом разрешении, потому что весь объём информации об освещении превзойдёт любые пределы памяти.
Технические подробности
В Q2VKPT используется множество техник, позволяющих адаптировать к играм вычислительно затратные методы, которые раньше применялись только в киноиндустрии. Их ядром является адаптивный временной фильтр, который интеллектуальным образом повторно использует результаты вычислений предыдущих кадров (это предыдущий исследовательский проект Кристофа). Этот фильтр используется поверх уже широко распространённого временного сглаживания (temporal anti-aliasing) и расширяет процесс отслеживания временнЫх изменений из простого пространства изображения в высокоразмерное пространство путей распространения света. Отслеживание изменения путей необходимо, потому что трассировка пути — это рандомизированный алгоритм, что является его и сильной, и слабой сторонами: он может в обобщённом виде обрабатывать все виды распространения света, но чтобы результаты стали надёжными, может потребоваться долгое время, слишком долгое для одного кадра в игре реального времени. Простое решение в пространстве изображения (например temporal anti-aliasing) не может справиться с таким уровнем неопределённости.
Поверх временной фильтрации мы исследовали несколько техник нахождения источников освещения, влияющих на каждую поверхность в игре. Подбор правильных источников освещения критически важен для качества картинки, потому что при неверном выборе мы получим очень ненадёжные выходные данные трассировщика пути, что заставит временной фильтр удалить все красивые детали, которые должен был создать трассировщик пути. В первоначальном прототипе использовалась полная иерархия источников освещения, распространённая в киноиндустрии: разделяя источники освещения по иерархии, мы можем одновременно вычислить влияние нескольких источников, что позволяет быстро исключить из расчёта далёкие и слабые источники, а также источники, стоящие не в том направлении. Однако оказалось, что такие вычисления сложно сделать точными, а вычислительные затраты на обход иерархии сложно контролировать. Так как в оригинальном Quake II использовались множества потенциально видимых пространств (Potentially-Visible-Set) для отсечения невидимых частей сцены, мы решили обойтись извлечением из этих множеств списков потенциально видимых источников для каждой части сцены. В текущей версии мы реализовали частично точное вычисление влияния каждого источника в списке, случайным образом выбирая соответствующее подмножество этих списков в каждом кадре. Поэтому рендерер быстро находит все источники освещения, и мы можем выполнять все вычисления влияния освещения за управляемые, постоянные промежутки времени.
Вопросы и ответы
Почему у меня игра «вылетает»?
Мы занимаемся этим проектом в свободное время, поэтому нам не хватает сил на тщательный контроль качества. Пожалуйста, отправьте отчёт об ошибке в issue tracker нашего репозитория GitHub!
Почему нет частиц? Мне нужны мухи и искры из рейлгана!
К сожалению, нам не хватило времени на добавление в рейлган источников освещения. Что касается других частиц, то принятое нами решение выполнять рейтрейсинг всего слегка усложнило процесс рендеринга частиц. Если мы найдём время, то в будущем это исправим!
В наше время игры и так выглядят реалистичными! Зачем использовать трассировку пути?
Современные игры сильно расширили возможности традиционной, основанной на растеризации графики. Однако за эти усовершенствования приходится платить свою цену: движки рендеринга современных игр превратились в чрезвычайно запутанные наборы узконаправленных техник. Чтобы добиться приемлемой картинки без артефактов, освещение, тени и отражения необходимо по отдельности вычислять во многих разрешениях и масштабах. Трассировка пути и другие монте-карловские техники рендеринга позволяют найти выход из этой постоянно усложняющейся системы. На самом деле, они уже решили эту проблему в киноиндустрии. Наш прототип — это первый ответ на вопрос, как достичь этого в индустрии видеоигр.
Quake II — это древняя игра! Если бы у этих технологий было какое-то будущее, то сегодня он бы работал с частотой 6000 FPS!
Да, Quake II — это достаточно старая игра с довольно низкой сложностью геометрии, но основным ограничивающим фактором для трассировки пути не является рейтрейсинг или сложность геометрии. На самом деле текущий прототип может трассировать гораздо больше лучей без заметного снижения частоты кадров. Вычислительные затраты использованных в прототипе Q2VKPT техник в основном зависят от объёма вычислений (непрямого) рассеяния света и количества источников освещения. В Quake II изначально было много источников освещения, и в этом отношении он по-прежнему является достаточно современной игрой. Кроме того, количество событий рассеяния света не зависит от сложности сцены. Поэтому можно предположить, что использованные нами техники хорошо подойдут и для более современных игр.
Почему Quake II?
Потому что исходники Quake II выложены в открытый доступ, а сама игра имеет долгую историю моддинга. Это превосходная «песочница» для проверки научных исследований в реальном мире. В частности, игра обладает активным и состязательным геймплеем, что задаёт высокие требования к производительности и надёжности реализуемых техник рендеринга. И, наконец, Quake II в каком-то смысле до сих пор остаётся достаточно современной игрой, потому что он изначально был выпущен со сложным и художественным дизайном освещения.
Как можно использовать Q2VKPT в качестве бенчмарка?
Откройте консоль, нажав клавишу "~". В демо версии Quake 2 можно использовать команду «timedemo 1; demo q2demo1», в полной версии — команду «timedemo 1; demo demo1». Встроенный профилировщик запускается командой «vkpt_profiler 1». Он сообщает подробности о таймингах GPU для отдельных этапов рендеринга.
Чем трассировка пути отличается от трассировки лучей?
Трассировка пути — это элегантный алгоритм, способный симулировать множество сложных способов, которыми распространяется и рассеивается свет в виртуальных сценах. Его симуляция освещения на основе физики обеспечивает высококачественный рендеринг. Трассировка пути использует трассировку лучей для определения видимости между событиями рассеяния. Однако трассировка лучей — это просто примитивная операция, которую можно использовать для множества целей. Поэтому сама по себе трассировка лучей не способна создавать реалистичные изображения. Для этого можно использовать алгоритмы распространения света наподобие трассировки пути. Однако несмотря на то, что она элегантна и очень мощна, наивная трассировка пути очень затратна и для создания стабильных изображений требует много времени. В нашем проекте используется интеллектуальный адаптивный фильтр, который повторно использует максимально возможный объём информации в нескольких кадрах и пикселях, чтобы создавать надёжные и стабильные изображения.
Трассировка пути и трассировка лучей — будущее игровой графики?
Недавнее появление GPU с функциями трассировки лучей открыло совершенно новые возможности для будущего игровой графики, однако для правильного использования трассировки лучей требуется нетривиальный подход. Цель нашего проекта — выяснить, чего же не хватает для создания прямого пути в будущее графики с трассировкой лучей. Хотя некоторые проблемы уже решены в научных исследованиях, многие реальные проблемы остаются незаметными, пока не приступишь к реализации полного рендерера игры. В дальнейшем мы планируем изучить некоторые такие проблемы, например, более качественное сэмплирование освещение, улучшенная фильтрация и более целостная программная структура рендерера. Чтобы эти изменения стали широкомасштабными, необходимы хорошие решения новых, непривычных задач рендереров на основе трассировки лучей и пути.
Сможет ли трассировка пути наконец решить все проблемы графики?
Трассировка пути и схожие с ней методы элегантно решают множество сложных задач игровой графики. Однако их вероятностная природа добавляет целое множество новых задач, решение которых необходимо для создания чётких (бесшумных) изображений высокого качества. Метод фильтрации в прототипе Q2VKPT — это первый шаг к надёжным унифицированным методам, позволяющим реализовать в рендеринге полностью унифицированный подход грубого перебора с помощью трассировки пути. В ближайшие месяцы и годы мы ожидаем и надеемся увидеть другие исследования в этом направлении!
В Q2VKPT используются карты освещения из оригинала игры?
В оригинальном движке Quake 2 используются предварительно вычисленные карты освещения, содержащие мягкие тени и диффузное непрямое освещение. Q2VKPT полностью заменяет статическое освещение полностью динамической симуляцией, унифицирующей и статические, и динамические источники освещения.
Сколько лучей Q2VKPT испускает на пиксель?
Количество испускаемых лучей зависит от первой видимой поверхности. На непрозрачных поверхностях Q2VKPT использует для каждого пикселя по одному лучу для нахождения прямой и непрямой видимой поверхности. Кроме того, для обеих поверхностей Q2VKPT испускает по одному лучу к случайно выбранным источникам освещения. Поэтому Q2VKPT испускает для каждого пикселя не менее 4 лучей.
В Q2VKPT используется растеризация?
Традиционно для нахождения видимых из камеры поверхностей в играх используется растеризатор. В Q2VKPT визуализация полностью выполняется трассировкой лучей, поэтому растеризатор не используется (за исключением двухмерных элементов пользовательского интерфейса).