Найти в Дзене
Andrew Kopanev

Программируем 3D графику на Vulkan API - Введение

Введение в цикл статей по разработке 3D приложения, используя Vulkan API

Всех заглянувших приветствую. Решил, вот, написать цикл текстовых уроков по программированию на Vulkan API. Не секрет, что это очень сложный API, особенно для тех, кто переходит с OpenGL. И, чтобы систематизировать знания в своей голове и изложить их вам, я решил написать цикл таких вот "статеек". А ведь как удобно: если я что-то забыл, могу просто открыть урок по нужной мне теме и восполнить забытый материал. (А забывать тут есть чего, хехе)

Сразу хочу сказать, что не собираюсь писать туториалы по самой 3D графике, по типу как сделать тени, источник света, воду и так далее. Тут и так материала по самому вулкану навалом. Но создание теней в контексте массивов текстур глубины мы как-нибудь рассмотрим.

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

Плюсы перехода на Vulkan очевидны:

  1. Низкий overhead при вызове команд
  2. Полный контроль над API
  3. API является современным. К примеру, сейчас можно реализовать рейтрейсинг на RT ядрах, подобно DXR в DirectX12

Теперь предлагаю рассмотреть основные отличия от OpenGL (и, соответсвенно, DirectX11)

  1. Команды отрисовки типа glDrawArrays теперь не вызываются одна за другой в основном потоке программы. В vulkan вы должны будете создать Буфер Команд, и записать нужные вам команды с аргументами в этот буфер. Потом при отрисовке все команды из данного буфера будут выполнены.
  2. Кстати, ещё о выполнении команд. Они теперь выполняются не одна за другой, а в разных потоках асинхронно. Это следует иметь в виду
  3. Шейдеры хоть и пишутся на том же GLSL, но теперь их надо хранить не в виде исходного текста, а в виде скомпилированного кода. Это сделано специально, чтобы производители видеокарт не городили своих компиляторов для шейдеров. И вместе с этими компиляторами своих специфичных свистелок и перделок функций, которые не стандартизированы в Khronos. (Особенно сильно в этом отличилась nvidia). То есть теперь надо будет проводить предварительную компиляцию шейдеров.
  4. OpenGL представлял из себя конечный автомат. Он мог сохранять определенные состояния и изменять их. в Vulkan надо описывать все состояние каждый раз целиком. Если по-простому, в GL вы могли сначала отключить тест глубины и через некоторое время включить смешивание. Здесь же, вы должны будете указывать и смешивание, глубину и шейдеры каждый раз явно.
  5. Есть некоторые сложности в организации Uniform буферов.
  6. Да и вулкан по своей SDK больше похож на DirectX11, нежели на OpenGL
  7. Линейная алгебра. Матрицы теперь немного другие. Программисты библиотеки GLM это почему-то до сих пор не замечают, поэтому будем костылировать.

Тут можно перечислять до посинения. Но мы перейдем к делу. А именно, к установке SDK. Переходим на сайт. Качаем последнюю версию для вашей OS. Как установить, думаю, разберетесь - не маленькие.

Для программирования лучше всего использовать именно С++, а не С. Поэтому создаем проект в вашей IDE, далее добавляете папку для include - C:\VulkanSDK\1.2.162.0\Include на Windows, линкуете vulkan-1.dll (его можно найти в C:\VulkanSDK\1.2.162.0\Lib). В качестве "оконной библиотеки" будем использовать SDL2. Она поддерживает Vulkan API и является кроссплатформенной. Найти ее можно тут . Если же у вас какая-нибудь Ubuntu, то все гораздо проще. Откройте терминал и наберите

sudo apt install libvulkan-dev libsdl2-dev -y

И вулкан, и sdl2 теперь у вас установлены.

Требования к аппаратной среде несколько выше, чем у OpenGL. Vulkan для работы требует поддержку данного API в драйверах видеокарты. У Nvidia это 600 серия Geforce GTX (Fermi пролетает), для AMD - работает на всех картах с архитектурой GCN.

В следующей статье рассмотрим начальные действия любого Vulkan приложения, а именно: создание VkInstance, VkDevice, VkPhysicalDevice.