6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Vulkan Tutorial (Development environment) 日本語訳

Last updated at Posted at 2022-06-18

開発環境 (Development environment)

この章ではVulkanアプリケーションを開発するための環境をセットアップし、いくつかの有益なライブラリをインストールします。我々が使うツールはコンパイラを除けば全て、Windows、Linux、MaxOSで互換性があります。ただし、それらをインストールする手順は少し違うので、それぞれにわけて説明します。

Windows

あなたがWindowsで開発しているなら、Visual Studioを使ってコンパイルしていると仮定します。C++17をサポートするために、あなたは Visual Studio 2017 か 2019 を使う必要があります。下記の解説はVS2017向けに書かれています。

Vulkan SDK

Vulkanアプリケーションを開発するために最も重要なコンポーネントはSDKです。それはヘッダ、標準バリデーションレイヤ、デバッグツール、Vulkan関数のローダを含んでいます。ローダは実行時にドライバから関数を探します。もしGLEWに慣れ親しんでいるなら、OpenGLに対するGLEWと似たようなものだと思ってください。

SDKはLunarGのウェブサイトから、ページ下部のボタンを押すとダウンロードできます。アカウントを作る必要はありませんが、作っておくと追加のドキュメントにアクセスできたり、あなたにとって有用かもしれません。

SDKをインストールする中で、インストールする場所に気をつけてください。まずはじめに私達がやることは、グラフィックスカードとドライバが、きちんとVulkanをサポートしているかどうか確かめることです。SDKをインストールしたディレクトリに移動し、Binディレクトリを開いてvkcube.exeデモを実行します。すると次のように表示されるはずです:

エラーメッセージが表示された場合は、ドライバが最新であること、Vulkanランタイムが含まれていること、グラフィックスカードがサポートされていることを確認してください。主要ベンダーのドライバへのリンクは、「はじめに」の章を参照してください。

このディレクトリには他にも役に立つプログラムがあります。それはglslangValidator.exeglslc.exeで、人間が読めるGLSLからバイトコードへとコンパイルするときに使います。これについてはシェーダモジュールの章で深く見ていきます。BinディレクトリにはVulkanローダとバリデーションレイヤのバイナリも含まれており、Libディレクトリにはライブラリが含まれています。

最後に、Vulkanのヘッダファイルを格納したIncludeディレクトリがあります。他のファイルについて見て回っても構いませんが、それらのファイルはこのチュートリアルでは必要ありません。

GLFW

以前も述べたように、Vulkan自身はプラットフォーム不可知論者なAPIで、レンダリング結果を表示するためのウィンドウを作るツールは含まれていません。クロスプラットフォームというVulkanのアドバンテージを活かすためと、Win32の恐怖を避けるため、私たちはウィンドウを作るのにGLFWライブラリを使います。それはWindows,Linux,MacOSをサポートしています。SDLのように、同様の目的のライブラリは他にもありますが、GLFWの利点は、ウィンドウの作成以外にもVulkanのプラットフォーム特有のものを抽象化できることです。

公式サイトで最新のGLFWのリリースを見つけることができます。このチュートリアルでは64ビットバイナリバージョンを使いますが、もちろんあなたは32ビットバージョンを選択することもできます。その場合は、Vulkan SDK バイナリのディレクトリとして、Libの代わりにLib32をリンクするようにしなければいけません。ダウンロードが完了したら、アーカイブを好きな場所に展開してください。私はVisual Studioディレクトリの中にLibrariesディレクトリを作るようにしました。

GLM

DirectX 12 とは違い、Vulkanは線形代数ライブラリを含んでいませんので、どこかからダウンロードしてくる必要があります。GLMはグラフィックスAPIと共に使うために設計された良いライブラリで、OpenGLと一緒によく使われています。

GLMはヘッダオンリーライブラリなので、ただ最新バージョンをダウンロードして便利な位置に配置するだけです。ディレクトリ構成は次のようなものになるでしょう。

Visual Studioのセットアップ (Setting up Visual Studio)

必要なものを全てインストールしたので、Vulkan のための Visual Studio プロジェクトを立ち上げて、全てが上手く動いているか確かめる、ちょっとしたコードを書くことができます。

Visual Studio を起動して、プロジェクトの新規作成からWindows Desktop Wizardを選択し、名前を入力してOKボタンを押します。

デバッグメッセージを出力する場所が必要なので、アプリケーションタイプにConsole Application (.exe)が選択されていることを確認してください。そしてEmpty Projectにチェックを入れて、Visual Studio がボイラープレートコードを追加することを防止してください。

OKボタンを押してプロジェクトを作成し、C++ソースファイルを追加してください。あなたは既にその方法を知っていると思いますが、念のためステップを以下に示しておきます。

それでは、以下のコードをファイルに追加してください。今は理解できなくても大丈夫です。我々はコンパイルとVulkanアプリケーションの実行ができることを確認したいだけです。次の章でスクラッチから始めます。

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

#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>

#include <iostream>

int main() {
    glfwInit();

    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
    GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);

    uint32_t extensionCount = 0;
    vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);

    std::cout << extensionCount << " extensions supported\n";

    glm::mat4 matrix;
    glm::vec4 vec;
    auto test = matrix * vec;

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

    glfwDestroyWindow(window);

    glfwTerminate();

    return 0;
}

エラーを取り除くため、プロジェクトの設定を変更しましょう。設定をDebugRelease両方のモードに反映したいので、プロジェクトのプロパティを開き、All Configurationsが選択されていることを確認します。

C++ -> General -> Additional Include Directoriesを選択し、ドロップダウンボックスから<Edit...>を押します。

VulkanとGLFW、GLMのヘッダのディレクトリを追加します。

次に、Linker -> Generalからライブラリのディレクトリエディタを開きます。

そしてVulkanとGLFWのオブジェクトファイルの場所を追加します。

Linker -> InputAdditional Dependenciesのドロップダウンボックスから<Edit...>を押します。

VulkanとGLFWのオブジェクトファイルの名前を入力します。

最後に、コンパイラがC++17の機能をサポートするように変更します。

これでプロジェクトのプロパティダイアログは閉じても大丈夫です。もし全て正しく行えていれば、エラーは表示されないようになったはずです。

最後に、64ビットモードでコンパイルされていることを確認します。

F5を押してコンパイルと実行すると、次のようなコマンドプロンプトとウィンドウが表示されるはずです。

拡張(extensions)の数は0以外になるはずです。おめでとうございます。Vulkanで遊ぶ準備ができました!

Linux

これらの説明は Ubuntu、Fedora、Arch Linux ユーザー向けになっていますが、パッケージマネージャ固有のコマンドを適切なものに置き換えることによって対応できるはずです。C++17をサポートしたコンパイラ(GCC 7+ または Clang 5+)が必要です。makeもまた必要です。

Vulkan Packages

LinuxでVulkanアプリケーションを開発するのに最も重要なコンポーネントは、Vulkanローダ、バリデーションレイヤ、そしてあなたのマシンでVulkanが使えるかどうかテストする、いくつかのコマンドラインユーティリティです。

  • sudo apt install vulkan-tools または sudo dnf install vulkan-tools:最も重要なコマンドラインユーティリティである、vulkaninfovkcube。これらを実行することによって、あなたのマシンがVulkanをサポートしているか確認できます。
  • sudo apt install libvulkan-dev または sudo dnf install vulkan-loader-devel : Vulkanローダをインストールします。ローダは実行時にドライバから関数を探します。もしGLEWに慣れ親しんでいるなら、OpenGLに対するGLEWと似たようなものだと思ってください。
  • sudo apt install vulkan-validationlayers-dev spirv-tools または sudo dnf install mesa-vulkan-devel vulkan-validation-layers-devel : 標準バリデーションレイヤと必要なSPIR-Vツールをインストールします。これらはVulkanアプリケーションをデバッグするときに重要で、これについては後の章で議論します。

Arch Linux においては、sudo pacman -S vulkan-develで上記の全ての必要なツールをインストールできます。

インストールに成功した場合、Vulkan部分の設定は完了です。忘れずにvkcubeを実行し、以下のようなウィンドウがポップアップ表示されることを確認してください。

エラーメッセージが表示された場合は、ドライバが最新であること、Vulkanランタイムが含まれていること、グラフィックスカードがサポートされていることを確認してください。主要ベンダーのドライバへのリンクは、「はじめに」の章を参照してください。

GLFW

以前も述べたように、Vulkan自身はプラットフォーム不可知論者なAPIで、レンダリング結果を表示するためのウィンドウを作るツールは含まれていません。クロスプラットフォームというVulkanのアドバンテージを活かすためと、X11の恐怖を避けるため、私たちはウィンドウを作るのにGLFWライブラリを使います。それはWindows,Linux,MacOSをサポートしています。SDLのように、同様の目的のライブラリは他にもありますが、GLFWの利点は、ウィンドウの作成以外にもVulkanのプラットフォーム特有のものを抽象化できることです。

次のコマンドでGLFWをインストールします。

sudo apt install libglfw3-dev

または

sudo dnf install glfw-devel

または

sudo pacman -S glfw-wayland # X11ユーザーなら glfw-x11

GLM

DirectX 12 とは違い、Vulkanは線形代数ライブラリを含んでいませんので、どこかからダウンロードしてくる必要があります。GLMはグラフィックスAPIと共に使うために設計された良いライブラリで、OpenGLと一緒によく使われています。

それはヘッダオンリーライブラリで、libglm-dev または glm-devel パッケージからインストールできます。

sudo apt install libglm-dev

または

sudo dnf install glm-devel

または

sudo pacman -S glm

Shader Compiler

人間が読めるGLSLからバイトコードへシェーダをコンパイルするプログラム以外の、必要なものが全てそろいました。

2つの有名なシェーダコンパイラは、Khronos グループの glslangValidatorと Google の glslcです。後者はGCCやClangと似たような使い方ができるので、それを使います。Ubuntuでは、Googleの非公式バイナリをダウンロードして、glslc/usr/local/binにコピーしてください。権限によっては、sudoが必要になるかもしれません。Fedora では sudo dnf install glslc、Arch Linux では sudo pacman -S shaderc を実行してください。テストとしてglslcを実行すると、コンパイルするシェーダを渡さなかったと正当な文句を言われるでしょう。
glslc: error: no input files
我々はシェーダモジュールの章でglslcについて詳しく説明します。

makefileプロジェクトのセットアップ (Setting up a makefile project)

必要なものを全てインストールしたので、Vulkan のための makefile プロジェクトを立ち上げて、全てが上手く動いているか確かめる、ちょっとしたコードを書くことができます。

新しいディレクトリを、VulkanTestのような名前で、便利な場所に作成します。main.cppというソースファイルを作成し、次のソースコードを挿入してください。今は理解できなくても大丈夫です。我々はコンパイルとVulkanアプリケーションの実行ができることを確認したいだけです。次の章でスクラッチから始めます。

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

#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>

#include <iostream>

int main() {
    glfwInit();

    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
    GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);

    uint32_t extensionCount = 0;
    vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);

    std::cout << extensionCount << " extensions supported\n";

    glm::mat4 matrix;
    glm::vec4 vec;
    auto test = matrix * vec;

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

    glfwDestroyWindow(window);

    glfwTerminate();

    return 0;
}

次に、この基本的なVulkanコードをコンパイルして実行するためにmakeファイルを記述します。Makefileという名前で空のファイルを作成してください。変数やルールがどのように働くかのような、makefileの基本的な経験が既にあると仮定します。もしそうでない場合はこのチュートリアルで素早く学んでください。

はじめに、ファイルの残りの部分を簡単にするためにいくつかの変数を定義します。CFLAGSという変数を定義し、基本的なコンパイラフラグを設定します:

CFLAGS = -std=c++17 -O2

我々は現代的なC++を使います(-std=c++17)。そして最適化レベルをO2に設定します。-O2はコンパイル時間を短くするために取り除いてもいいですが、リリースビルドのときにはもとに戻すようにしなければいけません。

同様に、リンカーフラグをLDFLAGS変数に定義します:

LDFLAGS = -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi

-lglfwフラグはGLFWのため、-lvulkanはVulkanローダとリンクするためのもので、残りのフラグはGLFWが必要とする低レベルシステムライブラリです。残りのフラグはGLFW自身が依存しているもので、スレッドとウィンドウ管理に関するものです。

Xxf68vmXi は、あなたのシステムにまだインストールされていないかもしれません。それらは次のパッケージで見つけることができます。

sudo apt install libxxf86vm-dev libxi-dev

または

sudo dnf install libXi libXxf86vm

または

sudo pacman -S libxi libxxf86vm

VulkanTestをコンパイルするためのルールを指定するのは簡単です。スペースの代わりにタブでインデントしなければいけないことに注意してください。

VulkanTest: main.cpp
    g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS)

main.cppMakefileをディレクトリに保存したら、makeを実行してルールが正しく動作していることを確認してください。これでVulkanTest実行ファイルができるはずです。

さらに、testcleanの2つのルールを定義します。前者は実行ファイルを実行し、後者はビルドした実行ファイルを削除します。

.PHONY: test clean

test: VulkanTest
    ./VulkanTest

clean:
    rm -f VulkanTest

make testを実行するとプログラムが正しく実行され、Vulkan拡張の数が表示されるはずです。空のウィンドウを閉じると、アプリケーションはリターンコード0で終了するはずです。以上を合わせた完全なmakefileは以下のようになります:

CFLAGS = -std=c++17 -O2
LDFLAGS = -lglfw -lvulkan -ldl -lpthread -lX11 -lXxf86vm -lXrandr -lXi

VulkanTest: main.cpp
    g++ $(CFLAGS) -o VulkanTest main.cpp $(LDFLAGS)

.PHONY: test clean

test: VulkanTest
	./VulkanTest

clean:
    rm -f VulkanTest

あなたはこのディレクトリをVulkanプロジェクトのテンプレートとして使うことができます。コピーを作成し、HelloTriangleのような名前にリネームし、main.cpp内のコードを全て削除してください。

これで本当の冒険の準備は整いました。

MacOS

以下の解説は、XcodeとHomebrewパッケージマネージャを使っていると想定しています。また、MacOS バージョン 10.11 以上が必要で、デバイスがMetal APIをサポートしている必要があります。

Vulkan SDK

Vulkanアプリケーションを開発するために最も重要なコンポーネントはSDKです。それはヘッダ、標準バリデーションレイヤ、デバッグツール、Vulkan関数のローダを含んでいます。ローダは実行時にドライバから関数を探します。もしGLEWに慣れ親しんでいるなら、OpenGLに対するGLEWと似たようなものだと思ってください。

SDKはLunarGのウェブサイトから、ページ下部のボタンを押すとダウンロードできます。アカウントを作る必要はありませんが、作っておくと追加のドキュメントにアクセスできたり、あなたにとって有用かもしれません。

MacOS用のSDKは内部でMoltenVKを使っています。MacOS上でのVulkanのネイティブサポートは無いので、MoltenVK は Vulkan API 呼び出しを Apple の Metal グラフィックスフレームワークへと変換するレイヤーとして動作します。これによって、Apple の Metal フレームワークのデバッグとパフォーマンスの利点を利用することができます。

ダウンロードが終わったら、単純に中身を好きなフォルダに展開してください(Xcodeでプロジェクトを作るときに参照する必要があることを忘れないでください)。展開されたフォルダのうち、ApplicationsフォルダにはSDKを使ったいくつかのデモの実行ファイルが含まれています。vkcubeという実行ファイルを実行すると、次のように表示されます。

GLFW

以前も述べたように、Vulkan自身はプラットフォーム不可知論者なAPIで、レンダリング結果を表示するためのウィンドウを作るツールは含まれていません。私たちはウィンドウを作るのにGLFWライブラリを使います。それはWindows,Linux,MacOSをサポートしています。SDLのように、同様の目的のライブラリは他にもありますが、GLFWの利点は、ウィンドウの作成以外にもVulkanのプラットフォーム特有のものを抽象化できることです。

MacOSでGLFWをインストールするため、Homebrewパッケージマネージャでglfwパッケージを入手します。

brew install glfw

GLM

Vulkanは線形代数ライブラリを含んでいませんので、どこかからダウンロードしてくる必要があります。GLMはグラフィックスAPIと共に使うために設計された良いライブラリで、OpenGLと一緒によく使われています。

それはヘッダオンリーライブラリで、glm パッケージからインストールできます。

brew install glm

Setting up Xcode

これで必要なものは全てインストールしたので、Vulkanのための基本的なXcodeプロジェクトをセットアップできます。ここで説明することのほとんどは、基本的に多くの「パイプ」の役割で、全ての依存関係をプロジェクトにリンクすることができます。また、以下の説明でvulkansdkフォルダに言及するときは、あなたが Vulkan SDK を展開したフォルダを参照していることに注意してください。

Xcodeを起動し、新しいXcodeプロジェクトを作ります。開いたウィンドウから Application > Command Line Tool を選択します。

Nextを選び、プロジェクトの名前を入力したらLanguageC++を選択してください。

Nextを押すとプロジェクトが作られたはずです。それでは、生成されたmain.cppを以下のコードに書き換えましょう。

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

#define GLM_FORCE_RADIANS
#define GLM_FORCE_DEPTH_ZERO_TO_ONE
#include <glm/vec4.hpp>
#include <glm/mat4x4.hpp>

#include <iostream>

int main() {
    glfwInit();

    glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
    GLFWwindow* window = glfwCreateWindow(800, 600, "Vulkan window", nullptr, nullptr);

    uint32_t extensionCount = 0;
    vkEnumerateInstanceExtensionProperties(nullptr, &extensionCount, nullptr);

    std::cout << extensionCount << " extensions supported\n";

    glm::mat4 matrix;
    glm::vec4 vec;
    auto test = matrix * vec;

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

    glfwDestroyWindow(window);

    glfwTerminate();

    return 0;
}

このコードが何をやっているか、理解する必要はまだありません。我々は全てが上手く動いていることを確認するために、API 呼び出しのセットアップをしているだけです。

Xcode は既に、ライブラリが見つからないなどいくつかのエラーを表示しているはずです。私たちはこれらのエラーを取り除くためにプロジェクトの設定を開始します。Project Navigator パネルからあなたのプロジェクトを選択してください。Build Settings タブを開いて:

  • Header Search Paths フィールドを見つけて/usr/local/includeへのリンクを追加してください。(これはHomebrewがヘッダをインストールする場所で、glmとglfw3のヘッダファイルがここにあるはずです)そしてVulkanのヘッダファイルのためにvulkansdk/macOS/includeへのリンクを追加してください。
  • Library Search Paths フィールとを見つけて/usr/local/libへのリンク(これもHomebrewがライブラリをインストールする場所で、glmとglfw3のlibファイルがここにあるはずです)とvulkansdk/macOS/libへのリンクを追加してください。

以下のようになるはずです(もちろん、パスはあなたのファイルの場所によって変わります):

Build Phases タブの中の Link Binary With Libraries に、glfw3vulkanを両方とも追加します。ことを簡単にするため、私たちはプロジェクトにダイナミックライブラリを追加します。(スタティックライブラリを使いたい場合は、それらライブラリのドキュメントを参照してください)

  • glfwのために、/usr/local/libフォルダを開いてlibglfw.3.x.dylibといったような名前のファイルを見つけてください("x"はライブラリのバージョン番号で、いつ Homebrew からパッケージをダウンロードしたかによって変わります)。単純にこのファイルを Xcode の Linked Frameworks と Libraries タブにドラッグしてください。
  • vulkanのために、vulkansdk/macOS/libを開いてください。libvulkan.1.dyliblibvulkan.1.x.xx.dylib("x"はダウンロードしたSDKのバージョン番号)、両方のファイルについて同じことをしてください。

これらのライブラリを追加した後、同じタブの Copy FilesDestinationを"Frameworks"に変更し、Subpathをクリアして"Copy only when installing"のチェックを外してください。"+"記号をクリックして、ここにもこれら3つのフレームワークを全て追加してください。

Xcode の設定は次のようになったはずです:

最後に、いくつかの環境変数を設定する必要があります。Xcode のツールバーでProduct > Scheme > Edit Scheme...と選択し、Argumentsタブで次の2つの環境変数を追加してください:

  • VK_ICD_FILENAMES = vulkansdk/macOS/share/vulkan/icd.d/MoltenVK_icd.json
  • VK_LAYER_PATH = vulkansdk/macOS/share/vulkan/explicit_layer.d

次のようになるはずです:

ついに、全ての準備ができました!ここで、プロジェクトを実行したら(あなたの選択に応じて、ビルド構成をDebugまたはReleaseに設定するのを忘れないでください)、以下のように表示されるはずです:

拡張の数は0以外になるはずです。ライブラリからのログは、あなたの構成によって違うメッセージが表示されるかもしれません。

これで本番の準備は万端です。

前の記事
次の記事

6
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?