Всех заглянувших приветствую. Решил, вот, написать цикл текстовых уроков по программированию на Vulkan API. Не секрет, что это очень сложный API, особенно для тех, кто переходит с OpenGL. И, чтобы систематизировать знания в своей голове и изложить их вам, я решил написать цикл таких вот "статеек". А ведь как удобно: если я что-то забыл, могу просто открыть урок по нужной мне теме и восполнить забытый материал. (А забывать тут есть чего, хехе)
Сразу хочу сказать, что не собираюсь писать туториалы по самой 3D графике, по типу как сделать тени, источник света, воду и так далее. Тут и так материала по самому вулкану навалом. Но создание теней в контексте массивов текстур глубины мы как-нибудь рассмотрим.
Свои мысли буду стремиться излагать понятно, чтобы я хоть сам смог понять свою писанину, если буду обращаться к ней потом.
Плюсы перехода на Vulkan очевидны:
- Низкий overhead при вызове команд
- Полный контроль над API
- API является современным. К примеру, сейчас можно реализовать рейтрейсинг на RT ядрах, подобно DXR в DirectX12
Теперь предлагаю рассмотреть основные отличия от OpenGL (и, соответсвенно, DirectX11)
- Команды отрисовки типа glDrawArrays теперь не вызываются одна за другой в основном потоке программы. В vulkan вы должны будете создать Буфер Команд, и записать нужные вам команды с аргументами в этот буфер. Потом при отрисовке все команды из данного буфера будут выполнены.
- Кстати, ещё о выполнении команд. Они теперь выполняются не одна за другой, а в разных потоках асинхронно. Это следует иметь в виду
- Шейдеры хоть и пишутся на том же GLSL, но теперь их надо хранить не в виде исходного текста, а в виде скомпилированного кода. Это сделано специально, чтобы производители видеокарт не городили своих компиляторов для шейдеров. И вместе с этими компиляторами своих специфичных
свистелок и перделокфункций, которые не стандартизированы в Khronos. (Особенно сильно в этом отличилась nvidia). То есть теперь надо будет проводить предварительную компиляцию шейдеров. - OpenGL представлял из себя конечный автомат. Он мог сохранять определенные состояния и изменять их. в Vulkan надо описывать все состояние каждый раз целиком. Если по-простому, в GL вы могли сначала отключить тест глубины и через некоторое время включить смешивание. Здесь же, вы должны будете указывать и смешивание, глубину и шейдеры каждый раз явно.
- Есть некоторые сложности в организации Uniform буферов.
- Да и вулкан по своей SDK больше похож на DirectX11, нежели на OpenGL
- Линейная алгебра. Матрицы теперь немного другие. Программисты библиотеки 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.