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

Автор оригинала: Alexander Overvoorde
  • Перевод
  • Tutorial

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


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


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


Содержание

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


  1. Общее вступление
  2. Краткий обзор
  3. Настройка окружения

Часть 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


  1. Layout и Buffer
  2. Pool и Set

Часть 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
Также всем остальным и модераторам хабра :)

Комментарии 50

    +3

    Kurwa. У меня валялось в закромах 10 из 30 запланированых туториалов по вулкану, 20 из которых я так и не дописал...)

      0

      Было бы супер, я могу отформатировать и указать, что ты перевёл

        +1

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

          0

          Можно подумать и сделать свою серию уроков, но это требует больше времени чем перевод

            +5

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

      0
      так что могут встречаться ошибки и опечатки.

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

        +1

        Спасибо за рекомендации. Я завтра утром пройдусь и поправлю орфографию

          0
          и пунктуацию
          0
          Спелчекер не только не поможет избавиться от всех (я бы даже сказал, большинства) ошибок, но, в силу своего несовершенства, может спровоцировать на те, которых не было бы без него: например, вы правильно написали текст, содержащий «делать что-то по многу раз». А тут он такой и говорит «а что это у вас за слово такое непонятное „многу“?» и вы убираете пробел и получаете текст с ошибкой, на который он «не ругается».

          P.S. в запятые, IMHO, спелчекеры ещё долго не смогут даже (или особенно) с ИИ
        • НЛО прилетело и опубликовало эту надпись здесь
            +3

            Doom ethernal, Doom 2016 и Dota 2 у меня нормально работали на вулкане. ЧЯДНТ?

              +1
              поддержку Вулкана удалили из движка UE и Юнити

              А пруфы есть?
                +3

                Нет у него пруфов, так как никто не удалили его, как минимум из ue. 4.23 — vulkan есть

                0

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

                  +3

                  И не думаю, что стоит тратить время на эти холивары. Я решил перевести, что бы помочь сообществу. Читать или не читать — дело каждого, индивидуально.

                    0

                    Я тоже предпочитаю ogl, но не собираюсь ни с кем спорить по поводу «чей х** длиннее». Если бы у меня было время, я бы писал свои авторские статьи по openGL или С++ в целом. Но имеем, что имеем.
                    Добра вам :)

                      +2

                      Пока читал глаза на лоб полезли. Попробую по порядку:
                      Базовыми примерами давно дефакто стали SaschaWillems/VulkanExamples, там всё работает, ну кроме RTX(у меня intel graphics старенькая). Именно этот исчерпывающий пак рекомендуют в официальном канале для отработки навыков, подсмотреть, ну может немного для обучения. Когда-то были проблемы собилдом проектов, но по большей части из-за отсутствия и кривых ссылок ассетов, что в принципе не мешало код подсмотреть и воспроизвести его у себя.
                      Про не работающие игры — нужна конкретика, я слежу за тредом на реддите, и не заметил глобальных проблем не неподдерживаемыми драйверами, или еще какими-то проблемами. Единичные случаи есть, эти запросы уходят в сервис разработчикам игр, а не драйверов.
                      За последний год поддержка у NV и AMD стала хуже — это как поняли? Я каждую неделю обновляю стабильные и бета драйвера с поддержкой новых плюшек для Vk. Проверьте vulkan.gpuinfo.org версии драйверов для ваших видеокарт и поддержку VK, если есть хотя бы поддержка 1.1 — это уже вполне самостотятельный релиз, на котором выпустили разные Doom доты и т.д. Кстати даже Intel регулярно драйвера обновляет.
                      Используйте DX12, не зря поддержку Вулкана удалили из движка UE и Юнити. — где пруфы? Её недвно(в 2019) только ввели, куда удалять, зачем удалять? Да и не верю я этому утверждению.
                      По вашим багрепортам — хотел бы посмотреть, что за проблема, может для себя что-то узнаю полезное.

                      • НЛО прилетело и опубликовало эту надпись здесь
                          0

                          Давайте вы будете устраивать холивар в лс. Использовать или не использовать дело сугубо каждого.

                            0

                            Да вы белены обьелись. Вот вам скриншот из полностью пройденного Doom Ethernal, который ничего кроме вулкана не использует.


                            Шо на 1080ti, шо на rtx 3080 работает нормально. Дота тоже работает с вулканом, пусть фпс и ниже чем на dx11.
                            Вэлвовский протон использует vulkan чтобы транслировать вызовы dx9.

                              0

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

                                0

                                Я работаю с Вулканом уже несколько лет — мы разрабатываем кросплатформенный продукт с единственным поддерживаемым графическим АПИ. За все время я не столкнулся с багами лично ни разу. Все проблемы с некорректной работой были связаны с неправильным использованием АПИ. Являясь постоянным участником форумов/чатов я так же НЕ могу сказать, что сломанные драйверы частая тема обсуждений. В комментарии к приведенной проблеме о сломанных примерах DiligentSamples разработчик утверждает, что никто с подобной проблемой не обращался, т.е. это единичный случай, причиной может быть что угодно. Про отказ UE и Unity от Вулкана я не слышал, и гугл, видимо, тоже. На DigitalFoundry есть подробный рассказ о Doom Eternal, где рассказывается, что мощь движка кроется как раз в использовании Вулкана. Многгие мои стим-игры, которые я запускаю под линуксом, используют Вулкан, причем они транслируют dx вызовы и все работает. Рекомедую использовать современный АПИ всем и всегда.

                                • НЛО прилетело и опубликовало эту надпись здесь
                                    0

                                    Т.е. вы просто игнорируете мой пост выше о том, что вулкан используется в proton трансляторе и в idtech 7

                                      0

                                      Я делаю не супер-сложный продукт, но и не просто демку. Еще я около 10 лет проработал в игровой индустрии, в том числе программистом графики. За все это время я ни разу не столкнулся с "багами GPU". Я не исключаю, что такое может быть, но когда мне говорят, что в каждая написанная демка работает некорректно и при этом обвиняют GPU — это звучит странно, и я почти уверен, что проблема в коде.

                                        0

                                        У меня была проблема с OPENGL компиляторами шейдеров. У трёх вендоров геометрические шейдеры компилировались совершенно по-разному) Поэтому пришлось наловить кучу багов прежде чем получился шейдер, который компилится нормально на всех трёх основных вендорах.

                              0
                              Пользуясь случаем, хотел поинтересоваться — есть ли какие-то материалы по WebGPU? Если кто не в курсе, это следующее поколение WebGL в котором будет реализован низкоуроневый подход, характерный для Vulkan. Вроде бы Tensorflow.js основанный на новом API получит прирост производительности до 10 раз.
                              С одной стороны уже 2 года как заявлено намерение реализовать WebGPU в Chrome. С другой стороны, до поддержки браузерами еще далеко
                              Есть еще страничка с примером от Babylon вот она, но у меня не запустилось, нужен Мак.
                                +1

                                Цикл статей интересен, могу помочь с переводом.
                                Вулкан после openGL каким-то совсем низкоуровневым оказался, и я его с наскоку не осилил(

                                  0

                                  Был бы благодарен за помощь

                                    0
                                    По сравнению с классическим старым opengl или opengl core? Core версия тоже достаточно низкоуровневая, дает доступ к заливке данных в видеокарту (вершины, дополнительные данные для расчетов, и пр), плюс всегда заставляет описать как минимум вершинный и фрагментный шейдеры.
                                      0

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

                                        0

                                        Eсли отчасти код GLSL шейдеров в рантайме генерится, приложению придётся с собой таскать компилятор в spir-v или как-то можно заставить его съесть GLSL?

                                          0

                                          SPIR-V байткод универсально поддерживается. Нужно только вложить его в дистриб и всё.

                                            0

                                            а glsl без "компиляции" в spirv поддерживается? мне наоборот, не вложить, а в рантайме генерировать, тогда glslangValidator с собой таскать, хоть и в виде библиотеки, или можно как-то прямо glsl скормить?

                                              0

                                              Придётся таскать с собой валидатор тогда. Всё, что не SPIR-V, это уже инструменты от третьих сторон.

                                                0

                                                Всё равно скармливается "драйверу" видеокарты, который сам по себе glsl понимает и компилировать умеет. Ровно так же как и spir, просто из промежуточного представления. Spir опять же никто руками в бинарном виде не пишет. Так что непонятно что мешает вулкану скормить видеокарте шейдер на glsl, а не через промежуточный spir.

                                      0

                                      Как ни странно, вулкан понятнее, чем OpenGL, если почитать про устройство GPU.

                                      0
                                      Как я понял, вы, по сути, решили перевести вот этотсайт целиком. Как раз по нему изучаю вулкан, но там в туториале, как по мне, много вещей не объясняется, либо объясняется сумбурно, в стиле «но вот тут у нас девайс еще занят обработкой предыдущих кадров, поэтому тут мы передаем VkFence, а вот туда — VkSemaphore», и во многом это выглядит как «доверься мне и пиши так, как я сказал, объясню в следующих главах (но не факт)». Код примера во многом синтетический, не очень хорошо объясняется, как архитектурно разбить получающуюся в туториале портянку кода. Вообще не видел примеров того, как тут сработать с многопоточностью, чего очень бы хотелось. Например, могу ли я создать VkDevice один для всех потоков, или должен создавать по одному на поток? Ну и еще куча попутных вопросов. Кстати, в комментарии под статьями там тоже стоит заглянуть. Помимо этого хотелось бы оставить ссылку на репозиторий V-EZ, там есть хорошая документация и проекты с примерами.
                                        0

                                        Спасибо за отзыв, я постараюсь раскрыть немного больше. Буду добавлять комментарии от себя. Если какой-то момент в последующих уроках вам покажется непонятным — пишите и я объясню более подробно (в меру своих знаний).

                                          +5
                                          К слову о том, что мне конкретно не понравилось в том туториале — как по мне, для начала стоило бы начать с оперируемых сущностей, чтобы можно было четко сформулировать понимание того, зачем они нужны, с приведением архитектурно-понятных аналогий. Например, начать с этой схемы, обведя в ней своею рамочкой, какие сущности как по смыслу сгруппировать, где что используется. Пробежаться вкратце по всему сразу. Если можно, параллельно привести аналогии из OpenGL. Цель — от общей картины постепенно переходить к деталям, а не как на том сайте — «вот на этом этапе нам надо создать эту хрень, значит создаём. Она нам понадобится в будущем». Подход того туториала похоже на «вот эту деталь несите сюда, ту прикрутите туда, а что именно мы собираем — объясню и покажу в конце». За деревьями леса не видно. Также минус — там пишут код «с заделом на будущее», а потом непонятно какие части его заменяются; приходится открывать ссылку на готовый cpp-файл, что приведен внизу страницы, и самостоятельно соотносить, где что. Опять же, все вышеперечисленное очень субъективно.
                                            +2

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

                                              0
                                              Буду очень признателен!
                                            0

                                            Я не знаю, связан ли этот web.archive.org/web/20180103131302/http://vulkanapi.ru/ сайт с вами, но там есть перевод vulkan-tuttorial.com. Я даже успел изучить материал до какого-то уровня, пока сайт не закрылся. Может найдете для себя что-то полезное. Автора не нашел, хотел предложить продлить аренду домена)

                                              +1
                                              сайт со мной не связан, не видел его. Думаю, что будет полезно.
                                              Продлевать домен не вижу смысла, так как я залью перевод на гит и он будет на сайте автора статей.
                                          0
                                          Будет ли перевод дальше? Вот только начал изучение из первоисточника, но техничный английский тяжело мне идет, жду вашего перевода.
                                            0
                                            Да, переводы продолжаются. Часть уроков будет переводить другой пользователь хабра habr.com/ru/users/alexandra_sky
                                            0
                                            Очень жду продолжения
                                              0
                                              Уже есть. Обновил ссылки
                                              0
                                              Ребят, кому интересен данный цикл статей, поставьте лайк или отпишите в комменты, чтобы я знал нужно оно или нет

                                              ++
                                                0

                                                Спасибо за ответ :)
                                                Сейчас она https://habr.com/ru/users/alexandra_sky/ занимается переводом. У меня не особо есть время в связи с работой.

                                              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                              Самое читаемое