Vulkan (API)

Vulkan
開発元 クロノス・グループ
初版 2016年2月16日 (8年前) (2016-02-16)
最新版 1.3.261 - 2023年8月4日 (12か月前) (2023-08-04)[1] [±]
リポジトリ ウィキデータを編集
対応OS WindowsLinuxAndroid、その他
プラットフォーム クロスプラットフォーム
対応言語 C/C++
種別 3DグラフィックスAPI
公式サイト www.vulkan.org
テンプレートを表示

Vulkan(ヴァルカン)は、クロノス・グループ: Khronos Group)が策定している、オープンスタンダードロイヤリティフリークロスプラットフォームなリアルタイム3次元コンピュータグラフィックス・コンピュートAPIである。グラフィックスハードウェア層に近いローレベル (low level) な制御を目的としており、これによりオーバーヘッドを低減し、ハードウェア限界性能を引き出すことが可能となる。VulkanはAppleMetalマイクロソフト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) の策定が始められることがアナウンスされた。このとき、マルチスレッド対応やシェーディング中間言語などの近代的な技術が導入されることが発表された[2]

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

2015年8月には、GoogleAndroidにおいてVulkanをサポートする旨を発表[8]

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

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

パイプライン

[編集]

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

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

[編集]

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

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

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

コンピュートパイプライン

[編集]

コンピュートパイプライン: Compute pipeline)は1つの静的コンピュートシェーダーステージと1つのパイプラインレイアウトで構成される[17]

シェーディング言語

[編集]

VulkanのシェーダーSPIR-V英語版で記述される[18][19]

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

開発環境

[編集]

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

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

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

補助ライブラリ

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

言語バインディング

[編集]
  • Vulkan-Hpp - Vulkan APIのC++バインディング[31]。Khronos Groupが提供している。ライセンスはApache License 2.0。元々NVIDIAで開発された[32]
  • VulkanSharp - Vulkan APIの.NETバインディング[33]Mono Projectが提供している。ライセンスはMIT License。

互換レイヤー

[編集]

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

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

MoltenVK

[編集]

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

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

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

ベンダー横断のサポート

[編集]

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

Intel、NVIDIA、AMD

[編集]

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

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のネイティブサポートはない[50]。iOSおよびmacOS向けのサポートもAppleからは発表されていない。この問題に対する回避策として、前述のようにオープンソースライブラリのMoltenVK英語版を使用する方法がある。MoltenVKはMetal API上に構築されたVulkan実装を提供するものであり、iOSとmacOSデバイス上で動作する。ただし、この方法にはいくつかの制限がある[51]

Qualcomm

[編集]

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

脚注

[編集]
  1. ^ Vulkan® 1.3.261 - A Specification”. クロノス・グループ (2023年7月28日). 2023年8月4日閲覧。
  2. ^ OpenGL 3Dの次世代規格の策定作業がKhronos Groupの指揮下に始まる…ハードウェア重視、マルチスレッド、共通シェーディング言語など - TechCrunch
  3. ^ [GDC 2015]Khronos,新世代グラフィックスAPI「Vulkan」を正式発表。OpenGL時代のしがらみを捨てた,スリムでハイエンドなAPIに - 4Gamer.net
  4. ^ SPIR - The first open standard intermediate language for parallel compute and graphics
  5. ^ [GDC 2015]Khronos,新世代グラフィックスAPI「Vulkan」でAMDの「Mantle」を採用 - 4Gamer.net
  6. ^ Vulkan: the Official Name of glNext (Next Generation OpenGL) | Geeks3D
  7. ^ Khronos targets DirectX 12 with next-generation Vulkan API - ExtremeTech
  8. ^ 「Android」、低オーバーヘッドのグラフィックスAPI「Vulkan」をサポートへ - CNET Japan
  9. ^ 新世代の低オーバーヘッドなグラフィックスAPI「Vulkan」,ついに正式始動 - 4Gamer.net
  10. ^ Qualcomm Announces Vulkan API Support on the Adreno 530 GPU | Qualcomm
  11. ^ Vulkan の実装 | Android オープンソース プロジェクト | Android Open Source Project
  12. ^ Vulkan on NVIDIA GPUs; Piers Daniell, Driver Software Engineer, OpenGL and Vulkan
  13. ^ "Graphics pipelines consist of multiple shader stages, multiple fixed-function pipeline stages, and a pipeline layout." 以下より引用。Khronos. Vulkan Specification - Pipelines. Vulkan Documentation. 2024-08-10閲覧.
  14. ^ "Primitive Shading The first stage of the graphics pipeline (Input Assembler) ... In the next stage (Vertex Shader) ... If tessellation and/or geometry shaders are supported, they can then generate ..." 以下より引用。Khronos. Vulkan Specification - Pipelines. Vulkan Documentation. 2024-08-10閲覧.
  15. ^ "Tessellation involves three pipeline stages. First, a tessellation control shader ... Second, a fixed-function tessellator generates multiple primitives ... Third, a tessellation evaluation shader" 以下より引用。Khronos. Vulkan Specification - Tessellation. Vulkan Documentation. 2024-08-10閲覧.
  16. ^ "Fixed-Function Vertex Post-Processing ... the following fixed-function operations are applied to vertices of the resulting primitives: Transform feedback ... Viewport swizzle ... Flat shading ... Primitive clipping ... Shader output attribute clipping ... Clip space W scaling ... Perspective division on clip coordinates ... Viewport mapping ... Front face determination" 以下より引用。Khronos. Vulkan Specification - Fixed-Function Vertex Post-Processing. Vulkan Documentation. 2024-08-10閲覧.
  17. ^ "Compute pipelines consist of a single static compute shader stage and the pipeline layout." 以下より引用。Khronos. Vulkan Specification - Pipelines. Vulkan Documentation. 2024-08-10閲覧.
  18. ^ a b "シェーダ言語ソースはSPIR-Vにトランスレートされて、Vulkanのコンパイラ層に渡される。そして、SPIR-Vへのコンパイルは、オフラインで行なわれ、Vulkanランタイムはシェーダソースコードのコンパイルは行なわない。" 以下より引用。後藤. (2015). Khronosの次期グラフィックスAPI「Vulkan」. PC Watch. 2024-08-10閲覧.
  19. ^ "shader code in Vulkan has to be specified in a bytecode format as opposed to human-readable syntax like GLSL and HLSL. This bytecode format is called SPIR-V" 以下より引用。Khronos. Khronos Vulkan Tutorial - Drawing a triangle - Graphics pipeline basics - Shader modules. Vulkan Documentation. 2024-08-10閲覧.
  20. ^ Benefits of the Vulkan macOS SDK - LunarG
  21. ^ NDK Revision History | Android NDK | Android Developers
  22. ^ Google Developers Japan: Android Q ベータ版の概要
  23. ^ GLFW: Release notes | Release notes for 3.2 | New features in version 3.2 | Support for Vulkan
  24. ^ google-admin/vulkan-cpp-library
  25. ^ GPUOpen-LibrariesAndSDKs/V-EZ
  26. ^ V-EZ: AMD Releases New Easy-To-Use Vulkan Middleware, Simplified API Phoronix 2018年3月26日
  27. ^ GPUOpen-LibrariesAndSDKs/Anvil: Anvil is a cross-platform framework for Vulkan
  28. ^ NVIDIAGameWorks/Falcor: Real-Time Rendering Framework
  29. ^ GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator: Easy to integrate Vulkan memory allocation library
  30. ^ AMD's GPUOpen Posts New Vulkan Memory Allocator Phoronix 2017年6月19日
  31. ^ KhronosGroup/Vulkan-Hpp: Open-Source Vulkan C++ API
  32. ^ Vulkan bekommt offizielle API für C++ Golem.deドイツ語版 2016年7月25日
  33. ^ mono/VulkanSharp: Open source .NET binding for the Vulkan API
  34. ^ KhronosGroup/MoltenVK: MoltenVK is an implementation of the high-performance, industry-standard Vulkan graphics and compute API, that runs on Apple's Metal graphics framework, bringing Vulkan to iOS and macOS.
  35. ^ Mesa On Windows Continues Improving: Dzn Dynamic Rendering, WGL Kopper Lands Phoronix 2022年4月22日
  36. ^ Open-Source Project Trying To Map Vulkan Onto Direct3D 12 & Metal Phoronix 2018年1月28日
  37. ^ Rostkatze: Vulkan Over Direct3D 12 With C++ Phoronix 2018年3月1日
  38. ^ MetalVK – Molten
  39. ^ MoltenVK – Molten
  40. ^ クロノス、VulkanアプリケーションのAppleプラットフォームへのポーティングを実現する、 オープンソースを発表 - Press Release - Khronos Group”. jp.khronos.org. 2018年7月31日閲覧。
  41. ^ “Vulkan Applications Enabled on Apple Platforms” (英語). The Khronos Group. (2018年2月26日). https://www.khronos.org/news/press/vulkan-applications-enabled-on-apple-platforms 2018年7月31日閲覧。 
  42. ^ 株式会社インプレス (2018年2月27日). “グラフィックスAPI「Vulkan」がmacOS/iOSで利用可能に” (日本語). PC Watch. https://pc.watch.impress.co.jp/docs/news/1108626.html 2018年7月31日閲覧。 
  43. ^ MoltenVK/MoltenVK_Runtime_UserGuide.md at master · KhronosGroup/MoltenVK
  44. ^ GLFW: Release notes | Release notes for version 3.3 | New features in version 3.3 | Support for Vulkan on macOS via MoltenVK
  45. ^ Vulkan Overview”. Khronos Group. p. 19 (June 2015). August 18, 2015閲覧。 "Vulkan Status"
  46. ^ Tim Anderson (March 3, 2015). “Here comes Vulkan: The next generation of the OpenGL graphics API” (英語). www.theregister.com. 2021年7月8日閲覧。
  47. ^ Radeon HD 7790などが含まれる。
  48. ^ Conformant Products - The Khronos Group Inc
  49. ^ Mesamatrix: The OpenGL vs Mesa matrix”. mesamatrix.net. 2021年7月11日閲覧。
  50. ^ The State of Vulkan on Apple Devices”. LunarG (June 2021). 2021年7月11日閲覧。
  51. ^ MoltenVK/MoltenVK_Runtime_UserGuide.md at v1.1.4 · KhronosGroup/MoltenVK
  52. ^ Developing 3D Graphics with Vulkan on Mobile” (英語). Qualcomm Developer Network. 2021年7月8日閲覧。
  53. ^ Adreno GPU SDK” (英語). Qualcomm Developer Network. 2021年7月8日閲覧。
  54. ^ Adreno Vulkan Developer Guide”. pp. 9-10, 22 (August 31, 2017). 2021年7月11日閲覧。

関連項目

[編集]

外部リンク

[編集]