Курсовая работа на тему: "Разработка библиотеки для визуализации 3D графики"
У нас на сайте представлено огромное количество информации, которая сможет помочь Вам в написании необходимой учебной работы.
Но если вдруг:
Вам нужна качественная учебная работа (контрольная, реферат, курсовая, дипломная, отчет по практике, перевод, эссе, РГР, ВКР, диссертация, шпоры...) с проверкой на плагиат (с высоким % оригинальности) выполненная в самые короткие сроки, с гарантией и бесплатными доработками до самой сдачи/защиты - ОБРАЩАЙТЕСЬ!
Курсовая работа на тему:
"Разработка библиотеки для визуализации 3D графики"
Оглавление
Введение 3
1. Постановка задачи 5
2. Терминология 6
3. Требования к проекту 7
4. Существующие решения 8
4.1. BSF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.2. Ogre3D . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.3. Filament . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
4.4. Концептуальные недостатки . . . . . . . . . . . . . . . . . 9
5. Vulkan API 11
5.1. Обзор ключевых особенностей . . . . . . . . . . . . . . . . 11
5.2. Сравнение с другими графическими API . . . . . . . . . 12
6. Описание реализации 13
6.1. Структура проекта . . . . . . . . . . . . . . . . . . . . . . 13
6.2. Поддержка Vulkan API . . . . . . . . . . . . . . . . . . . . 13
6.3. Система визуализации . . . . . . . . . . . . . . . . . . . . 15
Заключение 18
Введение
Трехмерная графика — раздел компьютерной графики, посвящен- ный методам визуализации объемных моделей и объектов, описанных в 3D (3-dimensional) пространстве. К основным областям применения трехмерной графики можно отнести: системы автоматизированного про- ектирования,кинематограф, анимацию, видеоигры, симуляторы и мно- гое другое.
Существует несколько способов построения изображения по трех- мерным данным, одними из которых являются: растеризация прими- тивов, трассировка лучей, трассировка пути. Применение конкретного способа с последующей его конфигурацией обуславливается различны- ми факторами:
• Временными ресурсами. При работе в режиме реального времени максимальный интервал генерации изображения составляет при- близительно 33 миллисекунды (соответствует частоте обновления 30 Гц), что позволяет создать непрерывный для человеческого глазавидеопоток.
• Вычислительными ресурсами, предоставляемыми конкретной плат- формой, вместе со спецификой их использования. К примеру, мо- бильные устройства накладывают существенные ограничения на энергопотребление и не имеют активное охлаждение.
• Объемом отображаемых данных.
• Качеством отображения, которое может характеризоваться как фото-реалистичное, физически корректное, кинематографичное, ”мультяшное” [14] и так далее.
Наличие вышеизложенных факторов в сочетании с многочисленны- ми требованиями реальных проектов, связанных с визуализацией дан- ных, создает ряд проблем при поиске уже готовых графических реше- ний и при их непосредственной интеграции в систему.
В проекте CoreCVS [3] (Computer Vision Primitives Library) в рам- ках работы над библиотекой для симуляции физики полетов дронов разработчики столкнулись с необходимость визуализации процесса си- муляции как для отладки программ, так и для лучшего понимания того, как взаимодействуют объекты между собой. Для решения этой проблемы используется существующая в рамках проекта графическая библиотека, написанная с использованием OpenGL [11] (Open Graphics Library), которая позволяет отображать относительно простую геомет- рию с базовой моделью освещения. Однако данная библиотека исполь- зует в своей основе уже устаревшее подмножество функциональности OpenGL, что создает необходимость значительного рефакторинга для дальнейшего ее использования.
В итоге было принято решение разработать с нуля новую графиче- скую библиотеку в рамках CoreCVS, которая не только бы замещала функциональность своей предшественницы, но и расширяла ее в со- ответствии с задачами, решаемыми как в текущих, так и в будущих проектах.
Данное решение мотивированно не только стремлением минимизи- ровать количество сторонних зависимостей всего проекта, но и жела- нием использовать в качестве основы новейшее Vulkan API [13] (Vulkan Application Programming Interface), которое призвано заменить OpenGL в силу его морального устаревания. Анализ существующих решений также показал невозможность интеграции сторонних библиотек ввиду ряда причин, изложенных далее в тексте работы.
1. Постановка задачи
Цель данной работы — реализация библиотеки для визуализации трехмерной графики в реальном масштабе времени с возможностью ис- пользовать как низкоуровневый интерфейсдля создания специфичных моделей отображения, так и высокоуровневые абстракции, предостав- ляющие стандартный способ визуализации объектов. Для ее достиже- ния были выделены следующие задачи:
• Исследование предметной области. Сравнение существующих ре- шений
• Разработка и формализация требований к проекту
• Реализация компонентов графической библиотеки с учетом заяв- ленных требований
• Реализация поддержки Vulkan API
2. Терминология
• Графическая подсистема (англ. Graphical backend) — модуль про- граммы, реализующий графическую функциональность приложе- ния.
• Шейдер (ангд. Shader) — программа, предназначенная для испол- нения на графическом процессоре.
• Материал — контейнер, которых хранит описание поверхности объекта в виде набора атрибутов и некоторую программу, которая контролирует процесс обработки данного материала.
• Графический интерфейс (англ. Graphical API) — интерфейс для взаимодействия с графическим ускорителем системы.
• Application Programming Interface (API) — интерфейс прикладно- го программирования.
• Central Processing Unit (CPU) — центральный процессор.
• Graphical Processing Unit (GPU) — графический процессор.
• Graphical User Interface (GUI) — графический пользовательский интерфейс.
3. Требования к проекту
Основные функциональные требования, которые вытекают прежде всего из задач, решаемых в рамках проекта CoreCVS, изложены далее:
• Генерация изображения в режиме реального времени: в своей ос- нове библиотека полагается на алгоритм растеризации геометрии сиспользованием Z-буфера [1], что позволяет при должном коли- честве геометрии и вычислительных ресурсах генерировать изоб- ражения с частотой, достаточной для создания псевдонепрерыв- ного видеопотока.
• Кроссплатформенность: библиотека компилируется и работает на линейке основных операционных систем (Window, Linux, MacOS).
• Независимость от графического интерфейса: библиотека взаимо- действует с видеоускорителем системы через унифицированный интерфейс, который сам по себе является частью проекта.
• Поддержка Vulkan: доступ к данному API осуществляется через интерфейс, представленный в предыдущем пункте.
• Независимость от структуры сцены: библиотека поддерживает спи- сок видимых объектов и осуществляет их последовательное отоб- ражение. Иерархию сцены, зависимости между объектами опре- делят пользователь.
• Система материалов: материалы предоставляют типобезопасный интерфейс для конфигурации параметров отображения на GPU.
• Система хранения геометрии: возможность создавать и использо- вать геометрические объекты с произвольным набором атрибутов.
• Независимость от оконной системы: финальное изображение вы- водиться на экран, в виджет GUI системы, либо сохраняется во внеэкранномбуфере.
4. Существующие решения
В данном разделе проводится обзор и сравнение существующих гра- фических решений с открытым исходным кодом, доступным для сво- бодного использования. Критерии обзора вытекают прежде всего из требований, изложенных ранее. Основные факторы для включения в рассмотрение: наличие документации и обучающих материалов, актив- ная поддержка или разработка, интеграция с Vulkan, поддержка широ- кого класса графических интерфейсов, индексация1 на хостинге GitHub.
4.1. BSF
BSF (bs framework) — кросс-платформенная С++14 библиотека, раз- рабатываемая Game Foundry [2]. Предоставляет унифицированную ба- зу для разработки графических приложенийреального времени, видео- игр и инструментов программирования. Поддерживаемые графические интерфейсы: Vulkan, OpenGL, DirectX. Функциональность: конвейер экранных пост-эффектов, отложенное, физически корректное затене- ние, каскадная генерация теней, система материалов.
4.2. Ogre3D
Ogre3D (Object-Oriented Graphics Rendering Engine) — кросс-платформенна С++ графическая библиотека, разрабатываемая открытым сообществом [10]. В качестве графических интерфейсов поддерживает OpenGL, DirectX, WebGL. Функциональность: система материалов и пост-эффектов, ме- неджмент ресурсов, система анимации, граф сцены.
4.3. Filament
Filament — кросс-платформенная С++ библиотека графики, неофи- циально поддерживаемая Google [5] и открытым сообществом разра- ботчиков. Спроектирована таким образом, чтобы быть максимально
1Дата обращения: 11.12.2019
компактной и эффективной для Android платформы. Поддерживает OpenGL, Vulkan API, WebGL. Предоставляет С++, Java, JavaScript ин- терфейсы. Основные графические возможности:физически корректное затенение, освещение на основе изображения, система материалов, ка- мера с имитацией физических параметров параметрами, базовые пост- эффекты.
4.4. Концептуальные недостатки
Несмотря на многочисленную функциональность, которой облада- ют рассмотренные решения, они не в полной мере удовлетворяют тре- бованиям проекта CoreCVS. В частности, BFS и Ogre3D прежде всего ориентированны на разработку видео игр, поэтому данные библиотеки сильно зависят как от иерархической структуры сцены, так и от об- работки данных. Они предоставляют собственные форматы геометрии, языки описания шейдеров и методы загрузки ресурсов, таких как моде- ли, текстуры. Данная функциональность избыточна, так как в проекте CoreCVS уже существуют модули по обработке 3D геометрии и изоб- ражений.
Рис. 1: Сравнение существующих решений по основным критериям
Проект Filament имеет больший фокус на графическую составляю- щую, однако он в первую очередь ориентирован на создание физиче- ски корректного освещения на Android платформе, что выражается с существенно меньшей гибкости в настройке как самого освещения, так и экранных эффектов, создание которых практически ограничено на мобильных устройствах ввиду их высокой вычислительной сложности. Детальное сравнение рассмотренных решений по основным крите- риям представлено на рис. 1. Красным цветом выделены критические аспекты, желтым — устранимые, но нежелательные особенности, зеле-
ным — полностью приемлемые функциональные возможности.
Поэтому было принято решение отказаться от интеграции одного из существующих решений и сосредоточиться на разработке новой библио- теки, с учетом всей функциональности, которая в той или иной форме уже представлена в проекте CoreCVS.
5. Vulkan API
Vulkan — это кросс-платформенное API для работы с трехмерной графикой и параллельными вычислениями. Предоставляет C99 совме- стимый интерфейс для взаимодействия с GPU и спецификацию, ко- торая описывает семантику исполнения программ. Впервые был пред- ставлен в феврале 2016 года. В настоящее время поддерживается кон- сорциумом Khronos Group.
5.1. Обзор ключевых особенностей
Vulkan является одним из представителей таких графических ин- терфейсов нового поколения, как Metal [9] и Direct3D [4]. В сравнении со стандартами прошлого поколения, Vulkanимеет ряд новых функ- циональных особенностей, которые призваны повысить эффективность работы конечных приложений:
• Возможность работать на множестве операционных систем, вклю- чаю мобильную платформу.
• Меньшее количество ресурсов, используемых во время работы. Это достигается ручным управлением памятью, используемой драй- вером как на CPU, так и на GPU, явным созданием и удалением графических конвейеров обработки примитивов.
• Лучшая расширяемость на платформах с несколькими ядрами. Драйвер позволяет формировать команды для GPU из несколь- ких потоков.
• Универсальное представление GPU программ в бинарном форма- те SPIR-V [12]. Это позволяет создавать шейдерные программы на любом из доступных языков, включая GLSL [6] и HLSL [7], и компилировать их в объектные модули независимо от конечной платформы.
• Унифицированный менеджмент вычислительных ядер на GPU. Это позволяет использовать вычислительный конвейер посред- ством VulkanAPI, не прибегая к сторонним вычислительным биб- лиотекам, таким как Nvidia CUDA и OpenCL.
5.2. Сравнение с другими графическими API
В области разработки графических приложений существует ряд про- мышленных API, часть из которых уже была упомянута ранее в тексте работы. Direсt3D предоставляет схожую графическую функциональ- ность, что и Vulkan, однако он доступен только на платформе от ком- пании Microsoft. Графический API Metal, разрабатываемый корпораци- ей Apple, также доступен только на устройствах и системах этой ком- пании. OpenGL является открытым стандартом, доступным на мно- гих платформах, исключая мобильные устройства, где используется OpenGLES. Однако развитие данного API затруднено требования об- ратной совместимости, а поддержка его новых версий уже не осуществ- ляется на некоторыхустройствах2.
Таким образом, было принято решение использовать Vulkan API в качестве основы для реализации данного проекта, так как он удовле- творяет функциональным требованиямразрабатываемой библиотеки и обладает активной поддержкой на основных платформах.
2Компания Apple прекратила поддержку новых версий OpenGL в 2018, объявив официально данный API устаревшим на своей платформе
6. Описание реализации
В данном разделе приводится описание общей структуры проекта и отдельных компонентов графической библиотеки, реализация кото- рых осуществлялась в рамках данной работы. Исходный код проекта опубликован на хостинге GitHub3. Работа по реализации библиотеки выполнялась совместно со студентом 371 группы Сультимом Цыренда- шиевым.
6.1. Структура проекта
Основные компоненты и классы разработанной графической биб- лиотеки библиотеки представлены на рис. 2.
В качестве языка программирования для разработки использовал- ся C++11, для управления процессом сборки и подключения сторонних зависимостей использовался CMake 3.14, что соответствует требовани- ям проекта и условиям интеграции с библиотекой CoreCVS.
Для поддержки сборки проекта для трех основных платформ была настроена непрерывная интеграция на платформе Github Actions.
6.2. Поддержка Vulkan API
Для поддержки доступа к GPU с использованием API Vulkan был разработан модуль VulkanDevice, который реализует интерфейс абстракт- ного графического девайса и полностью инкапсулирует логику взаимо- действия с этим API.
В рамках данной работы были реализованы следующие компоненты модуля VulkanDevice:
•
VulkanContex: контекст графической библиотеки Vulkan, кото- рый инкапсулирует логику инициализации библиотеки, выбора и конфигурацииграфического девайса, а также расширений, тре-
3Исходный код проекта: https://github.com/EgorOrachyov/Ignimbrite
Рис. 2: UML диаграмма основных компонентов и классов разработанной графической библиотеки
буемых для создания приложения с использованием Vulkan для конкретной операционной системы.
• VulkanSwapchain: объект, который инкапсулирует логику пре- зентации финального изображения, сгенерированного на GPU, в специфичное окно или поверхность операционной системы. API Vulkan требует осуществлять явную синхронизации CPU и GPU для доступа к изображению, а также выполнять обработку собы- тий изменения поверхности отображения или конфигурацию ре- жима презентации [13] в зависимости отвозможностей конечной системы и требований приложения.
• VulkanGraphicsPipeline: конвейер растеризации геометрических примитивов с использованием Z-буффера, который включает в себя настройку полностью программируемых этапов, таких как вершинные и фрагментные шейдеры, и частично конфигуриру- емых — сборка примитивов, растеризация, тест глубины и тра- фарета, а также альфа-смешивание. В отличие от графического API OpenGL, который позволяет динамически изменять процесс растеризации без явного создания объектов конфигурации, API Vulkan требует мануального создания полностью сконфигуриро- ванного неизменяемого графического конвейера, который позже может быть использован для отображения примитивов.
6.3. Система визуализации
Для доступа к графической функциональности высокого уровня был реализован класс RenderEngine, который поддерживает список видимых объектов и источников света на сцене, а также осуществля- ет отображения этих объектов в окно операционной системы или вне- экранный буфер.
Видимые объекты сцены реализуют интерфейс IRenderable, что позволяет им реагировать на события, генерируемые RenderEngine, и отображать себя независимо от структуры сцены или окружения. В ка-
честве стандартной реализации представлен RenderableMesh, кото- рый позволяет отображать геометрию, состоящую из индексированных вершин с фиксированным числом атрибутов.
Для конфигурации отображения реализован Material, который хра- нит состояние конвейера растеризации, а также поддерживает про- извольные параметры отображения, которые могут быть установле- ны посредством типобезопасного интерфейса, автоматически упакова- ны и скопированы в видеопамять для последующего использования при отображении на GPU. Материалы поддерживают раздельное владение ресурсами GPU, что позволяет сократить расход видеопамяти и умень- шить число изменений состояния GPU за счет предварительно упоря- дочивания отображаемых объектов в зависимости от их материалов.
В качестве стандартных алгоритмов освещения доступны:
• Затенение объекта выбранным фиксированным цветом
• Затенение объекта с учетом интенсивности освещения сцены на основе модели Ламберта с использованием теневых карт для со- зданиятеней
• Физически-корректное затенение с учетом интенсивности освеще- ния на основе вариации модели Кука-Торренса, которая была пред- ложена в работе Брайана Кариса [8] как одна из наиболее визу- ально приемлемых моделей для вычисления в режиме реального времени. На рис. 3 представлен пример отображения геометрии с использованием данного алгоритма затенения.
Объекты, реализующие интерфейс IPostEffect, позволяют после- довательно применять экранные эффекты к сформированному в про- цессе растеризации изображению. Для каждого эффекта доступна ин- формация о цвете точки и ее глубине в соответствующем Z-буфере. В качестве стандартных эффектов реализованы черно-белый фильтр и фильтр инвертирования цвета, пример применения которых представ- лен на рис. 4.
Рис. 3: Физически-корректное затенение 3D-геометрии с использовани- ем вариации модели Кука-Торренса
(a) Черно-белый фильтр (b) Фильтр инвертирования цвета
Заключение
В ходе выполнения работы получены следующие результаты:
• Проведено исследование предметной области
• Проведено сравнение существующих решений
• Разработаны и формализованы требования к проекту
• Реализованы компоненты библиотеки в соответствии с заявлен- ными требованиями
• Реализована поддержка Vulkan API
Реализованная графическая библиотека была успешно интегриро- вана в проект CoreCVS студентом 371 группы Сультимом Цырендаши- евым в рамках его курсовой работы. В качестве основы для интегра- ции использовалась платформа Qt виджетов для создания поверхности отображения.
Несмотря на скромную функциональность реализованной графиче- ской библиотеки, ее ядро в сочетании с поддержкой Vulkan API будет использовано в дальнейшем для расширения исоздания 3D визуализа- ции уже в рамках проекта CoreCVS.
Список литературы
Рис. 4: Применение экранных эффектов к растеризованному изображе- нию
[1] Akenine-Mller Tomas, Haines Eric, Hoffman Naty. Real-Time Rendering, Fourth Edition. – 4th edition. – USA : A. K. Peters, Ltd., 2018. – ISBN: 0134997832.
[2] BSF Framework // github. – Access mode: https://github.com/ GameFoundry/bsf (online; accessed: 14.11.2019).
[3] Computer Vision Primitives Library // github. – Access mode: https://github.com/PimenovAlexander/corecvs (online; accessed: 11.11.2019).
[4] Direct3D 12 Graphics // Microsoft Online Documents. – 2018. – Access mode: https://docs.microsoft.com/ru-ru/windows/ win32/direct3d12/direct3d-12-graphics?redirectedfrom=MSDN (online; accessed: 11.12.2019).
[5] Filament Graphics Library // github. – Access mode: https:// github.com/google/filament (online; accessed: 16.11.2019).
[6] Group The Khronos Working. OpenGL Shading Language
4.4 Specification // Khronos Registry. – 2016. – Access mode: https://www.khronos.org/registry/OpenGL/specs/gl/ GLSLangSpec.4.40.pdf (online; accessed: 20.11.2019).
[7] High Level Shading Language for DirectX // Microsoft Online Documents. – 2018. – Access mode: https://docs.microsoft.com/ en-us/windows/win32/direct3dhlsl/dx-graphics-hlsl (online; accessed:20.11.2019).
[8] Real Shading in Unreal Engine 4 : Rep. / Epic Games ; Executor: Brian Karis : 2013. – Access mode:http://blog.selfshadow.com/ publications/s2013-shading-course/karis/s2013_pbs_epic_ notes_v2.pdf(online; accessed: 02.05.2020).
[9] Metal Programming Guide // Apple Documentation Archive. – 2018. – Access mode: https://developer.apple.com/ library/archive/documentation/Miscellaneous/Conceptual/MetalProgrammingGuide/Introduction/Introduction.html (online; accessed: 12.12.2019).
[10] Ogre3D Engine // github. – Access mode: https://github.com/ OGRECave/ogre (online; accessed: 15.11.2019).
[11] The Khronos Working Group. OpenGL 4.4 Specification // Khronos Registry. – 2014. – Access mode: https://www.khronos.org/ registry/OpenGL/specs/gl/glspec44.core.pdf (online; accessed: 9.12.2019).
[12] The Khronos Working Group. SPIR-V 1.5 Specification // Khronos Registry. – 2018. – Access mode: https://www.khronos.org/ registry/spir-v/specs/unified1/SPIRV.pdf (online; accessed: 20.11.2019).
[13] The Khronos Working Group. Vulkan 1.1 API Specification // Khronos Registry. – 2019. – Access mode: https://www.khronos. org/registry/vulkan/specs/1.1/html/vkspec.html (online; accessed: 10.11.2019).
[14] Wikipedia. Cel Shading // Wikipedia, the free encyclopedia. – Access mode: https://en.wikipedia.org/wiki/Cel_shading (online; accessed: 9.12.2019).