Курсовая работа на тему: "Разработка библиотеки для визуализации 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

Список литературы                                                                                19

 

Введение

Трехмерная графика — раздел компьютерной графики, посвящен- ный методам визуализации объемных моделей и объектов, описанных в 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).