開発環境 (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.exe
とglslc.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;
}
エラーを取り除くため、プロジェクトの設定を変更しましょう。設定をDebug
とRelease
両方のモードに反映したいので、プロジェクトのプロパティを開き、All Configurations
が選択されていることを確認します。
C++ -> General -> Additional Include Directories
を選択し、ドロップダウンボックスから<Edit...>
を押します。
VulkanとGLFW、GLMのヘッダのディレクトリを追加します。
次に、Linker -> General
からライブラリのディレクトリエディタを開きます。
そしてVulkanとGLFWのオブジェクトファイルの場所を追加します。
Linker -> Input
のAdditional 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
:最も重要なコマンドラインユーティリティである、vulkaninfo
とvkcube
。これらを実行することによって、あなたのマシンが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自身が依存しているもので、スレッドとウィンドウ管理に関するものです。
Xxf68vm
と Xi
は、あなたのシステムにまだインストールされていないかもしれません。それらは次のパッケージで見つけることができます。
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.cpp
とMakefile
をディレクトリに保存したら、make
を実行してルールが正しく動作していることを確認してください。これでVulkanTest
実行ファイルができるはずです。
さらに、test
とclean
の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
を選び、プロジェクトの名前を入力したらLanguage
で C++
を選択してください。
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 に、glfw3
とvulkan
を両方とも追加します。ことを簡単にするため、私たちはプロジェクトにダイナミックライブラリを追加します。(スタティックライブラリを使いたい場合は、それらライブラリのドキュメントを参照してください)
- glfwのために、
/usr/local/lib
フォルダを開いてlibglfw.3.x.dylib
といったような名前のファイルを見つけてください("x"はライブラリのバージョン番号で、いつ Homebrew からパッケージをダウンロードしたかによって変わります)。単純にこのファイルを Xcode の Linked Frameworks と Libraries タブにドラッグしてください。 - vulkanのために、
vulkansdk/macOS/lib
を開いてください。libvulkan.1.dylib
とlibvulkan.1.x.xx.dylib
("x"はダウンロードしたSDKのバージョン番号)、両方のファイルについて同じことをしてください。
これらのライブラリを追加した後、同じタブの Copy Files のDestination
を"Frameworks"に変更し、Subpathをクリアして"Copy only when installing"のチェックを外してください。"+"記号をクリックして、ここにもこれら3つのフレームワークを全て追加してください。
最後に、いくつかの環境変数を設定する必要があります。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以外になるはずです。ライブラリからのログは、あなたの構成によって違うメッセージが表示されるかもしれません。
これで本番の準備は万端です。