Vulkanとは
Vulkan(ヴァルカン)は、
クロノス・グループによって策定された、次世代のグラフィックスおよびコンピュートAPIです。PC、コンソールゲーム機、スマートフォン、組み込みシステムなど、幅広いプラットフォームに対応しており、オープンスタンダードかつロイヤリティフリーで利用できます。
2016年2月16日にVulkan 1.0の仕様が公開されました。
Vulkanは、グラフィックス
ハードウェアのより深い層を制御することを目的としており、これによりオーバーヘッドを削減し、
ハードウェアのポテンシャルを最大限に引き出すことが可能です。
AppleのMetalやMicrosoftの
Direct3D 12といったローレベルAPIと競合しますが、Vulkanはプラットフォームに依存しないため、様々なデバイスや
オペレーティングシステムに対応できる点が大きな特徴です。
Vulkan登場の背景
Vulkanが登場する以前は、
OpenGLおよび
OpenGL ESが
クロスプラットフォームなグラフィックスAPIとして広く利用されていました。しかし、
OpenGLは古い
ハードウェア設計をベースにしているため、最新のGPU
ハードウェアとの乖離が進んでいました。また、
OpenGLは
ハードウェアを高度に抽象化しているため、移植性や開発の利便性は高いものの、AAAタイトルゲームのような高負荷なソフトウェアではオーバーヘッドが大きく、
ハードウェアの性能を十分に引き出せないという課題がありました。
描画効率の低下は電力効率の低下にもつながるため、モバイルデバイスでは特に深刻な問題でした。そこで、SIGGRAPH 2014で、
OpenGLを刷新し、ゼロから再構築する次世代標準3D API規格(glNext)の策定が発表されました。この際、マルチスレッド対応やシェーディング
中間[[言語]]などの近代的な技術の導入が示されました。
GDC 2015では、新規格の名称が「Vulkan」となることが発表され、
Direct3D 12と同様のコマンドキューベースのマルチスレッドレンダリング機能や、
OpenCLとのプログラミング基盤共通化のためのSPIR-V中間表現の導入が明らかにされました。また、AMDのローレベルグラフィックスAPIであるMantleの要素技術がVulkanに取り込まれることも発表されました。
Vulkanという名称の由来は公式には発表されていませんが、同綴のドイツ語で「火山」を意味する単語であるという説が一部で取り上げられています。
2015年8月には、
GoogleがAndroidでのVulkanサポートを発表し、
2016年2月16日にはVulkan 1.0の正式仕様がリリースされました。主要なGPUベンダーもVulkan対応ドライバーの提供を開始し、Android 7.0 (Nougat) からOSレベルでのサポートが開始されました。
Vulkanのパイプライン
Vulkanはパイプライン方式を採用しており、グラフィックスパイプラインとコンピュートパイプラインの2種類があります。
グラフィックスパイプライン
グラフィックスパイプラインは、3Dモデルの描画処理を行う一連の操作です。複数の
シェーダーステージ、固定機能パイプラインステージ、および1つのパイプラインレイアウトで構成されます。Primitive Shading モードの場合、以下のステージを経由します。
1. Input Assembler
2. Vertex Shader (頂点
シェーダー)
3. テッセレーション(Tessellation Control Shader, Tessellation Primitive Generator, Tessellation Evaluation Shader)
4. Geometry Shader (ジオメトリ
シェーダー)
5. Vertex Post-Processing(クリッピング、座標標準化など)
6. Rasterization (ラスタライズ)
7. Early Per-Fragment Tests
8. Fragment Shader (フラグメント
シェーダー)
9. Late Per-Fragment Tests
10. Blending
コンピュートパイプライン
コンピュートパイプラインは、1つの静的コンピュート
シェーダーステージと1つのパイプラインレイアウトで構成されます。
シェーディング言語
Vulkanの
シェーダーはSPIR-Vで記述されます。SPIR-Vは他の高級
シェーダー言語から事前にコンパイル可能です。Vulkanでは、
OpenGLと同様にGLSLが最初の高レベルシェーディング
言語としてサポートされています。また、Vulkan SDKに付属するオフライン
シェーダーコンパイラーglslangValidatorでは、HLSLで書かれたソースコードも入力として使用可能です。
開発環境
Vulkanの公式
ソフトウェア開発キット(SDK)として、LunarG社がLunarG Vulkan SDKをリリースしています。このSDKはWindows、
Linux、macOSに対応しており、macOSではMoltenVKを間接的に利用しています。また、Vulkan対応デバイスドライバーや独自のSDK開発を希望するベンダー向けに、ICDローダーやアーキテクチャに関するドキュメントが
GitHubで公開されています。
Androidでは、Android NDKリビジョン12以降でVulkan 1.0に正式対応しています。Android 10では、
OpenGL ES実装に加えて、VulkanバックエンドのANGLEを利用した
OpenGL ES 2.0互換実装も利用可能です。
補助ライブラリ
- - GLFW: OpenGL向けのマルチプラットフォームライブラリですが、バージョン3.2以降でVulkanにも対応しています。
- - vulkan-cpp: Googleが提供するVulkan用のC++向け抽象化ライブラリです。
- - V-EZ: AMDが提供するVulkan用の簡略化ミドルウェアです。
- - Anvil: AMDが提供するVulkan用フレームワークです。
- - Falcor: NVIDIAが提供するVulkanおよびDirectX 12用のレンダリングフレームワークです。
- - Vulkan Memory Allocator: AMDが提供するVulkan用メモリ管理ライブラリです。
- - ANGLE: OpenGL ES互換レイヤーで、Vulkanなどのバックエンドを利用できます。
言語バインディング
- - Vulkan-Hpp: Vulkan APIのC++バインディングです。
- - VulkanSharp: Vulkan APIの.NETバインディングです。
互換レイヤー
- - MoltenVK: Vulkan APIをAppleのMetal API上で使用するための互換レイヤーです。
- - Dzn: Microsoftが開発を推進する、Vulkan APIをDirect3D 12 API上で使用するためのMesaバックエンドです。
MoltenVK
AppleのmacOS/iOSではVulkanがネイティブサポートされていませんが、Metal APIを利用してVulkanを実現するMoltenVKが開発されています。MoltenVKはオープンソース化されており、macOS/iOSでもVulkanを利用できるようになりました。
ベンダー横断のサポート
Vulkanは、初期の仕様では
OpenGL ES 3.1または
OpenGL 4.x以上をサポートする
ハードウェアで動作するとされていましたが、現在はVulkanをサポートするための新しいグラフィックスドライバーが必要となる場合があります。
主要なGPUベンダー3社は、
LinuxおよびWindows向けのドライバーを提供しており、Vulkan 1.2は比較的新しい
ハードウェアでサポートされています。AMD、Arm、Imagination Technologies、Intel、
NVIDIA、Qualcommも、実際の
ハードウェアでVulkan 1.1ドライバーをサポートしています。
多くのAndroidデバイスは
OpenGL ESをサポートしていますが、Vulkanの対応状況は
ハードウェア、デバイスドライバー、OSバージョンに依存します。Android 7.0以降でVulkan 1.0を、Android 9.0以降でVulkan 1.1をサポートしています。
2021年6月現在、
AppleデバイスによるVulkan APIのネイティブサポートはありません。MoltenVKを使用することで、iOSおよびmacOSでVulkanを利用できますが、いくつかの制限があります。
Qualcomm
Qualcomm Snapdragonプラットフォームの
Adreno GPUは、Vulkan 1.0をサポートしています。SDKは
Android Studio IDEをベースとしており、Android NDKが必要です。
脚注
関連項目
外部リンク