Vulkan API — урок 4. Интеграции GLFW (+листинг)

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

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

Во вторых – стоит набраться терпения. Сейчас мы все готовим, что бы нарисовать простой трехцветный треугольник, помните про те самые заветные 8 шагов? Когда мы их пройдем (и настрочим ~ 700 сток кода), то увидим:

 tr

А после этого все пойдет уже проще, ну а теперь к самому уроку.

Интеграции GLFW

Vulkan работает вполне себе прекрасно и без создания окна, в случае, когда вы хотите использовать его для закадрового рендеринга, но что-то показать будет куда как интереснее!

Для начала заменим строчку #include <vulkan/vulkan.h> на:

#define GLFW_INCLUDE_VULKAN
#include <GLFW/glfw3.h>

Таким образом GLFW будет содержать собственное определение и автоматически загружать заголовочный Vulkan’a. Добавив функцию initWindow и добавив её вызов в начале функции run. Мы будем использовать эту функцию для инициализации GLFW и создания окна.

void run() {
    initWindow();
    initVulkan();
    mainLoop();
}

private:
    void initWindow() {

    }

В initWindow для начала мы должны вызвать glfwInit(), что инициализирует библиотеку GLFW. Из-за того что GLFW изначально был разработан для создания контекста OpenGL, нам необходимо передать команду, что этот самый контекст OpenGL нам создавать не нужно:

glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);

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

glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);

Теперь нам осталось только создать окно. Добавим GLFWwindow* window; в приватную секцию для хранения ссылки и инициализируем окно при помощи:

window = glfwCreateWindow(800, 600, "Vulkan", nullptr, nullptr);

Первые три параметра означают ширину, высоту и заголовок окна. Четвертый — указывает конкретный монитор, на котором окно должно появиться. Последний параметр нужен только для OpenGL.

Хорошая идея — использовать константы вместо жестко заданных ширины и высоты, т.к. мы будем использовать эти значения в будущем несколько раз. Потому выше в классе следует добавить следующие строки:

const int WIDTH = 800;
const int HEIGHT = 600;

и создавать окно таким образом:

window = glfwCreateWindow(WIDTH, HEIGHT, "Vulkan", nullptr, nullptr);

Функция initWindow теперь должна выглядеть таким образом:

void initWindow() {
    glfwInit();

    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
    glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);

    window = glfwCreateWindow(WIDTH, HEIGHT, "Vulkan", nullptr, nullptr);
}

Для того, окно бы окно оставалось открытым, пока его работе не помешает какая-либо ошибка или оно не будет закрыта пользователем, добавим цикл событий в mainLoop:

void mainLoop() {
    while (!glfwWindowShouldClose(window)) {
        glfwPollEvents();
    }
}

Этот цикл, по сути, ждет пока будет вызван эвент закрытия окна. В этом цикле в будущем мы так же будем вызывать функцию рендера кадра.

После запуска этой программы вы должны увидеть окно с заголовком «Vulkan». Теперь мы имеем скелет приложения Vulkan!

Код уроков 3 и 4. Внимание, код будет работать и на UNIX подобных системах!

Main Admin

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

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