Vulcan api как настроить

Уроки по OpenGL с сайта OGLDev

Урок 50 — Введение в Vulkan

Думаю, вы как минимум слышали об Vulkan API — новом графическом API от Khronos (некоммерческая организация разрабатывающая OpenGL). Vulkan был анонсирован в феврале 2016, через 24 года после OpenGL, и является полностью новым стандартом и уходом от текущей модели. Я не буду глубоко вдаваться в отличия Vulkan, а только скажу, что он в разы более низкоуровневый чем OpenGL, и даёт разработчику большой контроль над производительностью. Но с большой силой приходит и большая ответственность. Разработчик должен взять под контроль самые разные аспекты, например, буфер команд, синхронизацию и управление памятью; ранее этим занимался драйвер. Но благодаря знанию структуры приложения в деталях, разработчик может добиться максимальной производительности используя Vulkan API нужным ему образом.

На мой взгляд, больше всего в Vulkan людей шокирует то, сколько требуется написать кода просто для того, что бы вывести на экран первый треугольник. В первых уроках по OpenGL для этого потребуется буквально пара строк, но здесь, для многих, желающих начать цикл статей по Vulkan, это становится целым испытанием. Поэтому, как и всегда для OGLDEV, я начну представлять материал по шагам. Мы выведем первый треугольник за пару уроков, понемногу продвигаясь в каждом. Кроме того, я постараюсь не вываливать дюжину вызовов API в одном длинном куске кода, а сразу начну заворачивать в приложение с простым дизайном, который, я надеюсь, пригодится вам для будущих приложений. Но в любом случае, это обучающее приложение, и не стесняйтесь его изменять под себя.

Двигаясь по коду мы будем поочередно изучать ключевые компоненты Vulkan, поэтому сейчас я просто хочу представить общую диаграмму:

Эта диаграмма ни в коем случае не претендует на полноту. Она содержит только основные компоненты, которые будут использоваться в большинстве приложений. Связи между компонентами обозначают зависимости в момент создания, либо перечисления. Например, для создания поверхности требуется экземпляр объекта, а когда вы перечисляете физические устройства системы, то также потребуется экземпляр. Два цвета объясняют наш дизайн в общих чертах. Красный объединяет то, что я бы назвал «ядром», а зелёный те части, которые будут «приложением». Позже мы разберем для чего это нужно. Код самого приложения, которое вы будете писать, будет наследоваться от «приложения», и все его части будут вам доступны для использования. Очень надеюсь, что такой дизайн поможет нам в разработке следующих частей этого цикла по Vulkan.

Подготовка системы

Первое что нам нужно, это проверить, что система поддерживает Vulkan, и подготовить всё для разработки. Вы должны проверить, что ваша видеокарта поддерживает Vulkan, и установить свежие драйвера. Так как Vulkan вышел в свет ещё совсем недавно, то лучше проверять обновления драйверов как можно чаще, там могут быть исправления ошибок. Поскольку существует огромное число GPU, я не могу подробно рассказать о каждом. Обновление / установка драйверов под Windows не должна вызвать затруднений. Под Linix могут потребоваться некоторые танцы с бубном. Для разработки я использую Linux Fedora с видеокартой GT710 от NVIDIA на борту. NVIDIA предоставляет один бинарный файл, который может быть установлен только из командной строки. У других производителей всё может быть иначе. Под Linux вы можете использовать lspci для скана системы и поиска своего GPU. Попробуйте добавить опции -v, -vv и -vvv чтобы увидеть больше деталей.

Далее нам потребуется установить Vulkan SDK от компании Khronos, скачать который можно по ссылке. SDK, помимо заголовочных файлов и библиотек, включает в себя большое число примеров, которые вы можете использовать для лучшего ознакомления с возможностями API. На момент написания урока актуальная версия SDK 1.0.30.0, и я призываю вас регулярно проверять обновления, так как SDK сейчас находится в активной разработке. В нескольких следующих разделах версия будет указываться в командах в явном виде, так что не забывайте изменять её на ту, которую вы устанавливаете.

Linux

Khronos предоставляет запускаемый файл предназначенный для Ubuntu. После запуска он устанавливает всё что требуется, но при запуске под Fedora я столкнулся с некоторыми сложностями. Я использовал следующие команды:

  • bash$ chmod +x vulkansdk-linux-x86_64-1.0.30.0.run
  • base$ ./vulkansdk-linux-x86_64-1.0.30.0.run –target VulkanSDK-1.0.30.0 –noexec
  • base$ ln -s

Эти команды извлекают содержимое пакета без запуска внутренних скриптов. После распаковки директория VulkanSDK-1.0.30.0 будет содержать каталог 1.0.30.0 с файлами пакета. Предположим, что я запускал эти команды находясь в домашнем каталоге (известном как \

/VulkanSDK на каталог с содержимым пакета (с каталогами source, samples, и т.д.). Ссылка упрощает переключение среды разработки на более свежую версию. По ссылке можно получить библиотеки и заголовочные файлы. Чуть позднее мы разберемся с тем, как их использовать. А пока что сделайте следующее:

  • bash$ cd VulkanSDK/1.0.30.0
  • bash$ ./build_examples.sh

Если всё прошло успешно, то примеры были собраны в examples/build. Для их запуска вы должны cd в этот каталог. А теперь попробуйте запустить ./cube и ./vulkaninfo чтобы убедиться, что Vulkan запускается на вашей системе, и получить информацию о драйвере.

Надеюсь, что всё прошло успешно, так что мы можем добавить немного символических ссылок, чтобы удобнее обращаться к файлам, которые нам требуются для разработки. Зайдите под суперпользователем (с помощью вызова su и ввода пароля) и запустите команды:

  • bash# ln -s /home/ /VulkanSDK/x86_x64/include/vulkan /usr/include
  • base# ln -s /home/ /VulkanSDK/x86_x64/lib/libvulkan.so.1 /usr/lib64
  • base# ln -s /usr/lib64/libvulkan.so.1 /usr/lib64/libvulkan.so

С помощью этих трёх команд мы добавили символические ссылки из /usr/include в каталог заголовочных файлов Vulkan. Кроме того, мы добавили ссылки на динамические библиотеки, которые будут использоваться при линковке. Теперь, если мы обновили SDK, то нам требуется только изменить ссылку

/VulkanSDK на местоположение новой версии. Отметим, что вызов команд из-под рута требуется только один раз. После обновления SDK потребуется изменить ссылку только в домашнем каталоге. Вы, конечно, можете дать ссылке любое имя, но код, который идет с моими уроками, предполагает, что она находится в домашнем каталоге.

Windows

Установка под Windows ощутимо проще чем под Linux. Просто скачайте последнюю версию здесь, дважды кликните по файлу установщика, согласитесь со всем, что вам предложат, выберите директорию установки, и, в общем-то, всё. Я бы предложил установить SDK в c:\VulkanSDK для обеспечения совместимости с моим проектом Visual Studio. Если вы устанавливаете куда-то ещё, то не забудьте обновить в проекте директории с заголовочными файлами и библиотеками. Детали вы найдете в следующем разделе.

Сборка и запуск

Linux

Под Linux я в основном разрабатываю в Netbeans. Код, который идет с уроками, содержит проекты сборки Netbeans для C/C++. Если вы установили SDK как я написал выше, то эти проекты должны работать их коробки (и, пожалуйста, сообщайте мне о любых проблемах). Если вы используете другую систему сборки, убедитесь, что вы добавили:

    В команду компиляции: -I

В команду линковки: -L

Даже если вы не используете Netbeans, вы всё ещё можете скомпилировать урок командой make. Netbeans самостоятельно генерирует Makefile. Этого будет достаточно, чтобы проверить настройку системы. Для этого скачайте исходники, разархивируйте их, зайдите в каталог ogldev/tutorial50, а затем запустите команду make. Если вы всё сделали правильно, то вы можете запустить dist/Debug/GNU-Linux-x86/tutorial50 из ogldev/tutorial50.

Windows

Если вы установили SDK в c:\VulkanSDK, то мои проекты Visual Studio должны работать прямо из коробки. Если же нет, или вы хотите создать новый проект Visual Studio, то сделайте так:

Для обновления каталога с заголовочными файлами нажмите на проект в окошке solution explorer, перейдите в Properties, а затем в Configuration Properties -> C/C++ -> General. Теперь вы должны добавить c:\VulkanSDK\ \Include в Additional Include Directories. Пример приведен ниже:

Для обновления каталога с файлами библиотеки нажмите правой кнопкой мыши на проект в окошке solution explorer, перейдите в Properties и затем в Configuration Properties -> Link -> General. Теперь вы должны добавить c:\VulkanSDK\ \Bin32 в поле Additional Library Directories. Пример приведен ниже:

Пока вы ещё настраиваете линковщик зайдите в Input (сразу же под General), а затем добавьте vulkan-1.lib в поле Additional Dependencies.

Общие комментарии

Прежде чем мы перейдем к коду, я бы хотел отметить некоторые мои решения о дизайне приложений с использованием Vulkan.

Многие функции в Vulkan (особенно те, которые создают объекты) принимают на вход параметр — структуру. Такая структура используется как обертка над большей частью параметров, которые нужны функции. Благодаря этому у функций ощутимо меньше входящих параметров. Разработчики Vulkan решили, что первым параметром у таких структур будет свойство sType. Оно имеет перечислимый тип, и для каждой структуры свой код. Это позволяет драйверу определять тип структуры, зная только её адрес. У каждого кода есть префикс VK_STRUCTURE_TYPE_. Например, код структуры используемой при создании экземпляра VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO.

Каждый раз когда я объявляю переменную с типом одной из этих структур, первое что я делаю, это обновляю значение sType. Для экономии бумаги в дальнейшем я не буду это упоминать.

Ещё одно важное замечание об этих структурах — у них очень много свойств, которые нас пока не волнуют. Что бы код был компактнее (а уроки короче…) я всегда буду инициализировать структуры нулями (с помощью нотации struct = <>) и в явном виде обозначать только те свойства, которые не могут быть нулями. Я объясню их в следующих уроках, когда эти свойства будут востребованы.

В Vulkan функции либо являются процедурами, либо возвращают код ошибки в объекте VkResult. Код ошибки является перечислением, где VK_SUCCESS равно 0, а все остальные коды ошибок больше 0. По мере возможностей я добавляю проверку на ошибки. Если возникла ошибка, то я вывожу сообщение в консоль (а в Window в отдельном окошке) и выхожу. Обработка ошибок в реальном приложении слишком усложняет код, а моя задача сохранить простоту.

Многие функции Vulkan (особенно те, которые создают объекты) принимают на вход функцию выделения памяти. Такой подход позволяет контролировать процесс выделения памяти Vulkan. На мой взгляд это тема для уже опытных разработчиков, поэтому мы не будем заморачиваться с этим и всегда будем передавать NULL. В этом случае драйвер будет использовать свою функцию по умолчанию.

Vulkan не гарантирует экспорт своих функций в библиотеке. Это значит, что на некоторых платформах вы можете получить segmentation fault при вызове функции Vulkan так как она оказалась равна NULL. В этом случае вы вынуждены использовать vkGetInstanceProcAddr() для получения адреса функции перед её использованием (вспомним, что в OpenGL для этой проблемы мы использовали GLEW). В моем случае только vkCreateDebugReportCallbackEXT() была не доступна. Эта функция требуется только для дополнительной проверочной прослойки. Поэтому, я решил рискнуть и для всех функций которые я использую в уроке не получать адресов. Если поступят жалобы, то я обновлю код урока.

Источник

Vulkan-tutorial. Урок 1.1 — Вступление

В связи с тем, что у меня не так много времени для ресерча каких-то новых штук и написания статей о них, я решил перевести серию уроков по Vulkan. Надеюсь, что мои переводы будут кому-то полезны и не очень плохого качества. Для начала обучения — прошу под кат.

Автор оригинала дал свое согласие на перевод. Также, когда я доперевожу все статьи и у меня будет время отформатировать их для github, он добавит русский перевод на свой сайт.

В этой части не будет ничего технического, так как я решил сохранить структуру оригинала. Будет рассказано немного о Vulkan, структуре уроков, ссылки на книги и тд.

Часть 1. Вступление

Часть 2. Первый треугольник

  1. Базовая структура
  2. Hello window
  3. Базовый графический пайплайн
  4. Отрисовка
  5. Создание своего Swap Chain

Часть 3. Vertex buffer

  1. Введение
  2. Создание Vertex Buffer
  3. Staging Buffer (промежуточный буфер)
  4. Index Buffer

Часть 4. Uniform Buffer

Часть 5. Текстуры

  1. Загрузка изображений
  2. Image View и Image Sampler
  3. Комбинирование Image Sampler

Часть 6. Буфер глубины
Часть 7. 3D Модели
Часть 8. Mipmaps
Часть 9. Multisampling

Описание

В этих уроках вы научитесь основам Vulkan API. Vulkan это новый API созданный компанией Khronos group (создатели OpenGL), он предоставляет улучшенную абстракцию для программирования графики на современных видеокартах. Новый интерфейс поможет лучше описать как ваше приложение будет работать с графическим процессором, что потенциально может увеличить производительность и уменьшить неожиданные ситуации, связанные с поведением драйвера по сравнению с существующими API, такими как OpenGL и Direct3D. Идеи, лежащие в основе Vulkan, аналогичны идеям Direct3D 12 и Metal, но Vulkan имеет одно неоспоримое преимущество — полную кросс-платформенность, что позволяет разрабатывать приложение одновременно под Linux, Windows и Android.

Взамен, вам придется работать с менее абстрактным и более сложным API. Каждая мелочь, связанная с API, будет настраиваться вами с нуля, включая создание начального буфера кадров и управление памятью для объектов (буферы, текстуры и тд.). Драйвер будет меньше вас ограничивать, а это означает, что вам придется проделать больше работы, чтобы обеспечить правильное поведение вашего приложения.

Вывод — Vulkan не для всех. Он создан для программистов, которым нужно больше производительности, несмотря на более сложный и кропотливый процесс написания приложения. Если вы заинтересованы разработкой игр больше, чем программированием компьютерной графики, то вы можете и дальше использовать OpenGL или DirectX, в любом случае они по-прежнему поддерживаются и не будут вытеснены Vulkan(ом) в ближайшее время. Как альтернативу, можно использовать какой-то игровой движок (Unreal Engine, Unity и тд.), который будет использовать Vulkan, но предоставит вам свою высокоуровневую абстракцию над базовым API.

Теперь давайте рассмотрим что вам надо для изучения Vulkan:

  • Видеокарта и драйвера, совместимые с Vulkan (NVIDIA, AMD, Intel)
  • Знание C++ (понимание RAII, основы языка)
  • Компилятор с поддержкой C++ 17 (Visual Studio 2017+, GCC 7+ или Clang 5+)
  • Опыт работы с 3D графикой

Рекомендую обновить драйвера на видеокарту.

В этой серии уроков от вас не требуется знания OpenGL или DirectX, но предполагается, что вы знакомы с основами 3D графики. Например, тут не будет объясняться математика, лежащая в основе перспективной проекции. Для понимания основ компьютерной графики рекомендую прочесть эту книгу. Другие хорошие ресурсы по графике:

Мы будем использовать С++, но вы также можете писать и на чистом С. Если будете использовать С, вам придется использовать другую библиотеку для линейной алгебры, так же самостоятельно структурировать код, так как мы будем использовать классы для структурирования кода и RAII для управления временем жизни ресурсов. Также существует альтернативная версия руководства для разработчиков на Rust.

Для того, что бы разработчикам на других языках было проще понять, как работать с базовым API, мы будем использовать С версию Vulkan API. Однако, вы можете использовать C++ API, который немного упростит жизнь и поможет избежать некоторых ошибок.

Посмотри на котика и расслабься.

E-Book

Также вы можете скачать это руководство в формате электронной книги (нет русского):

Структура уроков

Для начала мы разберемся с тем, как работает Vulkan, и по шагам разберем, что нам нужно для отрисовки нашего первого треугольника на экране. Мы будем продвигаться маленькими шажочками, смысл которых поначалу будет вам не очень понятен, но потом вы поймете их роль когда увидите картину в целом. Следующим шагом будет настройка среды разработки Vulkan SDK, GLM для линейной алгебры и GLFW для создания окна. В уроках будет показано, как настроить все под Windows + Visual Studio и Ubuntu Linux + GCC.

После чего мы реализуем все основные компоненты для отрисовки нашего первого треугольника. Каждая глава будет иметь примерно следующий вид:

  • Введение. Описание концепции и ее цели.
  • Разберём все нужные нам функций API для использование в нашей программе.
  • Абстрагируем вызовы API внутри наших функций.

Каждая глава написана как продолжение предыдущей, но вы также можете читать их как отдельные статьи, знакомящие вас с определенным функционалом Vulkan, то есть вы можете использовать этот сайт как справочник по функционалу. Все функции и типы Vulkan, описанные тут, будут иметь ссылки на спецификацию, поэтому вы можете ознакомится с ними более подробно. Vulkan — новый API, поэтому в спецификации могут быть некоторые неточности или нехватка информации. Если столкнетесь с какими-то погрешностями, не стесняйтесь и оставляйте отзыв в этом репозитории.

Как упоминалось ранее, Vulkan API достаточно низкоуровневый с множеством настроек, что даёт вам максимальный контроль работы графического конвейера. Это вынуждает нас повторно выполнять большое количество шагов по многу раз. Чтобы этого избежать, мы будем стараться выносить такой функционал в отдельные вспомогательные функции.

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

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

На сайте с оригиналом статьи есть раздел комментариев под основным блоком.

Vulkan — это все еще новый API и best practices еще не сформировались. В случае, если у вас появились какие-то советы, отзывы об учебнике или самом сайте, не стесняйтесь и оставляйте ваши запросы или исправления (можно пулл-реквесты на GitHub). Также можно следить за обновлениями руководства в репозитории.

После выполнения ритуала с рисованием треугольника мы начнем расширять нашу программу. Будем добавлять текстуры, модели и тд. Если у вас уже был опыт графического программирования, то вы знаете, что перед тем, как на экране что-то появится, нужно выполнить много шагов инициализации, создания буферов и тд. В Vulkan этих шагов на порядок больше, но не волнуйтесь, каждый шаг легко понять и вы поймете, что ни один из них не является лишним. Могу обрадовать, переход от скучного треугольника до отрисовки полноценной 3D модели с текстурами не потребует такого большого количества шагов и усилий от нас.

Как правило, рисование треугольника в программировании графики, это как написание «Hello world!» при изучении языка.

Если вы столкнетесь с какими-либо проблемами, следуя руководству, сначала проверьте FAQ, чтобы увидеть, есть ли там ваша проблема и ее решение. Если решение так и не было найдено, не стесняйтесь обращаться за помощью в разделе комментариев в главе.

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

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

Огромное спасибо за исправление моих ошибок и опечаток:
maxzhurkin
Mingun
Также всем остальным и модераторам хабра 🙂

Источник

Читайте также:  Как настроить переменную среды path
Оцените статью