Разработка библиотеки для портирования приложений с трехмерной графикой, использующих конвейер фиксированной функциональности, на метод трассировки путей
Введение 4
1. Постановка задачи 7
2. Обзор 8
2.1. Предметная область 8
2.2. Существующие решения 15
2.3. Используемые технологии 16
3. Архитектура 17
3.1. Интерфейс библиотеки 17
3.2. Структура компонент библиотеки 23
4. Реализация библиотеки 25
4.1. Обработка данных для отрисовки 25
4.2. Инструменты разработки 31
4.3. Отрисовка 33
5. Апробация библиотеки 46
5.1. Геометрия 47
5.2. Логика отрисовки 48
5.3. Портирование на x64 50
Заключение 52
Список литературы 53
Одной из главных проблем компьютерной графики является отрисовка трехмерных сцен, то есть набора трехмерных объектов, их свойств, источников света и камеры, с точки зрения которой и производится от- рисовка сцены. При этом в интерактивных приложениях необходимо поддерживать высокую частоту смены кадров: чем плавнее анимированное изображение, тем легче пользователю его воспринимать.
С начала 90-х годов XX века самым распространённым методом решения этой проблемы является растеризация — преобразование трех-мерных объектов, представленных в виде набора треугольников, в пик-сели на экране (рис. 1). Этот метод наиболее популярен из-за высокой производительности и гибкости. Тем не менее, растеризация имеет недостатки: для создания реалистичного освещения необходимо ис-пользовать большое количество различных техник для каждой отдельной ситуации в трехмерной сцене.
Графическим конвейером называют последовательность операций над трехмерными объектами и их свойствами, которые необходимы для отрисовки трехмерных сцен. Различают два вида графического конвейера для растеризации: фиксированной функциональности и шейдерный. Они отличаются тем, что шейдерный контейнер даёт разработчикам возможность переделывать/вставлять отдельные части с помощью программ, запускаемых на видеокарте — шейдеров. Конвейер фиксированной функциональности позволяет настраивать только определенные параметры, например, вершины треугольников, которые обрабатываются только одним заданным способом, а в шейдерном конвейере для этого необходимо реализовать программу, что позволяет задавать практически любую логику для обработки вершин на графическом процессоре: скелетная анимация, системы частиц и др.
Рис. 2: При трассировке производится обход пикселей буфера кадра и запуск лучей в сцену из них.
Наряду с растеризацией, имеется метод трассировки лучей, который позволяет рассматривать расчёт освещения в трехмерной сцене более обобщенно, чем при растеризации. Трассировка лучей отличается от растеризации тем, что вместо последовательной отрисовки каждого от-дельного объекта, в сцену испускаются лучи от камеры, и в зависимости от того, в какой объект попал луч, окрашивается пиксель (рис. 2). При этом разработчики самостоятельно задают логику взаимодействия лучей и объектов — следует ли лучу отразиться, преломиться и т.д. Взаимодействуя с разными поверхностями, луч строит некоторый путь, и если в каждой точке пересечения луча и сцены вычислять уравнение отрисовки (rendering equation) [9], то такой метод называется трассировкой путей. Он позволяет создавать реалистичное освещение, тени и полутени, корректные отражения и др. Однако каждый запуск отдельного луча сопровождается высокой нагрузкой на видеокарту. Ситуация усугубляется тем, что на один пиксель необходимо запустить хотя бы несколько лучей, а на экранах пользователей таких пикселей — миллионы.
Из-за низкой производительности метод отрисовки лучей долгое время использовался только в системах, где нет жестких ограничений на время отрисовки одного кадра. Но с дальнейшим значительным увеличением мощностей пользовательских видеокарт и появлением графических процессоров NVIDIA Turing (2018 год) [30] данный метод стал доступен и для приложений с высокой частотой смены кадров.
Значительное различие между двумя концепциями — растеризацией и трассировкой путей, — а также высокая нагрузка на видеокарту во время расчета пересечений лучей, являются главными причинами сложности портирования приложений с одного метода на другой. Поэтому необходимо решение, которое позволяло бы автоматизировать перенос приложения с трехмерной графикой с растеризационного метода на трассировку путей. Главная мотивация такого портирования заключается в отрисовке более реалистичного и динамичного освещения, так как большинство целевых приложений используют такую технику, как карта теней, главным недостатком которой является статичность, то есть при изменении состояния сцены освещение в ней не меняется, на-пример, если объект сдвинулся, то его тень всё ещё будет в прежнем положении.
Создание такого решения для произвольных приложений трудоёмко, поэтому данная работа направлена на приложения, использующие фиксированный графический конвейер. Это связано с тем, что в такого типа конвейере, разработчикам даётся меньше свободы во взаимодействии с графическим процессором (в связи с архитектурой графических ускорителей в конце 90-х гг.), поэтому и в создаваемой библиотеке необходимо рассмотреть и реализовать значительно меньшее количество различных случаев, по сравнению с шейдерным конвейером.
В ходе данной работы были получены следующие результаты.
• Спроектированы интерфейс и архитектура библиотеки для отрисовки трехмерной графики с помощью трассировки лучей и выводом полученного изображения в графическое окно. Библиотека предназначена для приложений с конвейером фиксированной функциональности. Реализация произведена на языке Cd—и графическом API Vulkan.
• Реализована система для обработки геометрии, материалов и источников света в библиотеке.
• Реализована система отрисовки в библиотеке, позволяющая рассчитывать прямое и непрямое освещение посредством трассировки путей с минимальным количеством лучей, а также реализован алгоритм A-SVGF устранения шума для освещения. Реализована отрисовка полупрозрачных объектов с помощью растеризации.
• Проведена апробация с помощью реализации адаптера между библиотекой и целевым приложением, позволяющего использовать трассировку путей в видеоигре “Serious Sam: The First Encounter”.
[1] Alexey Panteleev Christoph Schied. Real-Time Path Tracing and Denoising in ’Quake 2’ (Presented by NVIDIA). — 2019. — Game Devel¬opers Conference. Access mode: https://www.gdcvault.com/play/1026185/.
[2] Blockwise multi-order feature regression for real-time path-tracing reconstruction / Matias Koskela, Kalle Immonen, Markku Makitalo и др. // ACM Transactions on Graphics (TOG). — 2019. — Т. 38, № 5. — С. 1-14.
[3] Edge-avoiding A-Trous wavelet transform for fast global illumination filtering / Holger Dammertz, Daniel Sewtz, Johannes Hanika, Hendrik PA Lensch // Proceedings of the Conference on High Performance Graphics / Citeseer. — 2010. — С. 67-75.
[4] Edge-avoiding A-Trous wavelet transform for fast global illumination filtering / Holger Dammertz, Daniel Sewtz, Johannes Hanika, Hendrik PA Lensch // Proceedings of the Conference on High Performance Graphics / Citeseer. — 2010. — С. 67-75.
[5] Haines Eric, Akenine-Moller Tomas. Ray Tracing Gems: High-Quality and Real-Time Rendering with DXR and Other APIs. — Springer,
2019. —С. 239-241.
[6] Heitz Eric. Sampling the GGX distribution of visible normals // Jour¬nal of Computer Graphics Techniques Vol. — 2018.—Vol. 7, no. 4.
[7] ISO/IEC JTC1/SC22/WG14 - C: Approved standards. - Режим до¬ступа: http://www.open-std.org/jtc1/sc22/wg14/www/standards(дата обращения: 18.04.2021).
[8] Igehy Homan. Tracing ray differentials // Proceedings of the 26th annual conference on Computer graphics and interactive techniques. — 1999. —P. 179-186.
[9] Kajiya James T. The rendering equation // Proceedings of the 13th annual conference on Computer graphics and interactive techniques. — 1986. —С. 143-150.
[10] Moller Tomas, Trumbore Ben. Fast, minimum storage ray-triangle intersection // Journal of graphics tools. — 1997. — Vol. 2, no. 1.— P. 21-28.
[11] NVIDIA RTX DI | NVIDIA Developer. - 2021. - Режим доступа: https://developer.nvidia.com/rtxdi (дата обращения: 18.04.2021).
[12] NVIDIA RTX Global Illuminaiton | NVIDIA Developer. - 2021. - Режим доступа: https://developer.nvidia.com/rtxgi (дата обращения: 18.04.2021).
[13] NVIDIA Real-time Denoiser | NVIDIA Developer. - 2021. - Режим
доступа: https://developer.nvidia.com/nvidia-rt-denoiser
(дата обращения: 18.04.2021).
[14] Neural Temporal Adaptive Sampling and Denoising / J Hasselgren, J Munkberg, M Salvi и др. // Computer Graphics Forum / Wiley Online Library. — Т. 39. — 2020. — С. 147-155.
[15] Q2RTX: NVIDIA’s implementation of RTX ray-tracing in Quake II. — https://github.com/NVIDIA/Q2RTX.
[16] Q2VKPT. — 2019. — Режим доступа: http://brechpunkt.de/q2vkpt/ (дата обращения: 18.04.2021).
[17] Ramamoorthi Ravi, Hanrahan Pat. An efficient representation for irradiance environment maps // Proceedings of the 28th annual con¬ference on Computer graphics and interactive techniques. — 2001. — P. 497-500.
[18] Real-time rendering / Tomas Akenine-Moller, Eric Haines, Naty Hoffman и др. — 4 изд. — Boca Raton : Taylor & Francis, CRC Press, 2018.-ISBN:9781138627000.
[19] Real-time rendering, глава 26 ’’Real-Time Ray Tracing” / Tomas Akenine-Moller, Eric Haines, Naty Hoffman и др. — 4 изд. — Boca Raton : Taylor & Francis, CRC Press, 2018. — ISBN:9781138627000.
[20] Real-time rendering, глава 9.3 ’Physically Based Shading. The BRDF” / Tomas Akenine-Moller, Eric Haines, Naty Hoffman и др. — 4 изд. — Boca Raton : Taylor & Francis, CRC Press, 2018. — ISBN:9781138627000.
[21] Real-time rendering, глава 9.8 ”BRDF Models for Surface Reflection” / Tomas Akenine-Moller, Eric Haines, Naty Hoffman и др. — 4 изд. — Boca Raton : Taylor & Francis, CRC Press, 2018. — ISBN:9781138627000.
[22] Saito Takafumi, Takahashi Tokiichiro. Comprehensible rendering of 3¬D shapes // Proceedings of the 17th annual conference on Computer graphics and interactive techniques. — 1990. — С. 197-206.
[23] Schied Christoph, Peters Christoph, Dachsbacher Carsten. Gradient estimation for real-time adaptive temporal filtering // Proceedings of the ACM on Computer Graphics and Interactive Techniques. — 2018. — Т. 1, № 2. —С. 1-16.
[24] Serious-Engine: An open source version of a game engine developed by Croteam for the classic Serious Sam games. — https://github.com/Croteam-official/Serious-Engine.
[25] Serious Sam Classic: The First Encounter - Croteam - Croteam. — 2001. — Режим доступа: http://www.croteam.com/serious-sam-classic-first-encounter/ (дата обращения: 18.04.2021).
[26] Spatiotemporal variance-guided filtering: real-time reconstruction for path-traced global illumination / Christoph Schied, Anton Kaplanyan, Chris Wyman и др. // Proceedings of High Performance Graphics. — 2017. —С. 1-12.
[27] VulkanMemoryAllocator. —https://github.com/
GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.
[28] An efficient denoising algorithm for global illumination. / Michael Mara, Morgan McGuire, Benedikt Bitterli, Wojciech Jarosz // High Performance Graphics.— 2017.— Т. 10. —С. 3105762-3105774.
[29] A global illumination solution for general reflectance distributions / Franqis X Sillion, James R Arvo, Stephen H Westin, Donald P Green¬berg // Proceedings of the 18th annual conference on Computer graph¬ics and interactive techniques. — 1991. — P. 187-196.
[30] Видеокарты с архитектурой Turing | NVIDIA. —2018. — Режим доступа: https://www.nvidia.com/ru-ru/geforce/turing/ (дата обращения: 18.04.2021).
[31] Пантелеев Алексей. Rendering Perfect Reflections and Refractions in Path-Traced Games // NVIDIA Developer Blog | Technical content: For developers, by developers on NVIDIA Developer Blog. —
2020. — Режим доступа: https://developer.nvidia.com/blog/rendering-perfect-reflections-and-refractions-in-path-traced-ga(дата обращения: 18.04.2021).