Vulkan-tutorial. Урок 1.1 — Вступление
В связи с тем, что у меня не так много времени для ресерча каких-то новых штук и написания статей о них, я решил перевести серию уроков по Vulkan. Надеюсь, что мои переводы будут кому-то полезны и не очень плохого качества. Для начала обучения — прошу под кат.
Автор оригинала дал свое согласие на перевод. Также, когда я доперевожу все статьи и у меня будет время отформатировать их для github, он добавит русский перевод на свой сайт.
В этой части не будет ничего технического, так как я решил сохранить структуру оригинала. Будет рассказано немного о Vulkan, структуре уроков, ссылки на книги и тд.
Часть 1. Вступление
Часть 2. Первый треугольник
Часть 3. Vertex buffer
Часть 4. Uniform Buffer
Часть 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:
Рекомендую обновить драйвера на видеокарту.
В этой серии уроков от вас не требуется знания OpenGL или DirectX, но предполагается, что вы знакомы с основами 3D графики. Например, тут не будет объясняться математика, лежащая в основе перспективной проекции. Для понимания основ компьютерной графики рекомендую прочесть эту книгу. Другие хорошие ресурсы по графике:
Мы будем использовать С++, но вы также можете писать и на чистом С. Если будете использовать С, вам придется использовать другую библиотеку для линейной алгебры, так же самостоятельно структурировать код, так как мы будем использовать классы для структурирования кода и RAII для управления временем жизни ресурсов. Также существует альтернативная версия руководства для разработчиков на Rust.
Для того, что бы разработчикам на других языках было проще понять, как работать с базовым API, мы будем использовать С версию Vulkan API. Однако, вы можете использовать C++ API, который немного упростит жизнь и поможет избежать некоторых ошибок.
Посмотри на котика и расслабься.
E-Book
Также вы можете скачать это руководство в формате электронной книги (нет русского):
Структура уроков
Для начала мы разберемся с тем, как работает Vulkan, и по шагам разберем, что нам нужно для отрисовки нашего первого треугольника на экране. Мы будем продвигаться маленькими шажочками, смысл которых поначалу будет вам не очень понятен, но потом вы поймете их роль когда увидите картину в целом. Следующим шагом будет настройка среды разработки Vulkan SDK, GLM для линейной алгебры и GLFW для создания окна. В уроках будет показано, как настроить все под Windows + Visual Studio и Ubuntu Linux + GCC.
После чего мы реализуем все основные компоненты для отрисовки нашего первого треугольника. Каждая глава будет иметь примерно следующий вид:
Каждая глава написана как продолжение предыдущей, но вы также можете читать их как отдельные статьи, знакомящие вас с определенным функционалом Vulkan, то есть вы можете использовать этот сайт как справочник по функционалу. Все функции и типы Vulkan, описанные тут, будут иметь ссылки на спецификацию, поэтому вы можете ознакомится с ними более подробно. Vulkan — новый API, поэтому в спецификации могут быть некоторые неточности или нехватка информации. Если столкнетесь с какими-то погрешностями, не стесняйтесь и оставляйте отзыв в этом репозитории.
Как упоминалось ранее, Vulkan API достаточно низкоуровневый с множеством настроек, что даёт вам максимальный контроль работы графического конвейера. Это вынуждает нас повторно выполнять большое количество шагов по многу раз. Чтобы этого избежать, мы будем стараться выносить такой функционал в отдельные вспомогательные функции.
Также в конце каждой главы будет прилагаться исходный код (включая предыдущие уроки). Вы всегда можете заглянуть туда, если у вас возникнет какая-то ошибка и вы захотите сравнить код или будут сомнения в его структуре. Весь код тестировался на нескольких видеокартах от разных производителей, чтобы исключить ошибки, связанные с железом, и проверить корректность исходников.
Вы всегда можете задать вопрос, относящийся к конкретной теме. Пожалуйста, указывайте в коментариях вашу платформу, версию драйвера, исходный код, ожидаемое поведение и фактическое поведение, чтобы люди могли быстро сориентироваться и помочь вам.
На сайте с оригиналом статьи есть раздел комментариев под основным блоком.
Vulkan — это все еще новый API и best practices еще не сформировались. В случае, если у вас появились какие-то советы, отзывы об учебнике или самом сайте, не стесняйтесь и оставляйте ваши запросы или исправления (можно пулл-реквесты на GitHub). Также можно следить за обновлениями руководства в репозитории.
После выполнения ритуала с рисованием треугольника мы начнем расширять нашу программу. Будем добавлять текстуры, модели и тд. Если у вас уже был опыт графического программирования, то вы знаете, что перед тем, как на экране что-то появится, нужно выполнить много шагов инициализации, создания буферов и тд. В Vulkan этих шагов на порядок больше, но не волнуйтесь, каждый шаг легко понять и вы поймете, что ни один из них не является лишним. Могу обрадовать, переход от скучного треугольника до отрисовки полноценной 3D модели с текстурами не потребует такого большого количества шагов и усилий от нас.
Как правило, рисование треугольника в программировании графики, это как написание «Hello world!» при изучении языка.
Если вы столкнетесь с какими-либо проблемами, следуя руководству, сначала проверьте FAQ, чтобы увидеть, есть ли там ваша проблема и ее решение. Если решение так и не было найдено, не стесняйтесь обращаться за помощью в разделе комментариев в главе.
От переводчика:
Ребят, кому интересен данный цикл статей, поставьте лайк или отпишите в комменты, чтобы я знал нужно оно или нет. Если вы заинтересованы, то постараюсь быстро и качественно перевести следующую статью.
Также буду очень рад, если вы будете сообщать мне о всех ошибках, опечатках и предложениях по улучшению переводов. Перевод и написание статьи заняло у меня около дня и никто кроме меня ее не проверял так что могут встречаться ошибки и опечатки.
Огромное спасибо за исправление моих ошибок и опечаток:
maxzhurkin
Mingun
Также всем остальным и модераторам хабра 🙂
Что такое VulkanRT?
Что такое VulkanRT? Вирус или полезная программа?
Одним из самых распространенных вирусов в России является Вулкан. Данное вредоносное программное обеспечение проникает на компьютеры пользователей против их желания и приносит массу проблем. Вследствие этого неудивительно, что у некоторых пользователей установленное на компьютере приложение VulkanRT вызывает опаску. Складывается впечатление, что оно является частью вируса Вулкан, но это не так.
Сегодня мы все чаще сталкиваемся с программой VulkanRT. Но не спешите связывать ее с вирусом. В отличие от одноименного вируса, это приложение несет большую пользу.
Разработкой приложения VulkanRT занимается компания NVidia, которая известна всему миру своими видеокартами для компьютеров. Данная программа необходима, чтобы повысить мощность и производительность компонентов от NVidia в играх и тяжелых приложениях.
Что за программа VulkanRT?
Современные видеокарты поддерживают технологию обработки трехмерных изображений OpenGL. Расширение для работы с OpenGL есть в стандартном наборе драйверов для дискретных видеокарт. Индустрия трехмерных игр не стоит на месте, и существующая технология обработки оказалась устаревшей. Новое поколение видеокарт от GeForce Nvidia для обработки широкополигональных игровых текстур использует новый тип драйверов.
VulkanRT – это (Драйвер) продолжение традиций OpenGL в новом исполнении. Появилась эта технология с релизом Windows 10. Поэтому сегодня все больше пользователей сталкиваются с одноименным процессом в диспетчере задач и системными папками с аналогичным названием.
VulkanRT Nvidia — кроссплатформенное приложение. Софт оказался удачным, и подходит для компьютера, для мобильных устройств и консолей. Разработчики считают технологию удачной за счет оптимизации ресурсов, и потенциала, поэтому в ближайшем будущем она будет применяться в новых устройствах и окончательно заменит устаревшую технологию OpenGL.
Как программа VulkanRT попадает на компьютер?
Главный повод для тревоги – самовольная установка программы в систему. На самом деле – VulkanRT это часть пакета драйверов, поэтому ПО от Nvidia и не запрашивает разрешения пользователя на установку.
По адресу в проводнике C:\Program Files (x86)\VulkanRT\1.0.3.0;
Как удалить VulkanRT?
Как мы отметили выше, приложение VulkanRT не является вирусом, и его удаление приведет к снижению мощности компьютера из-за отсутствия актуальных драйверов для работы видеокарты.
Если вы все же решили удалить VulkanRT, то сделать это можно через файл UnistallVulkanRT в папке с программой, через стандартную «Установку и удаление программ» или с помощью сторонних приложений.
Где и как скачать VulkanRT?
VulkanRT самостоятельно скачивается и устанавливается при обновлении драйверов.
Если у вас выключено автообновление, то зайдите в панель управления, пункт «Система и безопасность», далее «Центр обновления Windows» после чего выбираем «Настройка параметров». Выбираем в меню «Важные обновления» параметр «Устанавливать обновления автоматически».
Теперь вы не пропустите обновление NVIDIA, а вместе с ним и VulkanRT 1.0.3.0.
Скачать VulkanRT (Vulkan Driver) для ОС Windows и Linux.
(Официальный сайт NVIDIA)
Предлагаем посмотреть ролик для оценки возможностей нового поколения OpenGL — Vulkan API:
Так все же вредоносная это программа VulkanRT или нет? Однозначно нет! Просто из-за одинаковых названий её путают с вирусом Vulkan, а точнее «Вулкан казино».
Что означает появление технологии Vulkan для пользователей
На минувшей неделе стало известно о глобальном релизе графических драйверов, которые отныне поддерживают новый низкоуровневый API Vulkan. Первыми, кто обратил внимание на эту новость, стали геймеры с настольными компьютерами, поскольку Vulkan в первую очередь затрагивает работу графической составляющей и со временем должен заменить морально устаревший стандарт OpenGL ES. Последний дебютировал ещё в те времена, когда компьютеры работали на одноядерных процессорах и большинство пользователей даже не задумывались о многоядерных высокопроизводительных устройствах. Однако всё меняется, и число доступных ядер в настольных и мобильных процессорах уже приближается к дюжине. Для максимально эффективного использования их потенциала и была начата работа над новым API.
В общем представлении Vulkan должен принести улучшенный игровой и пользовательский опыт, а также более высокое качество игр, в том числе на Android. По сравнению с традиционными OpenGL и Direct3D, Vulkan предоставляет возможность реализовать многопоточность и более эффективно использовать центральный процессор. Технология изначально основана на разработке от AMD под названием Mantle, однако вскоре идея была подхвачена консорциумом Khronos Group, в который сегодня входит больше 100 членов по всему миру. Vulkan версии 1.0 был выпущен для Windows, Linux и Android. Особенно большое влияние Vulkan окажет именно на мобильную платформу, поскольку предоставит разработчикам прямой доступ к GPU для полного контроля над его работой. Можно ожидать не только повышение качества изображения, но и уменьшение энергопотребления при том же результате.

NVIDIA уже опубликовала необходимые образы для разработчиков, чтобы те могли адаптировать их к нынешним Android-планшетам с чипами NVIDIA, однако сегодня их доля на рынке мизерна. Среди Khronos Group мелькают имена известных производителей, в частности, Google, Samsung, Sony, Qualcomm, Huawei и некоторых других, однако как скоро они начнут внедрять Vulkan, сказать довольно сложно. Хочется верить, что Google сделает Vulkan приоритетной разработкой для Android, однако пока что об этом официально ничего не сообщается.
Vulkan API: что это такое и для чего он нужен в смартфоне
Причем не только у пользователей десктопов, но и в среде поклонников мобильных платформ.
В нашей статье мы вкратце проясним, что это такое вообще, для чего нужно, и почему без него не получится играть.
Что такое API
Мы все пользуемся этой непонятной штуковиной изо дня в день, причем большинство об этом даже не подозревает.
И правильно: ведь один из признаков хорошего программного продукта – отсутствие потребности разбираться, «как оно там работает».
В общем случае суть понятия API довольно-таки проста: это интерфейс или набор протоколов и спецификаций, позволяющий одной программе общаться с другой. Желательно, хотя и не гарантированно, без шаманских танцев с бубном.
В этом случае программа, для работы с которой создается API, выступает в роли некоего «черного ящика»: программисту не надо знать, как там что устроено, ему достаточно набора управляющих команд, на которые последует четко прописанная реакция.
Если говорить о компьютерной графике, то этот интерфейс позволяет «рисовать» на дисплее устройства с минимальными затратами времени программиста.
Все уже продумано и подготовлено, и чтобы получить результат, ему достаточно написать несколько строк кода, вместо «простыней».
Проблемы кроссплатформенности
Тот самый DirectX, о котором говорилось в начале статьи, при своем создании затачивался под вполне конкретную аппаратную и программную платформу. Если конкретнее – под Windows и x86.
Как результат – уже под Linux использовавшие ее игры шли только при посредстве молотка и какой-то матери использования любительских симуляторов с уровнем надежности «As is», т.е., «на свой страх и риск».
Однако к концу десятых такая ситуация была уже неприемлема, и Microsoft пришлось позаботиться о кроссплатформенности. В отличие от «мелкомягкого» API, Vulkan изначально создавался Khronos Group как кроссплатформенный интерфейс.
Этот консорциум еще ранее получил контроль над основным конкурентом DirectX, OpenGL, но развитие трехмерной графики требовало новых решений, свободных от «наследия» прежних лет, продиктованного необходимостью в совместимости.
Где используется Vulkan
На сегодняшний день версии данного API существуют практически для любой актуальной десктопной или мобильной платформы:
Помимо операционных систем, поддержка интерфейса имеется в большинстве современных движков, применяемых для создания игр, таких, как Unreal Engine, Unity, Quake Engine и десятка прочих.
Для пользователей старого «железа» стала неприятным сюрпризом необходимость в аппаратной поддержке новой технологии. Старые видеокарты были просто неспособны использовать Vulkan ни при каких условиях.
Как результат – многие новинки игр, даже при вроде бы приличной производительности системы, попросту не запускались. А некоторые из них стали «проблемными», начиная с определенных версий, как, например, No Man’s Sky.
А что в смартфонах?
В точности такая же картина, как и на десктопах: поддержка нового API заложена не только в самом Android, но и на аппаратном уровне. Графические процессоры чипсетов получили поддержку Vulkan начиная с 2016 года.
Поэтому к настоящему моменту все новые модели смартфонов совместимы с данным интерфейсом, так же как и с другими предназначенными для 3D графики API: OpenGL, OpenCL и DirectX.
Актуальной версией на момент написания статьи является 1.1.
Особо стоит отметить Apple, которая, как обычно, «особенная»: купертинцы активно продвигают в среде создателей мобильных игр собственную API под названием Metal.
Она появилась на год раньше Vulkan, поскольку уже тогда было ясно, что старые интерфейсы исчерпали свои возможности. Результаты использования новинки просто поражали: портированные старые игры получали увеличение производительности по сравнению с OpenGL до 10 раз!
Однако очевидно, что в современных условиях для подобного случая проприетарность – это путь в никуда.
В заключение
С точки зрения пользователя Vulkan не представляет никаких возможностей для непосредственного взаимодействия.
Либо он по умолчанию имеется, и даже знать о его присутствии не обязательно – либо (в случае старых девайсов), его нет, и ничего с этим не поделаешь.
Достаточно знать возможности своего устройства и требования игры, которую на нем предполагается запустить – и этого более чем достаточно.
Vulkan. Руководство разработчика. Краткий обзор
Я работаю техническим переводчиком ижевской IT-компании CG Tribe, которая предложила мне внести свой вклад в сообщество и начать публиковать переводы интересных статей и руководств.
Здесь я буду публиковать перевод руководства к Vulkan API. Ссылка на источник — vulkan-tutorial.com. Поскольку переводом этого же руководства занимается еще один пользователь Хабра — kiwhy, мы договорились разделить уроки между собой. В своих публикациях я буду давать ссылки на главы, переведенные kiwhy.
9. Загрузка моделей
10. Создание мип-карт
FAQ
Политика конфиденциальности
1. Вступление
2. Краткий обзор
Предпосылки возникновения Vulkan
Как и предыдущие графические API, Vulkan задуман как кроссплатформенная абстракция над GPU. Основная проблема большинства таких API заключается в том, что в период их разработки использовалось графическое оборудование, ограниченное фиксированным функционалом. Разработчики должны были предоставить данные о вершинах в стандартном формате и в плане освещения и теней полностью зависели от производителей графических процессоров.
По мере развития архитектуры видеокарт в ней стало появляться все больше программируемых функций. Все новые функции необходимо было каким-то образом объединить с существующими API. Это привело к неидеальным абстракциям и множеству гипотез со стороны графического драйвера о том, как воплотить замысел программиста в современных графических архитектурах. Поэтому для повышения производительности в играх выпускается большое количество обновлений драйверов. Из-за сложности таких драйверов среди поставщиков часто возникают расхождения, например, в синтаксисе, принятом для шейдеров. Помимо этого, в последнее десятилетие также наблюдался приток мобильных устройств с мощным графическим оборудованием. Архитектуры этих мобильных GPU могут сильно отличаться в зависимости от требований по размерам и энергопотреблению. Одним из таких примеров является тайловый рендеринг, который может дать большую производительность за счет лучшего контроля над функционалом. Еще одним ограничением, связанным с возрастом API, является ограниченная поддержка многопоточности, что может привести к появлению узкого места со стороны ЦП.
Vulkan помогает решить эти проблемы, поскольку изначально создан для современных графических архитектур. Это снижает потери на стороне драйвера за счет того, что разработчики могут четко описать свои цели с помощью подробного API. Vulkan позволяет параллельно создавать и отсылать команды в нескольких потоках. Также снижаются расхождения компиляции шейдеров за счет перехода на стандартизованный формат байтового кода и использования одного компилятора. И наконец, Vulkan реализует главную возможность современных видеокарт, объединяя графические и вычислительные возможности в едином API.
Как нарисовать треугольник?
Мы кратко рассмотрим шаги, необходимые для отрисовки треугольника. Это позволит вам получить общее представление о процессе. Подробное описание каждой концепции будет дано в следующих главах.
Шаг 1 — Экземпляр (instance) и физические устройства
Работа с Vulkan начинается с настройки Vulkan API через VkInstance (экземпляр). Экземпляр создается с помощью описания вашей программы и всех расширений, которые вы хотите использовать. После создания экземпляра вы можете запросить, какое оборудование поддерживает Vulkan, и выбрать один или несколько VkPhysicalDevices для выполнения операций. Вы можете сделать запрос по таким параметрам, как размер VRAM и возможности устройств, чтобы выбрать желаемые устройства, если вы предпочитаете использовать специализированные видеокарты.
Шаг 2 — Логическое устройство и семейства очередей
После того, как вы выберете подходящее hardware устройство для использования, вам необходимо создать VkDevice (логическое устройство), где вы более подробно опишете, какие возможности (VkPhysicalDeviceFeatures) будете использовать, например, рендеринг в несколько viewport-ов (multi viewport rendering) и 64-битные числа с плавающей точкой. Вам также необходимо установить, какие семейства очередей вы бы хотели использовать. Многие операции, совершаемые с помощью Vulkan, например, команды рисования и операции в памяти, выполняются асинхронно после отправки в VkQueue. Очереди выделяются из семейства очередей, где каждое семейство поддерживает определенный набор операций. Например, для операций с графикой, вычислительных операций и передачи данных памяти могут существовать отдельные семейства очередей. Кроме того их доступность может использоваться в качестве ключевого параметра при выборе физического устройства. Некоторые устройства с поддержкой Vulkan не предлагают никаких графических возможностей, однако, все современные видеокарты с поддержкой Vulkan, как правило, поддерживают все необходимые нам операции с очередями.
Шаг 3 — Window surface и цепочки показа (swap chain)
Если вас интересует не только внеэкранный рендеринг, вам необходимо создать окно для отображения отрендеренных изображений. Окна можно создать с помощью API исходной платформы или библиотек, таких как GLFW и SDL. В руководстве мы будем использовать GLFW, подробнее о которой мы расскажем в следующей главе.
Цепочка показа — это набор целей рендеринга. Ее задача — обеспечивать, чтобы изображение, которое рендерится в текущий момент, отличалось от отображаемого на экране. Это позволяет отслеживать, чтобы отображались только готовые изображения. Каждый раз, когда нам нужно создать кадр, мы должны сделать запрос, чтобы цепочка показа предоставила нам изображение для рендеринга. После того, как кадр создан, изображение возвращается в цепочку показа, чтобы в какой-то момент отобразиться на экране. Количество целей рендеринга и условий для отображения готовых изображений на экране зависит от текущего режима. Среди таких режимов можно выделить двойную буферизацию (vsync) и тройную буферизацию. Мы рассмотрим их в главе, посвященной созданию цепочки показа.
Некоторые платформы позволяют рендерить непосредственно на экран через расширения VK_KHR_display и VK_KHR_display_swapchain без взаимодействия с каким-либо менеджером окон. Это позволяет создать surface, которая представляет собой весь экран и может использоваться, например, для реализации вашего собственного менеджера окон.
Шаг 4 — Image views и фреймбуферы
Чтобы рисовать в изображение (image), полученное из цепочки показа, мы должны обернуть его в VkImageView и VkFramebuffer. Image view ссылается на определенную часть используемого изображения, а фреймбуфер ссылается на image views, которые используются как буферы цвета, глубины и шаблонов (stencil). Поскольку в цепочке показа может быть множество разных изображений, мы заранее создадим image view и фреймбуфер для каждого из них и выберем необходимое изображение во время рисования.
Шаг 5 — Проходы рендера
Проходы рендера в Vulkan описывают тип изображений, используемых во время операций рендеринга, то, как они используются, и то, как необходимо обрабатывать их содержимое. Перед отрисовкой треугольника мы сообщим Vulkan, что мы хотим использовать одиночное изображение в качестве буфера цвета и что нам нужно очистить его перед рисованием. Если проход рендера описывает только тип изображений, используемых в качестве буферов, то VkFramebuffer фактически связывает определенные изображения с этими слотами.
Шаг 6 — Графический конвейер (pipeline)
Графический конвейер в Vulkan настраивается с помощью создания объекта VkPipeline. Он описывает конфигурируемое состояние видеокарты, например, размер viewport или операцию буфера глубины, а также программируемое состояние, используя объекты VkShaderModule. Объекты VkShaderModule создаются из байтового кода шейдера. Драйверу также необходимо указать, какие цели рендеринга будут использоваться в конвейере. Мы задаем их, ссылаясь на проход рендера.
Одна из наиболее отличительных особенностей Vulkan по сравнению с существующими API-интерфейсами заключается в том, что почти все системные настройки графического конвейера должны задаваться заранее. Это значит, что если вы хотите переключиться на другой шейдер или немного изменить vertex layout, вам необходимо полностью пересоздать графический конвейер. Поэтому вам придется заранее создать множество объектов VkPipeline для всех комбинаций, необходимых для операций рендеринга. Только некоторые базовые настройки, такие как размер viewport и цвет очистки, могут быть изменены динамически. Все состояния должны быть описаны явно. Так, например, не существует смешивания цветов (color blend state) по умолчанию.
К счастью, поскольку процесс больше напоминает опережающую компиляцию, вместо компиляции «на лету», у драйвера появляется больше возможностей для оптимизации, а производительность оказывается более предсказуемой, так как значительные изменения состояния, например, переключение на другой графический конвейер, указываются явно.
Шаг 7 — Пул команд и буферы команд
Как уже было сказано, многие операции в Vulkan, например операции рисования, должны быть отправлены в очередь. Прежде чем отправить операции, их необходимо записать в VkCommandBuffer. Буферы команд берутся из VkCommandPool, который связан с определенным семейством очередей. Чтобы нарисовать простой треугольник, нам нужно записать буфер команд со следующими операциями:
Шаг 8 — Основной цикл
Этот краткий обзор позволяет получить общее представление о предстоящей работе по рисованию вашего первого треугольника. В реальности же шагов гораздо больше. Среди них выделение буферов вершин, создание uniform-буферов и загрузка изображений текстур — все это мы рассмотрим в следующих главах, а пока начнем с простого. Чем дальше мы будем двигаться, тем сложнее будет материал. Обратите внимание, что мы решили пойти хитрым путем, изначально встраивая координаты вершины в вершинный шейдер вместо использования буфера вершин. Такое решение связано с тем, что для управления буферами вершин сначала требуется знакомство с буферами команд.
Подведем краткий итог. Для отрисовки первого треугольника нам необходимо:
Концепты API
В заключение к текущей главе будет приведен краткий обзор того, как структурируются Vulkan API на более низком уровне.
Стандарт оформления кода
Как уже было сказано, Vulkan был разработан для обеспечения высокой производительности при низких нагрузках на драйвер. Поэтому он включает в себя очень ограниченные возможности автоматического обнаружения и исправления ошибок. Если вы сделаете ошибку, драйвер даст сбой или еще хуже, продолжит работать на вашей видеокарте, но выйдет из строя на других видеокартах.
Поэтому Vulkan позволяет запускать расширенные проверки с помощью функции, известной как слои валидации. Слои валидации — это фрагменты кода, которые могут быть вставлены между API и графическим драйвером для выполнения дополнительных проверок параметров функций и отслеживания проблем по управлению памятью. Это удобно тем, что вы можете запустить их во время разработки, а затем полностью отключить при запуске программы без дополнительных затрат. Любой пользователь может написать свои собственные слои валидации, но Vulkan SDK от LunarG предоставляет стандартный набор, который мы будем использовать в руководстве. Вам также необходимо зарегистрировать функцию обратного вызова для получения сообщений отладки от слоев.
Поскольку операции в Vulkan расписываются очень подробно, и слои валидации достаточно обширные, вам будет намного проще установить причину черного экрана по сравнению с OpenGL и Direct3D.
Остался всего один шаг, прежде чем мы начнем писать код, и это — настройка рабочей среды.

















