Vulkan (API)

**Vulkan**（ヴァルカン）は、クロノス・グループ（）が策定している、「PCやコンソールから、携帯電話や組込みプラットフォームに至るまで、あらゆるデバイスで使われる最先端のGPUに高効率かつクロスプラットフォーム型のアクセスを実現する、新世代のグラフィックス/コンピュートAPI」で、オープンスタンダード・ロイヤリティフリー・クロスプラットフォームとして提唱されている。Vulkan 1.0の仕様の公開日は2016年2月16日である。

グラフィックスハードウェア層に近いローレベル (low level) な制御を目的としており、これによりオーバーヘッドを低減し、ハードウェアの性能を限界まで引き出すことが可能となる。VulkanはAppleのMetalやマイクロソフトのDirect3D 12といった先発のローレベルAPIと競合するが、プラットフォーム独自の固有仕様ではなく、様々なデバイスやオペレーティングシステムをターゲットにできることが特徴である。

## 経緯
Vulkanが出現する以前、クロスプラットフォームなグラフィックスAPIとしてOpenGLおよびOpenGL ESがすでに存在していた。しかし、OpenGL黎明期のハードウェア設計に由来する互換性重視のAPI設計は徐々に陳腐化し、OpenGL 4に至る頃にはすでに最新のGPUハードウェア設計との乖離が発生してしまっていた。また、OpenGL/OpenGL ESはハードウェアを高度に抽象化しており、そのためプラットフォーム間の移植性やアプリケーション開発者にとっての利便性は高いものの、AAAタイトルのゲームなどに代表されるような性能要求の厳しいソフトウェアの開発に利用する場合はオーバーヘッドが大きくなってしまい、ハードウェアの限界性能を引き出すことができなくなってしまうという問題を抱えていた。オーバーヘッドの増加による描画効率の低下はまた電力効率の低下にも直結するため、モバイル機器など電力供給の限られるデバイスにおいても効率面での影響は無視できない。

このため、SIGGRAPH 2014で、レガシーな設計が蓄積しているOpenGLをリセットし、ゼロから構築し直して刷新する、次世代の標準3D API規格 (OpenGL Next Generation, glNext) の策定が始められることがアナウンスされた。このとき、マルチスレッド対応やシェーディング中間言語などの近代的な技術が導入されることが発表された。

GDC 2015では、新規格の名称が**"Vulkan"**となることが発表され、Direct3D 12同様のコマンドキューベースのマルチスレッドレンダリング機能や、OpenCLとのプログラミング基盤共通化をもたらす**SPIR-V**中間表現を導入することが明らかにされた。また、VulkanにはAMD独自のローレベルグラフィックスAPIであるMantleが要素技術として取り込まれることが発表された。「Vulkan（ヴァルカン）」の名前の由来は公式には示されていない。同綴のVulkan（フルカン）はドイツ語で "火山" を意味する単語であり、これを挙げるニュースサイトが少数存在するが、根拠のあるものでないことに注意が必要である。

2015年8月には、GoogleがAndroidにおいてVulkanをサポートする旨を発表。

2016年2月16日、Vulkan 1.0の正式仕様がリリースされた。Vulkan仕様のリリースとともに、AMD、NVIDIA、インテル、クアルコム、といった代表的なベンダーはVulkan対応ドライバーのベータ版の提供や認証を開始した。Androidにおいては、2016年8月リリースのAndroid 7.0 (Nougat) からOSレベルの対応が開始された。実際にVulkanが利用できるかどうかは、システムがVulkan対応GPUを搭載しているかどうかにも依存する。Android 9 (Pie) 以上でVulkan 1.1 APIに対応しており、また64ビット版のAndroid 10を最初から搭載するデバイスはVulkan 1.1のサポートが必須となっている。

なお、Vulkanはハードウェアの詳細な制御を可能とするローレベルAPIである一方、従来のOpenGLはCPU-GPU間の同期などの煩雑な処理を自動で行なってくれる上位層のAPIとして、今後もメンテナンスおよびアップデートが継続されることになっている。

## パイプライン
Vulkanはパイプライン方式であり、グラフィックスパイプラインとコンピュートパイプラインを定義している。

### グラフィックスパイプライン

**グラフィックスパイプライン**（）は3Dモデル描画のためにVulkanがサポートする一連の操作である。

グラフィックスパイプラインは複数のシェーダーステージ・複数の固定機能パイプラインステージ・1つのパイプラインレイアウトで構成される。*Primitive Shading* モードの場合、以下のステージから構成される：

# *Input Assembler*
# *Vertex Shader*: 頂点シェーダー
# *[[テッセレーション]]*
## *Tessellation Control Shader*
## *Tessellation Primitive Generator* (*Tessellator*)
## *Tessellation Evaluation Shader*
# *Geometry Shader*: ジオメトリシェーダー
# *Vertex Post-Processing*: クリッピング、座標標準化など
# *Rasterization*: ラスタライズ
# *Early Per-Fragment Tests*
# *Fragment Shader:* フラグメントシェーダー
# *Late Per-Fragment Tests*
# *Blending*

### コンピュートパイプライン
**コンピュートパイプライン**（）は1つの静的コンピュートシェーダーステージと1つのパイプラインレイアウトで構成される。

## シェーディング言語
Vulkanのシェーダーはで記述される。

SPIR-Vは他の高級シェーダー言語からプレコンパイルできる。Vulkanがサポートする最初の高レベルシェーディング言語は、OpenGLと同じくGLSLとなる。Vulkan SDKに付属するオフラインシェーダーコンパイラー**glslangValidator**には、入力としてHLSLで書かれたソースコードを使うことができるようになるコンパイルオプションも存在する。

## 開発環境

Vulkanの公式ソフトウェア開発キット (SDK) として、Valve社の協力のもと社が**LunarG Vulkan SDK**をリリースしている。同SDKはWindows、Linux、およびmacOSに対応している。macOSに関しては後述のMoltenVKを間接的に利用している。このSDKはiOSには対応していない。

また、Vulkanに対応するデバイスドライバーや独自のSDK開発を所望するベンダー向けに、ICD (Installable Client Driver) ローダーやアーキテクチャに関するドキュメントがGitHubにて公開されている。

Androidにおいては、2016年6月にリリースされたリビジョン12以降のNDKでVulkan 1.0に正式対応している。なお、Android 10ではベンダードライバーによるOpenGL ES実装以外に、後述するVulkanバックエンドのANGLEを利用したOpenGL ES 2.0互換実装も利用できるようになっている。

### 補助ライブラリ
*  - OpenGL向けのマルチプラットフォームライブラリであるが、バージョン3.2以降でVulkanにも対応した。
* vulkan-cpp - Googleの提供するVulkan用のC++向け抽象化ライブラリ。ライセンスはApache License 2.0。
* V-EZ - AMDの提供するVulkan用の簡略化ミドルウェア。
* Anvil - AMDの提供するVulkan用フレームワーク。ライセンスはMITライセンス。
* Falcor - NVIDIAの提供するVulkanおよびDirectX 12用のレンダリングフレームワーク。
* Vulkan Memory Allocator - AMDの提供するVulkan用メモリ管理ライブラリ。ライセンスはMITライセンス。
*  - 各種3DグラフィックスAPIをバックエンドに利用できるOpenGL ES互換レイヤー。2021年3月現在、OpenGL ES 3.1対応のVulkanバックエンドが完成している。

### 言語バインディング
* Vulkan-Hpp - Vulkan APIのC++バインディング。Khronos Groupが提供している。ライセンスはApache License 2.0。元々NVIDIAで開発された。
* VulkanSharp - Vulkan APIの.NETバインディング。Mono Projectが提供している。ライセンスはMITライセンス。

### 互換レイヤー
Vulkan APIの制定元であるKhronos GroupはVulkan APIをAppleのMetal API上で使うための互換レイヤー「」を提供している。ライセンスはApache License 2.0。

またMicrosoftはVulkan APIをDirect3D 12 API上で使うためのMesaのDznバックエンドの開発を推進している。なおそれ以前も同種のものとしてVulkanOnD3D12やRostkatzeが存在していたもののどちらも開発停止中となっていた。

## MoltenVK
アップルのmacOS/iOS上では、Vulkanは2021年6月時点でネイティブサポートされていないが、Metal APIを利用してVulkanを実現する**MoltenVK**（旧称MetalVK）の開発が Brenwill Workshop によって進められている。

2018年2月26日に、クロノスはValve、LunarG、Brenwill Workshopとの協業によるMoltenVKのオープンソース化を発表した。これによりmacOS/iOSでもVulkanおよび開発ツールを無償で利用可能になった。SPIR-V/GLSLをMetal Shading Language (MSL) に変換するコマンドラインのツールMoltenVKShaderConverterも用意されている。

GLFWはバージョン3.3にて、MoltenVKを経由することでmacOS上でVulkanをサポートするようになった。

## ベンダー横断のサポート
初期の仕様では、VulkanはOpenGL ES 3.1またはOpenGL 4.x以上をサポートする現行ハードウェアで動作することが述べられていた。Vulkanをサポートするために新しいグラフィックスドライバーが要求されるようになると、OpenGL ES 3.1またはOpenGL 4.x以上をサポートするすべての既存デバイスが必ずしもVulkanドライバーを利用できるわけではなくなった。

### Intel、NVIDIA、AMD
主要なPC向けGPUベンダー3社はすべて、LinuxおよびWindowsシステム向けのドライバーの形で、無料のVulkan API実装を提供している。Vulkan 1.2は比較的新しいハードウェアでサポートされており、Intel Skylake以降（Linuxの場合はBroadwell以降）、AMD GCN第2世代以降、NVIDIA Kepler以降などで利用できる。AMD、Arm、Imagination Technologies、Intel、NVIDIA、Qualcommは、2018年後半以降の実際のハードウェアをVulkan 1.1ドライバーにてサポートしている。Mesa 18.1は、RADVとANVILドライバーにてAMDとIntelのハードウェアをサポートしている。Mesa 3Dにおける実際のRADVおよびANVILの状態については、Mesamatrixを参照のこと。

### Google Android
多くのAndroid搭載ハードウェアは、OpenGL ES仕様をサポートしているが、前述のようにVulkan対応状況はハードウェアとデバイスドライバー、そしてOSバージョンに左右される。Android 7.0 (Nougat) 以降でVulkan 1.0を、またAndroid 9.0 (Pie) 以降でVulkan 1.1をサポートする。

### Apple
2021年6月時点で、AppleデバイスによるVulkan APIのネイティブサポートはない。iOSおよびmacOS向けのサポートもAppleからは発表されていない。この問題に対する回避策として、前述のようにオープンソースライブラリのを使用する方法がある。MoltenVKはMetal API上に構築されたVulkan実装を提供するものであり、iOSとmacOSデバイス上で動作する。ただし、この方法にはいくつかの制限がある。

### Qualcomm
Qualcomm Snapdragonプラットフォーム向けのAdreno 5xx（2018）および6xxシリーズのGPU（Snapdragon 820など）は、Vulkan 1.0をAdreno GPU SDK経由でサポートしている。SDKはAndroid Studio IDEをベースとしており、すべての機能を利用するにはAndroid NDKが必要である。

## 脚注

## 関連項目
* OpenGL
* OpenGL ES
* GLSL
* OpenCL
* Mantle (API)
* Metal (API)
* Direct3D 12
* :en:Standard Portable Intermediate Representation

## 外部リンク
* 
* 
*