Рубрики
3D мир Программирование

Vulkan API 1: начало работы в VS Code

В данной заметке производится настройка скриптов сборки для VS Code, установка Vulkan API на ОС Windows и создание окна с помощью библиотеки glfw3

Введение

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

В проекте будет использоваться компилятор MinGW (GCC 6.3.0).

В качестве IDE для разработки будет использоваться VS Code ввиду её скорости работы и простоты использования.

Для создания окна будет использоваться библиотека glfw3, которая обладает простым интерфейсом. Скачанную библиотеку необходимо разместить в директории «dependencies» рядом с директорией проекта, так как одни и те же библиотеки будут использоваться в разных проектах.

Для установки Vulkan API необходимо скачать SDK (software development kit) с официального сайта разработчиков. Для установки на операционную систему семейства Windows потребуется 1.1 гигабайт (31.10.21).

После установки можно создать приступить к настройке скриптов VS Code.

Настройка правил сборки

Для начала создадим директории для хранения исходных текстов программ (*.c, *.cpp) и назовем её «src«. Внутри этой директории создадим файл «main.cpp«.

А так же создадим папку для хранения заголовочных файлов (*.h, *.hpp) и назовем её «include«.

После этого настроим задачу сборки по умолчанию из меню «Терминал» выбрав одноименный пункт из этого меню. Содержимое меню представлено на рисунке 1.
Среда разработки уточнит адрес исполняемого файла компилятора и создаст файл.

Рисунок 1 — Содержимое меню «Терминал»

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

Важное примечание: так как для ОС Windows нет особой разницы для написания пути через прямой или обратный слеш, то будет использоваться прямой для совместимости с ОС Linux.
Как следствие автор заменил все двойные обратные слеши на одинарные прямые. Отредактированная версия оригинального скрипта:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe сборка активного файла",
            "command": "C:/MinGW/bin/g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "-g",
                "${file}",
                "-o",
                "${fileDirname}/${fileBasenameNoExtension}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Задача создана отладчиком."
        }
    ],
    "version": "2.0.0"
}

Стоит заметить, что ввиду форматирования страницы некоторые строки из файла занимают 2 и более в браузере.

Ключ «-g» с 9 строки нам не нужен. Его можно удалить.

В рамках курса заметок будет использоваться подход с дроблением исходных текстов программы на разные файлы с последующей компиляцией их в общий исполняемый файл. Для того чтобы собрать все файлы из папки src по шаблону «*.cpp» из директории src заменим 9 строку (10, если не удалять ключ -g) с адресом на:

                "${workspaceRoot}/src/*.cpp",

В дальнейшем при добавлении новых директорий с исходниками файл будет дополняться.

Добавим директорию с заголовочными файлами:

                    "-I${workspaceRoot}/include",

При желании можно указать конкретную версию компилятора:

                    "--std=c++11",

Далее добавим папки include и lib от Vulkan API:

                    "-IC:/VulkanSDK/1.2.189.2/Include",
                    "-LC:/VulkanSDK/1.2.189.2/Lib32",

Внимание! Необходимо проверить версию используемую в названии директории внутри VulkanSDK.

Добавим папки include и lib от GLFW, так как они находятся на уровень выше директории проекта необходимо добавить «../«:

                    "-I${workspaceRoot}/../dependencies/GLFW/include",
                    "-L${workspaceRoot}/../dependencies/GLFW/lib-mingw",

И добавим флаги:

                "-static",
                "-lvulkan-1",
                "-lglfw3dll",

Разберемся с флагами:

  • static — предотвращает линковку с разделяемыми библиотеками в системах, которые поддерживают динамическую линковку;
  • lvulkan-1 — использует статическую библиотеку Vulkan API;
  • lglfw3dll — использует статическую библиотеку GLFW3, подразумевающую дальнейшую работу приложения с динамической библиотекой.

В конце необходимо изменить имя исполняемого файла, для этого заменим строку:

"${fileDirname}/${fileBasenameNoExtension}.exe"

на строку:

"${workspaceRoot}/${workspaceFolderBasename}.exe"

Благодаря этой замене исполняемый файл будет создан в корне проекта с именем директории.

В результате файл должен иметь следующее содержание:

{
    "tasks": [
        {
            "type": "cppbuild",
            "label": "C/C++: g++.exe сборка активного файла",
            "command": "C:/MinGW/bin/g++.exe",
            "args": [
                "-fdiagnostics-color=always",
                "${workspaceRoot}/src/*.cpp",

                "-I${workspaceRoot}/include",

                "--std=c++11",
                
                "-IC:/VulkanSDK/1.2.189.2/Include",
                "-LC:/VulkanSDK/1.2.189.2/Lib32",

                "-I${workspaceRoot}/../dependencies/GLFW/include",
                "-L${workspaceRoot}/../dependencies/GLFW/lib-mingw",
                "-static",
                "-lvulkan-1",
                "-lglfw3dll",
                "-o",
                "${workspaceRoot}/${workspaceFolderBasename}.exe"
            ],
            "options": {
                "cwd": "${fileDirname}"
            },
            "problemMatcher": [
                "$gcc"
            ],
            "group": {
                "kind": "build",
                "isDefault": true
            },
            "detail": "Задача создана отладчиком."
        }
    ],
    "version": "2.0.0"
}

После настроек сборки необходимо указать редактору директории с заголовочными файлами.

Настройка плагина intelliSense

В директории «.vscode» необходимо создать файл «c_cpp_properties.json» со следующим содержимым:

{
    "configurations": [
        {
            "name": "some_name",
            "includePath": [
                "${workspaceFolder}/include",
                "C:/VulkanSDK/1.2.189.2/Include",
                "${workspaceFolder}/../dependencies/GLFW/include",
            ],
            "compilerPath": "C:/MinGW/bin/g++.exe",
            "cStandard": "c11",
            "cppStandard": "c++11",
            "intelliSenseMode": "gcc-x86"
        }
    ],
    "version": 4
}

В данном файле можно изменить настройки intelliSense:

  • includePath — указать директории в которых дополнительно необходимо искать заголовочные файлы;
  • compilerPath — путь до компилятора;
  • cStandard — стандарт языка С;
  • cppStandart — стандарт языка С++;
  • intelliSenseMode — режим работы intelliSense.

Важно помнить что эти настройки распространяются только на плагин intelliSense, а не на компилятор

Создание окна

Рассмотрим следующий код:

#include <vulkan/vulkan.h>

#include <GLFW/glfw3.h>

#include <iostream>

int main(int argc, char* argv[]) {

    // Инициализация GLFW
    glfwInit(); 

    // Проверка доступности Vulkan
    if (glfwVulkanSupported())
    {
        // Отключим создание контекста
        glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
        // Отключим возможность изменения размеров окна
        glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);
        // Создание окна
        GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);

        // Жизненный цикл
        while(!glfwWindowShouldClose(window)) {
            // Обработка событий
            glfwPollEvents();
        }

        // Уничтожение окна
        glfwDestroyWindow(window);
    }
    else
        std::cout << "There is no Vulkan Supported\n";

    // Завершение работы с GLFW
    glfwTerminate();

    return 0;
}

В определении функции main инициализируется glfw вызовом функции glfwInit() и производится проверка поддержки Vulkan.

Вызов функции glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API) отключает создание контекста для OpenGL, а вызов glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE) отключает возможность изменять размеры окна.

Далее создается окно вызовом функции glfwCreateWindow. В качестве параметров принимаются:

  • размеры окна (Ш, В);
  • заголовок;
  • указатель на GLFWmonitor — контекст монитора для запуска в полноэкранном режиме;
  • указатель на GLFWwindow — контекст окна для обмена ресурсами.

Последние два параметра в рамках данного курса не используются.

Далее следует жизненный цикл окна, пока окну не придёт сигнал закрытия от системы. Внутри этого цикла производится обработка событий от ОС вызовом функции glfwPollEvents.

После выхода из цикла происходит уничтожение окна.

В конце функции main происходит завершение работы с библиотекой GLFW вызовом функции glfwTerminate.

Теперь проект можно собрать, вызвав в меню «Терминал» пункт «Запустить задачу сборки».

Перед запуском необходимо положить файл glfw3.dll в корень проекта.

Вывод

В рамках данной заметки была произведена установка библиотек GLFW и Vulkan API, настройка VS code для работы с ними и сборка программы, создающей окно для дальнейшей работы.

Проект доступен в публичном репозитории: 01
Библиотеки: dependencies

2 ответа к “Vulkan API 1: начало работы в VS Code”

Привет. Я не программист, по профессии физик и инженер электроники, но интересно стало сделать игрушку простейшую. Но хочется с нуля самому все изучить, а не использовать готовые движки-конструкторы, но совсем не шарю в программировании, из GemeDev умею только модельки клепать в Maya анимации по типу смешанных форм реализовывать . Вчера читал твой статьи про OpenGL, вывел треугольник на экран, но перевел твой код на C#, он показался легче по сравнению С++. Но я так и не понял из множества статей, что использовать лучше: OpenGL, Vulkan или DX12. Подскажи так как ты имел уже дело как я понимаю с данными библиотеками, что лучше выбрать начинающему, чтоб не прыгать потом с одного на другой?

OpenGL будет простым, но менее производительным по сравнению с Vulkan и DX12. Лично мне DX не нравится тем, что является платформозависимым решением. Многие вещи на OpenGL делаются сильно проще и учебных материалов по нему значительно больше. Перейти с OGL на Vullkan не будет большой проблемой.
Задача ворваться в разработку игр без программирования — не простая, так как в процессе работы встает проблема поиска оптимальных решений по памяти и производительности, что требует знаний в предметной области. Я бы предложил все же поработать с UE4/UE5/Unity для получения понимания того, как работают игры под капотом и какие приемы используются в современных движках.
Но смею заметить что ваше стремление изучить все мне близко. Можете посмотреть канал Cherno на YouTube, где автор пишет свой движок Hazel и описывает встречающиеся у него на пути проблемы
UPD: помимо всего готовые движки имеют важный плюс: готовый инструментарий, который требуется для разработки игры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.