Курсовая работа на тему: "Разработка библиотеки визуализации трехмерной графики для симулятора дронов"

У нас на сайте представлено огромное количество информации, которая сможет помочь Вам в написании необходимой учебной работы. 

Но если вдруг:

Вам нужна качественная учебная работа (контрольная, реферат, курсовая, дипломная, отчет по практике, перевод, эссе, РГР, ВКР, диссертация, шпоры...) с проверкой на плагиат (с высоким % оригинальности) выполненная в самые короткие сроки, с гарантией и бесплатными доработками до самой сдачи/защиты - ОБРАЩАЙТЕСЬ!

Курсовая работа на тему:

"Разработка библиотеки визуализации трехмерной графики для симулятора дронов"

Оглавление

Введение                                                                                                       3

1.      Постановка задачи                                                                              5

2.    Обзор                                                                                                        6

2.1.   Глоссарий . . . . . . . . . . . . . . . . . . . . . . . . . . . .        6

2.2.       Обзор существующих решений    . . . . . . . . . . . . . . .        7

2.3.       Используемые технологии   . . . . . . . . . . . . . . . . . .        9

3.    Реализация                                                                                          11

3.1.   Обертка  над Vulkan API    . . . . . . . . . . . . . . . . . . .      11

3.1.1.   Вершинные и индексные буферы  .  .  .  .  .  .  .  . . .      13

3.1.2.  Структура вершин  . . . . . . . . . . . . . . . . . .      14

3.1.3.   Управление памятью  . . . . . . . . . . . . . . . . .      16

3.1.4.   Командные буферы .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  . . .      16

3.2.   Создание стандартной реализации    .  .  .  .  .  .  .  .  .  .  . . .      17

3.2.1.  Рефлексия шейдеров  . . . . . . . . . . . . . . . . .      18

3.2.2.   Источники света и тени    . . . . . . . . . . . . . . .      19

3.3.   Интеграция в CoreCVS  . . . . . . . . . . . . . . . . . . . .      19

3.3.1.   Qt  . . . . . . . . . . . . . . . . . . . . . . . . . . . .      19

3.3.2.   Адаптер . . . . . . . . . . . . . . . . . . . . . . . . .      21

Заключение                                                                                               23

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

 

Введение

На текущий момент всё большую популярность набирают дроны (мультикоптеры, мультироторы) – гражданские беспилотные летатель- ные аппараты. Для их управления используетсяспециальное программ- ное обеспечение, которое применяется для построения маршрута, облё- та препятствий и т.д., но, как и любой другой программный продукт, его необходимо тестировать.Испытание в условиях реального мира мо- жет оказаться дорогостоящим, так как любая ошибка может повлечь поломку летательного аппарата, нанесение урона людям, их имуще- ству. Поэтому тестирование сначала проводят в специальном ПО – си- муляторах, в которых имитируется реальность, то есть происходит от- рисовка мира, расчет физики и т.п. для вычисления входныхсимулиру- емых значений датчиков; и, таким образом, разработка ПО управления дронами с минимальными изменениями может быть затем перенесена из виртуальной среды в реальную.

В течение некоторого времени кафедра Системного Программиро- вания проводит исследования в области автономной навигации мульти- роторов и усилиями коллектива студентов ипреподавателей сформиро- вала некоторую кодовую базу взяв за основу библиотеку CoreCVS [22]

– которая предоставляет примитивы компьютерного зрения и вычисли- тельной математики, а также включает в себя симулятор дронов. С ви- зуальной точки зрения, графика в нём относительно простая, поэтому и требуется её усовершенствование, а также повышение переносимости и удобства отображения. Но так как графика не является целью этого проекта, то для этого необходима библиотека, которая предоставляет легкую в освоении, но в то же время гибкую функциональность.

Поэтому разрабатываемое в рамках данной курсовой работы реше-

ние может быть применимо в проектах, где графика является только инструментом, изучение которого должно быть непродолжительным, например, в физических симуляциях твердых тел, системах инженер- ной графики и т.д.

1.       Постановка задачи

Цель курсовой работы – разработка графической библиотеки с вы- сокой конфигурируемостью и простотой использования в стандартной реализации.

Так как над проектом работает несколько человек, то было принято решение разделить работу и принять целями данной работы следую- щее:

    Обзор существующих решений;

 

    Реализация части обертки над графическим API;

 

    Реализация высокоуровневой системы визуализации трехмерной графики;

    Интеграция в подсистему отображения инженерной графики биб- лиотеки CoreCVS.

2.     Обзор

2.1.      Глоссарий

    Сцена (англ. scene) – набор объектов с параметрами.

    Визуализация трехмерной графики (отрисовка, рендеринг) (англ. rendering) – создание и презентация изображения на основании информации о сцене.

    Полигональная сетка (англ. polygon mesh) – набор вершин, рё- бер и граней, который представляет собой некоторый трехмерный объект. Гранями обычно являются треугольники.

    Текстура (англ. texture) – изображение, подготовленное для на- ложения на полигональную сетку.

    Пробник (англ. sampler) – специальный объект, определяющий способ взятия значений из текстуры.

    Шейдерная программа (англ. shader) – пользовательская програм- ма, которая исполняется на видеокарте.

    Буфер параметров шейдера (англ. uniform buffer) – буфер, со- держащий параметры, передаваемые в шейдерную программу идоступные в ней только для чтения.

    Материал (англ. material) – набор различных параметров и тек- стур, которые подаются на вход некоторому шейдеру.

    Трёхмерная модель (англ. 3D model) – набор полигональных се- ток, текстур, анимаций и т.д.

    Буфер команд (англ. command buffer) – специальный буфер, в ко- торый записываются команды рендеринга. После его заполнения и готовности, он отправляется на видеокарту для исполнения.

    Подпроход визуализации (англ. render subpass) – фаза отрисовки, которая считывает и записывает в отведённые буферы изображе- ния, которые хранятся в проходе визуализации.

    Проход визуализации (англ. render pass) – набор буферов изобра- жений, подпроходов, а также зависимостей этих подпроходов.

    Графический трубопровод (англ. graphics pipeline) – последова- тельность этапов, необходимых для визуализации графики.

    Буфер кадра (англ. framebuffer) – набор буферов изображений, в которые происходит отрисовка графики. Он предоставляет буфе- ры, необходимые в проходе визуализации.

    Цепь изображений для презентации (англ. swap chain) – набор изображений, презентация которых происходит поочередно.

    Фреймворк для разработки игр (англ. game engine) – программное обеспечение для работы компьютерных игр. Обычно оно включает в себя отрисовку графики, симуляцию физики, работу со звуком, сетью и др.

 

2.2.    Обзор существующих решений

На текущий момент существует множество библиотек, фреймвор- ков, API для визуализации трехмерной графики, но в контексте данной курсовой работы будут рассматриваться проекты, предложенные науч-

ным руководителем: Google Filament [21], OGRE3D [16], а также ПО для визуализации, используемое в симуляторах AirSim [1] и CARLA [4].

Основными критериями для обзора существующих решений явля- ется кросс-платформенность, возможность использования произволь- ных шейдеров, структур вершин и т.д., а также простой в использо- вании интерфейс, то есть затраченное на его изучение время должно быть минимальным. Поэтому такие API для графики, как OpenGL [13], DirectX [6], Vulkan [14] и др. в этом разделе рассматриваться не будут, так как эти API являются низкоуровневыми1, так что их изучение мо- жет занять много времени, а это критично, если целью разрабатывае- мой программы не является сама графика.

Одной из библиотек для рендеринга трехмерных сцен в реальном времени, целью которой является простота использования, является Google Filament [21]. Несмотря на то, что рассматриваемая библиотека кросс-платформенная и поддерживает множество различных графи- ческих API, в ней используется свой формат полигональных сеток – filamesh, вершины в которых определяются только позицией, касатель- ной, цветом и двумя текстурными координатами, поэтому в данном контексте она не подходит, так как вершины в полигональных сетках могут содержать произвольную информацию. То же самое можно ска- зать о материалах, видов которых всего пять [7].

Другой библиотекой с похожей целью является OGRE3D [16], кото- рая также является кросс-платформенной и поддерживает различные API, но при этом поддерживает пользовательские структуры вершин в полигональных сетках и пользовательские шейдерные программы. Тем не менее, Ogre3D имеет множествозависимостей, в особенности

1например, необходимо оптимальное управление памятью [17], синхронизация работы между про- цессором и видеокартой [2]

– Cg [5] – язык шейдерных программ, разработанный NVidia, который уже несколько лет не поддерживается и его использование не рекомен- дуется.

Стоит заметить, что для симуляции обычно используют фреймвор- ки для разработки игр, например, симуляторы AirSim [1] и CARLA [4] используют Unreal Engine [19] и Unity Engine [18]. В них уже есть от- рисовка графики, симуляция физики, система скриптов, пользователь- ский интерфейс и т.д. С другой стороны, это ограничивает пользовате- ля, так как, например, использоватьсобственные алгоритмы симуляции физики может быть невозможно из-за закрытого исходного кода2.

Таким образом, несмотря на то, что существует множество различ- ных библиотек для отрисовки трехмерной графики, необходима спе- циальная библиотека с простым в использовании программным интер- фейсом и достаточной гибкостью.

 

2.3.    Используемые технологии

Основным языком программирования выбран C++, поскольку этот язык используется в симуляторе беспилотников на базе CoreCVS.

API для графики предоставляют абстракцию над графическими устройствами, достаточную для визуализации трехмерной графики. Для реализации библиотеки будет использоваться Vulkan API [14], так  как это является обязательным условием научного руководителя, при этом Vulkan API предоставляет более низкоуровневый доступ, чем OpenGL [13], например, в OpenGL есть глобальное состояние, нет поддержки буфе- ров команд и др. [3][2]. Также Vulkan является кросс-платформенным3, что нельзя сказать о DirectX [6], который поддерживается только в ОС

2например, Unity Engine

3на MacOS и iOS – с помощью официальной библиотеки MoltenVK [11]

Для управления памятью видеокарты используется библиотека Vulkan Memory Allocator [8], позволяющая оптимально использовать память при использовании Vulkan API.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4по дате выхода первой версии

5LunarG (компания-разработчик Vulkan API) является ассоциированным членом Khronos Group

3.     Реализация

3.1.      Обертка над Vulkan API

Windows, и Metal [15] — только MacOS и iOS. Более того, Vulkan API является одним из новейших графических API на данный момент4.

Для инициализации графического трубопровода в Vulkan необходи- ма информация о ресурсах в шейдере – их расположение, тип и т.д., но так как шейдеры определяются пользователем и Vulkan не  предостав- ляет достаточной информации, то понадобится рефлексия для SPIR-V шейдеров [10][9]. Есть несколько библиотек с соответствующей функ- циональностью, одними из таких являются SPIRV-Cross [12] и SPIRV- Reflect [20]. В работе будет  использоваться  библиотека  SPIRV-Cross,  так как это официальный продукт от Khronos Group5.

Задачей обёртки является абстракция над низкоуровневым графи- ческим API, поэтому при необходимости возможно использовать другие программные интерфейсы, отличные от Vulkan API.Функциональность обёртки включает следующие пункты, при этом курсивом выделены функции, реализованные в ходе данной курсовой работы6:

    Регистрация структур вершин;

    Создание, обновление, удаление вершинных, индексных буферов,

а также буферов параметров шейдера;

 

    Регистрация структур буферов параметров шейдера;

 

    Регистрация текстур;

    Создание, удаление пробников для текстур;

 

    Загрузка шейдерных программ;

 

    Создание, удаление графических трубопроводов;

 

    Создание, удаление буферов кадра;

 

    Отправка командного буфера на исполнение и замена изображе- ния в цепи изображений для презентации;

    Работа с командными буферами:

    начало и конец записи в командный буфер;

6остальная часть функциональности реализована Е. Орачевым

    установка буфера кадра;

    установка графического трубопровода;

    установка структуры буфера параметров шейдера;

    установка вершинного и индексного буферов;

    рисование без и с помощью индексного буфера.

 

Таким образом, в общем случае для отрисовки трёхмерной графики пользователю необходимо:

1.     Зарегистрировать и создать необходимые ресурсы (различные бу- феры, текстуры и т.п.);

2.     Начать запись в командный буфер;

 

3.     Установить буфер кадра;

 

4.     Для каждого объекта на сцене:

 

(a)     установить графический трубопровод и структуру буфера параметров шейдера, использующегося в материале этого объ- екта;

(b)     установить вершинный и индексный буферы для полигональ- ной сетки этого объекта;

(c)     вызвать команду для рисования с помощью индексного бу- фера;

5.     Закончить запись командного буфера;

 

6.     Отправить командный буфер на исполнение и заменить изобра- жение в цепи изображений для презентации.

При этом шаги 2 – 6 могут быть помещены в цикл для создания пооче- редно показывающихся изображений, то есть производится отрисовка сцены в реальном времени.

Далее будут рассмотрены только те функции обёртки, обоснование которых необходимо.

 

3.1.1.     Вершинные и индексные буферы

Буферы вершин и индексов используются при описании полигональ- ных сеток. Vulkan API предоставляет интерфейс для создания, измене- ния и удаления таких буферов.

Так как полигональные сетки могут быть статическими, либо дина- мическими – атрибуты вершин таких сеток меняются7, но количество самих вершин всегда остаётся одним и тем же, то их тип указывается при создании этих буферов посредством библиотеки.

Если указанный тип – динамический, то возможны доступ и запись в этот буфер со стороны процессора, то есть указываются следующие флаги при выделении памяти на видеокарте с помощью Vulkan API:

    VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT – для чтения данных бу- фера из памяти видеокарты с помощью функцииvkMapMemory;

    VK_MEMORY_PROPERTY_HOST_COHERENT_BIT – для автоматической за- грузки в память видеокарты.

А при статическом происходит единовременная запись в память ви- деокарты, которая осуществляется в несколько этапов:

1.     Создаётся временный буфер, который доступен со стороны про- цессора, выделяется память на видеокарте, в неё записываются

7имеется в виду то, что данные о вершинах меняются в памяти видеокарты

данные вершин или индексов;

 

2.     Создаётся и выделяется память для окончательного буфера, в ко- торую копируются данные из временного;

3.     Удаляется временный буфер и освобождается его память.

 

 

3.1.2.    Структура вершин

Таким образом, окончательный буфер располагается в памяти видео- карты и не имеет флага VK_MEMORY_PROPERTY_HOST_COHERENT_BIT, по- этому доступ к нему более оптимальный8.

Вершины в разных полигональных сетках могут иметь различную структуру9, например, у одной – это (вектор позиции), у другой – (век- тор позиции, цвет, вектор нормали, вектор касательной).Поэтому обёрт- ка включает в себя специальные дескрипторы для описания структу- ры буферов вершин – VertexBufferLayoutDesc и VertexAttributeDesc (рис. 1).

VertexBufferLayoutDesc содержит список VertexAttributeDesc, раз- мер одного элемента в байтах и как часто будет указана информация – для каждой вершины или для всего буфера. Этот дескриптор необхо- дим для указания того, как будет интерпретироваться каждый элемент из данных из вершинного буфера. Каждый элемент состоит из атрибу- тов.

VertexAttributeDesc– это описание конкретного атрибута верши- ны. В нём указываются тип атрибута; индекс атрибута (location), ука- занный в шейдерной программе, которая будет использована для отри- совки вершинного буфера; и смещение в байтах от начала элемента.

8см. главу «10.2. Device Memory» спецификации Vulkan API [14]

9англ. layout

 

Рис. 1: Объявления VertexBufferLayoutDesc и VertexAttributeDesc

.

Например, для описания структуры вершин, состоящих из трехмер- ного вектора позиции и четырехмерного вектора цвета, необходимо ука- зать следующие данные:

    stride = 3 * sizeof(float) + 4 * sizeof(float);

 

    usage = PerInstance;

 

    Атрибуты:

 

    location = 0, offset = 0,

format = R8G8B8_SFLOAT;

    location = 1,

offset = 3 * sizeof(float), format = R8G8B8A8_SFLOAT.

3.1.3.    Управление памятью

На начальном этапе реализации обертки для выделения памяти на видеокарте и создания различных буферов были использованы функ- ции Vulkan API без промежуточных этапов, в частности, каждому бу- феру сопоставлялся отдельный дескриптор аллокации памяти видео- карты (VkDeviceMemory). Но так как Vulkan имеет жёсткие ограничения на количество одновременно существующих таких дескрипторов, мас- кимальное число которых указано в поле maxMemoryAllocationCount структуры VkPhysicalDeviceLimits, специфичной для каждой видео- карты; тобыло принято решение о интеграции библиотеки Vulkan Mem- ory Allocator (VMA), поскольку она решает проблему ограниченного ко- личества дескрипторов. При запросе памяти VMA возвращаетдескрип- тор аллокации VkDeviceMemory и смещение, таким образом, VMA опти- мально использует количество дескрипторов, выделяя память большо- го размера (один дескриптор) и уже в ней распределяя смещения для запросов.

 

3.1.4.    Командные буферы

Командные буферы необходимы для записи в них команд, которые будут исполнены на видеокарте. Такими командами являются коман- ды отрисовки полигональных сеток (vkCmdDraw), установки буферов индексов (vkCmdBindIndexBuffer), вершин (vkCmdBindVertexBuffers), начала прохода визуализации (vkCmdBeginRenderPass) и другие. Vulkan API предоставляет нескольковидов командных буферов: многоразовые и для разового использования. Так как сцены с большой вероятностью меняются каждый кадр, например, произойдёт сдвиг камеры, поворот объекта, тодля каждого кадра создаётся новый одноразовый команд-

ный буфер, при этом их аллокация происходит из специального пула, предназначенного для командных буферов с коротким временем жиз- ни.

 

3.2.    Создание стандартной реализации

Стандартная реализация предоставляет интерфейс IRenderEngine, использующий высокоуровневые примитивы, в которые инкапсулиро- вана большая часть обёртки (рис. 2).

    входные и выходные данные;

 

    буферы параметров шейдера, которые могут иметьпроизвольную структуру, агрегируя другие, уже заданные, типы данных, т.е. являются аналогами struct в языке C;

    текстуры.

 

Далее будут рассмотрены необходимые детали реализации.

3.2.1.     Рефлексия шейдеров

У каждого параметра существует свой собственный идентификатор, который необходимдля предоставления данных в шейдерную програм- му для её дальнейшего исполнения. Для входных и выходных данных этот идентификатор называется location, а для буферов и текстур – binding. Для того, чтобы у пользователя не было необходимости ука- зывать числовые идентификаторы, эти данные получаются с помощью рефлексии, при этом каждому идентификатору соответствует конкрет- ное название, которое может быть использовано для индексации.

Поскольку буферы параметров шейдера представляют собой неко- торую структуру, то необходимо рассмотреть каждое её поле: у всех членов буфера идентификатор является таким же, как и у всего бу- фера, так как нельзя установить только часть буфера; но при этом смещение и тип у каждого члена будет разным. Однако для избежа- ния коллизий названия членов буфера составляются следующим об- разом: ”<имя типа буфера>.<название члена>”. Используется именно имя типа буфера, так как SPIRV-Cross предоставляет только это на- звание для структур.

Так как шейдерные программы задаются пользователем, то необхо- димо иметь доступ к информации об их параметрах. Такими парамет- рами являются:

Рис. 2: Интерфейс IRenderEngine(жёлтым цветом выделены классы реализованные в ходе данной работы).

3.2.2.    Источники света и тени

Объекты отбрасывают тени с помощью алгоритма теневых карт 10 и функций IRenderDevice, независимо от использованного графиче- ского API. Создаётся отдельный буфер кадра, в который происходит отрисовка объектов с точки зрения источника света, далее информа- ция о глубине из этого буфера кадра используется для затенения при отрисовке с камеры. Для отсечения объектов, невидимых для источни- ка света используется пирамида видимости камеры, на основе которой строится минимальный параллелепипед, вращение которого совпадает с вращением источника света.

 

3.3.    Интеграция в CoreCVS

3.3.1.     Qt

Для отображения в окно11 необходимо получить платформозави- симые дескрипторы, например, HWND и HINSTANCE в операционной си- стеме Windows; и с помощью этих дескрипторов создать экземпляр VkSurfaceKHR, который уже используется в Vulkan API.

CoreCVS использует фреймворк Qt для отображения пользователь- ского интерфейса, при этом с версии Qt 5.10 в нём уже предусмотре- но получение VkSurfaceKHR из QWindow. Для этогобыл создан класс VkIbWindow (рис. 3), в котором инкапсулировано:

    создание экземпляра VulkanRenderDevice, при его создании необ- ходимо указать расширения в виде массива их названий, кото- рые будут использоваться для инициализации VkInstance; при

10англ. shadow mapping

11часть оконного интерфейса (windowing system)

этом одним из них является ”VK_KHR_surface”, а другой зави- сит от оконного интерфейса, например, для системы окон ОС Windows – ”VK_KHR_win32_surface”, а для X Window System – ”VK_KHR_xcb_surface”;

    создание экземпляра QVulkanInstance с помощью VkInstance, по- лучаемого из VulkanRenderDevice;

в котором может содержаться логика для отрисовки.

 

3.3.2.    Адаптер

    после инициализации самого окна через функцию QWindow::show(), возможно получение VkSurfaceKHR из QWindow, последующаяего инициализация и создание дескриптора для IRenderDevice.

 

 

 

VkIbWindow также обрабатывает события, которые посылаются от Qt: при получении события QEvent::UpdateRequest запрашивается ещё одно такое же событие, которое будет распланировано и будет отправ- лено в следующем кадре. При этом, если экземпляркласса, наследован- ного от IVkIbApp, установлен, то будет вызвана функцияonUpdate(),

Рис. 3: Класс VkIbWindow, наследуемый от QWindow.

CoreCVS использует классы Mesh3D и Mesh3DDecorated для хране- ния информации о полигональных сетках, при этом массивы для каж- дого атрибута вершины (вектора позиции, нормали, цвета и т.д.) хра- нятся отдельно, однако Vulkan API требует (а следовательно и IRend erDevice), чтобы буфер вершин хранил информацию не об отдельных массивах атрибутов, а в одном массиве, в котором каждый элемент со- держит эти атрибуты.

Для их отображения через IRenderEngine был создан класс MeshDe coratedRenderable(рис. 4), который наследуется от интерфейса IRend erable иобъединяет информацию из Mesh3DDecoratedв вершинный и

индексный буферы для последующей отрисовки. Класс IbEngine явля- ется адаптером между графической библиотекой и CoreCVS. Он также является подклассом интерфейса IVkIbApp с целью получения доступа к реализации функции onUpdate().

Mesh3D и Mesh3DDecorated также содержат информацию о точках и отрезках, которые должны быть отрисованы, поэтому при добавле- нии MeshDecoratedRenderable происходит отделение информации о по- лигональных сетках, об отрезках и о точках, так как каждый из них используют различные шейдерные программы, графическиетрубопро- воды.

Рис. 4: Класс-адаптер IbEngine и класс MeshDecoratedRenderable, ис- пользующий Mesh3DDecorated в качестве источника информации для отрисовки.

Заключение

В рамках курсовой работы были выполнены следующие задачи:

 

    Реализована обертка над Vulkan API:

 

    работа с вершинными, индексными буферами;

    регистрация структур вершин;

    работа с командными буферами;

    загрузка изображений, пробники;

 

    Интегрирована библиотека Vulkan Memory Allocator;

 

    Реализована стандартная реализация:

 

    интегрирована библиотека для рефлексии шейдеров на языке SPIRV;

    реализованы примитивы: камеры, источники света, отсече- ние по пирамиде видимости;

    тени в реальном времени;

 

    Интеграция в CoreCVS:

 

    реализован класс для Qt, инкапсулирующий логику создан- ной библиотеки;

    реализован адаптер для отрисовки полигональных сеток, от- резков и точек, который принимает на вход классы CoreCVS.

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

[1]     Airsim: High-fidelity visual and physical simulation for autonomous vehicles    /     Shital    Shah,    Debadeepta    Dey,    Chris    Lovett, Ashish Kapoor // Field and service robotics / Springer. 2018. С. 621–635.

[2]     Bishop L, Kubisch C, Schott M. High-performance low-overhead rendering with OpenGL and Vulkan // Proc. of the Game Developers Conference (GDC). 2016.

[3]     Blackert Axel. Evaluation of multi-threading in vulkan. 2016.

 

[4]     CARLA: An Open Urban Driving Simulator / Alexey Dosovitskiy, German Ros, Felipe Codevilla et al. // Conference on Robot Learning. 2017. P. 1–16.

[5]     Cg Toolkit | NVIDIA Developer  //  NVIDIA  Developer.  –  2019.  Режим доступа: https://developer.nvidia.com/cg-toolkit (да- та обращения: 14.12.2019).

[6]     Direct3D    12   programming     guide    -    Win32    apps    //    Technical documentation, API, and code examples |  Microsoft  Docs. –  2019. –  Режим доступа:  https://docs.microsoft.com/en-us/windows/ win32/direct3d12/directx-12-programming-guide (дата обраще- ния: 08.12.2019).

[7]     Filament Materials Guide // GitHub – The world’s leading software development platform. 2019. Режим доступа: https://google. github.io/filament/Materials.html#materialmodels (дата обра- щения: 10.12.2019).

[8]     GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator:              Easy      to integrate Vulkan memory allocation library // GitHub –  The  world’s  leading software development platform. Режим доступа: https:// github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator (дата обращения: 02.04.2020).

[9]     Kessenich John, Ouriel Boaz, Krisch Raun. Khronos SPIR-V Registry

- The Khronos Group Inc //  The  Khronos  Group  Inc.  –  2019.  –  Ре-  жим доступа: https://www.khronos.org/registry/spir-v/ (дата обращения: 08.12.2019).

[10]     Kessenich John,  Ouriel  Boaz,  Krisch  Raun.  SPIR-V  Specification  // The Khronos Group Inc. 2019. Режим доступа: https://www. khronos.org/registry/spir-v/specs/unified1/SPIRV.html (дата обращения: 08.12.2019).

[11]     Khronos Group Inc. KhronosGroup/MoltenVK: MoltenVK is an implementation of the  high-performance,  industry-standard  Vulkan  graphics and compute API, that runs on Apple’s Metal  graphics  framework, bringing Vulkan to  iOS  and  macOS.  //  GitHub  –  The world’s leading software development platform. 2019. –  Режим  до-  ступа: https://github.com/KhronosGroup/MoltenVK (дата обраще- ния:08.12.2019).

[12]     Khronos Group Inc. KhronosGroup/SPIRV-Cross: SPIRV-Cross  is  a practical tool and library for performing reflection on SPIR-V and disassembling SPIR-V back to high level languages. // GitHub – The  world’s leading software development platform. 2019. –  Режим  до-  ступа: https://github.com/KhronosGroup/SPIRV-Cross (дата об- ращения: 08.12.2019).

[13]     Khronos   Group   Inc.   The   OpenGL®   Graphics   System:   A Specification  //  The  Khronos  Group  Inc.  –  2019.  –  Режим   до-  ступа: https://www.khronos.org/registry/OpenGL/specs/gl/ glspec46.core.pdf (дата обращения: 08.12.2019).

[14]     Khronos Vulkan Working  Group and others. Vulkan® 1.1.130 - A Specification (with all registered Vulkan  extensions)  // The  Khronos  Group Inc. 2019. Режим доступа: https://www.khronos.org/ registry/vulkan/specs/1.1-extensions/html/vkspec.html (дата обращения: 08.12.2019).

[15]     Metal   Shading   Language   Specification   //   Apple    Developer.   2019. Режим доступа: https://developer.apple.com/metal/ Metal-Shading-Language-Specification.pdf (дата обращения: 08.12.2019).

[16]     OGRE - Open Source 3D Graphics Engine | Home  of  a  marvelous rendering engine // Ogre3D. 2019. Режим доступа: https:// www.ogre3d.org/ (дата обращения: 14.12.2019).

[17]     Tovey Steven. Vulkan  Memory Management // Proc. of the Vulkanised. 2018.

[18]     Unity Real-Time Development Platform | 3D,  2D  VR  &  AR Visualizations. 2019. Режим доступа: https://www.unity.com/(дата обращения: 08.12.2019).

[19]     What  is  Unreal  Engine  4  //  Unreal  Engine. –  2019. –  Режим  до- ступа: https://www.unrealengine.com/en-US/ (дата обращения: 08.12.2019).

[20]     chaoticbob/SPIRV-Reflect:   SPIRV-Reflect   is    a    lightweight    library that  provides  a  C/C++  reflection  API   for   SPIR-V   shader   bytecode  in Vulkan applications. // GitHub – The world’s leading software development platform. Режим доступа: https://github.com/ chaoticbob/SPIRV-Reflect (дата обращения: 10.12.2019).

[21]     google/filament:   Filament   is    a    real-time    physically    based    rendering   engine   for    Android,    iOS,    Windows,    Linux,    macOS   and    WASM/WebGL    //    GitHub    –    The    world’s    leading    software development platform. 2019. Режим доступа: https://github.com/google/filament (дата обращения: 08.12.2019).

[22]     Пименов Александр. PimenovAlexander/corecvs: Computer Vision primitives library // GitHub  –  The  world’s  leading  software  development platform. 2019. Режим доступа: https://github. com/PimenovAlexander/corecvs (дата обращения: 08.12.2019).