【自作ゲームエンジン開発】Vulkan ウィンドウの作成

はじめて読む方へ

この記事はサイト主が【自作ゲームエンジン開発】を行うまでのほぼ全行程を記事にまとめたものです。

主自体はC++からVulkanから何まで初心者のため、同じようなレベルの人の役に立てればと書いています。

上級者の方々にはあまりおすすめできない記事ですのでご了承ください。

前の記事→【自作ゲームエンジン開発】Vulkan 環境構築

自作ゲームエンジン開発記事一覧→【自作ゲームエンジン開発】記事一覧

GLFW Windowの作成

それでは早速進めていきましょう。公式のチュートリアル通り解説していってもただ長々と書くだけになるので簡潔に重要だと思ったところの解説をしていきます。

長々と説明するなら公式の呼んでもらった方がいいよね…ね?

コード

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

#include <iostream>
#include <stdexcept>
#include <cstdlib>

class HelloTriangleApplication {
    GLFWwindow* window;

    const uint32_t WIDTH = 800;
    const uint32_t HEIGHT = 600;

public:
    void run() {
        initWindow();
        initVulkan();
        mainLoop();
        cleanup();
    }

private:
    void initWindow() {
        glfwInit();

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

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

    void initVulkan() {

    }

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

    void cleanup() {
        glfwDestroyWindow(window);

        glfwTerminate();
    }
};

int main() {
    HelloTriangleApplication app;

    try {
        app.run();
    }
    catch (const std::exception& e) {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

これが最終的なコードです。

重要なところのまず一つ目は


    void initWindow() {
        glfwInit();

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

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

initWindowの中のこの部分です。

glfwInit()を実行することによってGLFWライブラリが初期化されます。

glfwWindowHint();を使用するとオプションを適用することができます。今回は以下の二つのオプションを使用しています。

glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);を実行するとOpenGLコンテキストの作成を無効にできます。Vulkanを使う際はOpenGLコンテキストは必要ないので無効にします。

OpenGLコンテキストを無効にしたwindowはglfwMakeContextCurrent()glfwSwapBuffers()に渡してはいけません。エラーになります。

glfwWindowHint(GLFW_RESIZABLE, GLFW_FALSE);ではwindowのサイズ変更を無効にしています。

window = glfwCreateWindow(WIDTH, HEIGHT, "Vulkan", nullptr, nullptr);このコードはwindowの初期化を行っています。第一引数から順番に、”幅”,”高さ”,”ウィンドウ名”を指定しています。

第四引数にはwindowを表示するモニターの指定をしていて、今回は”nullptr”にしています。

第五引数にはOpenGLにのみ関連するオプションなのでこちらも”nullptr”に設定しています。

次に重要なのは以下の部分です。

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

メインのコードにもなるのですが、!glfwWindowShouldClose(window)このコードでwindowが閉じられているか毎回チェックして閉じられていなければglfwPollEvents();このコードでマウス操作やキーイベントなどを拾っています。

×を押すのもwindowを移動させるものglfwPollEvents();がイベントとして受け取って処理をしているのでこのコードがないと×でwindowを閉じることも出来ません。

最後にclearnup()が実行されるとウィンドウを破棄してメモリを解放、終了します。

さいごに

少し適当になってしまった気がするけど許してください。

早く次の工程に進みたい(o^―^o)ニコ

コメント

タイトルとURLをコピーしました