これは何?
Vulkan について勉強したいと思ったけど何もわからなかった。チュートリアルを始める前に、最低限の事前調査をしておこうと思った。
開発環境について調べる
まずどういう環境が必要なのか調べた。自分は macOS 上で開発したいので、それ用の情報を確認した。最低限、以下のものが重要ということがわかった。
LunarG Vulkan SDK
Vulkan アプリケーションをビルド、実行、デバッグするためのライブラリ&ツールをまとめたもの。Vulkan SDK のバージョン番号と Vulkan API のバージョンは対応している (例: SDK が v1.1.70.0 の場合、Vulkan API は 1.1.70)。インストール手順など、その他詳細は公式ドキュメントを読むべし。LunarG 社と Valve 社が開発。Windows、Linux、macOS に対応。Valve 社がスポンサードするコミュニティ LunarXchange の公式サイトからダウンロード可能。なお、この SDK は GitHub 上で公開されている各種コンポーネントを集めたもの。KhronosGroup や LunarG の GitHub リポジトリを確認するとよい。
MoltenVK ライブラリ
macOS 版 LunarG Vulkan SDK に同梱されているライブラリ。念の為、公式ドキュメントに記された概要を読むべし。旧称 "MetalVK"。Vulkan API の macOS/iOS 版実装。根っこの部分では Metal を使って動作する。MoltenVK は Vulkan 用シェーダ言語 SPIR-V を Metal 用シェーダ言語 MSL へ実行時変換する。なお、MoltenVK は ICD (Installable Client Driver) に相当するとのこと。ICD とは Vulkan 互換のディスプレイドライバのことを指す。動作には iOS 9 以上、macOS 10.11 "El Capitan" 以上が必要。
SDK を使う前の準備をする
LunarG Vulkan SDK をダウンロードしたら $HOME などに配置する。SDK 内のツール等を便利につかうため、環境変数にいろいろとパスを通しておいたほうがよい。そこで以下のようなシェルスクリプトを用意する。
# "vulkansdk" の部分を自分の環境に合わせて書き換える
export VULKAN_SDK=/vulkansdk/macOS
export PATH=$VULKAN_SDK/bin:$PATH
export DYLD_LIBRARY_PATH=$VULKAN_SDK/lib:$DYLD_LIBRARY_PATH
export VK_ICD_FILENAMES=$VULKAN_SDK/etc/vulkan/icd.d/MoltenVK_icd.json
これを実行することで環境変数が更新される。正しく設定されているかを確認するために vulkaninfo コマンドを実行してみる。
% vulkaninfo
==========
VULKANINFO
==========
Vulkan Instance Version: 1.1.82
(以下省略)
上記のようなバージョン表示が出力されれば成功。一連の設定を .bash_profile などに追加しておいても良い。
VULKAN_SDK 環境変数
CMake で find_package(vulkan)
を使いたいなら下記のように環境変数を設定しておく。
export VULKAN_SDK=/vulkansdk/macOS
基礎用語を確認する
チュートリアルを始める前に気になった用語があったので意味を調べた。
ローダー
マニュアルの図にあるように、Vulkan アプリケーションは「ローダー」を間に挟んで ICD と繋がっている。また、ローダーは「レイヤー」とも繋がっている。ローダーを介してアプリケーションからICDまでの間に複数の「レイヤー」を挿入することができる。また、複数の ICD をまとめて取り扱うこともできる。ローダーはシステム上で使用可能な ICD を検出する。そうして得られた ICD のリストを基に、アプリケーションが利用可能な物理デバイスの一覧を返す。
レイヤー
Vulkan システムを拡張するためのオプショナルなコンポーネントが「レイヤー」にあたる。レイヤーは、アプリケーション〜ハードウェア間に存在する Vulkan 関数に割り込んだり、Vulkan 関数を評価したり、修正したりする。例えば Vulkan の機能を検証(エラーチェック)するためのレイヤーや、Vulkan API の追跡・デバッグを行うレイヤーなどがある。レイヤーはライブラリとして実装される。VK_LAYER_LUNARG_standard_validation
というメタレイヤー(複数のレイヤーの集合を定義したもの。標準的なレイヤーをこれ1つでまとめて追加できる)を使っておけばよさそう。
インスタンス関連オブジェクト
Vulkan のシステムレベルの情報や機能を提供するオブジェクト。VkInstance
や VkPhysicalDevice
が関係。
デバイス関連オブジェクト
システム上の物理デバイスと機能を関連付けるための識別オブジェクト。VkDevice
、VkQueue
、VkCommandBuffer
が関係。
チュートリアルを始める
ひとまずここまで調べた情報を初期装備として、公式チュートリアルをやっていく。