Vulkan — クロスプラットフォームAPIとレンダリングの概要

著者: IT Sectr 公開日: 2026-05-03 読了時間: 9 分

Vulkanは、Khronos Groupコンソーシアムによって開発された、GPUでのグラフィックスおよびコンピューティングのためのクロスプラットフォームAPIです。Vulkanは、ハードウェアの低レベル制御、マルチスレッドコマンド生成、予測可能なパフォーマンスを提供します。Khronos Group(2026年)によると、Vulkanは最新のAndroidデバイスの98%でサポートされています。

重要なポイント

  • Vulkan — ハードウェアの低レベル制御を備えたクロスプラットフォームGPU API
  • VkDeviceVkQueueにより、GPUへのマルチスレッドコマンド送信が可能
  • SPIR-V — GLSLおよびHLSLからコンパイルされるユニバーサルバイナリシェーダ形式
  • Vulkan Memory Allocatorが明示的なGPUメモリ割り当てを管理
  • Vulkan Ray Tracing(VK_KHR_ray_tracing)がハードウェア加速レイトレーシングをサポート

Vulkanとは?

Vulkanは、グラフィックス処理ユニットを扱うための低レベルかつクロスプラットフォームなAPIであり、2016年にKhronos Groupによって初めてリリースされました。VulkanはOpenGLの後継として、CPUオーバーヘッドを大幅に削減し、予測可能なパフォーマンスとマルチスレッドコマンド生成を実現します。

ドライバがCPU上で検証と同期を実行するOpenGLとは異なり、Vulkanはリソース管理を開発者に委ねます。メモリ割り当て、セマフォとバリアによる同期、パイプライン作成 — これらすべてが明示的に制御されます。このアプローチにより、CPUバウンドのシナリオで最大50%のパフォーマンス向上が得られます。

VulkanはWindows、Linux、Android、iOS(MoltenVK経由)、macOS(MoltenVK)、Nintendo Switch、コンソールでサポートされています。Khronos Group(2026年)によると、このAPIはNVIDIA、AMD、Intel、Qualcomm(Adreno)、ARM(Mali)、Apple(Metalレイヤー経由)のGPUを搭載したデバイスで動作します。Vulkan 1.4(2026年)はMesh ShadersとVideo Encode APIのサポートを追加しました。

Vulkanの歴史

Vulkanは当初、コードネーム“glNext”(OpenGLの後継)として開発されました。Vulkan 1.0(2016年)は、明示的なメモリ管理、SPIR-Vシェーダ、マルチスレッドキューを備えた基本的なAPIを提供しました。Vulkan 1.1(2018年)はSubgroup Operationsと16ビット型のサポートを追加しました。Vulkan 1.2(2020年)はBuffer Device AddressとTimeline Semaphoresを導入しました。

Vulkan 1.3(2022年)はDynamic RenderingとGraphics Pipeline Libraryを標準化しました。Vulkan 1.4(2026年)はMesh Shadersのサポートを必須とし、H.264/HEVC/AV1のハードウェアエンコードのためのVideo Encode/Decode APIを追加しました。Khronos(2026年)によると、Vulkan 1.4はすべての新しいNVIDIA RTX 50xx、AMD RX 9000、Intel Arc BシリーズGPUでサポートされています。

Vulkanのアーキテクチャ:デバイスとキュー

Vulkanアーキテクチャはハードウェア抽象化レイヤー(HWレイヤー)上に構築されています。アプリケーションは論理デバイス(VkDevice)を介して物理デバイス(VkPhysicalDevice)と対話します。コマンドはキュー(VkQueue)に送信され、各キューは特定のキュー家族(graphics、compute、transfer)に属します。

VkInstance、VkDevice、VkQueue

VkInstanceはVulkanのルートオブジェクトであり、検証レイヤーと拡張機能に関する情報を格納します。VkPhysicalDeviceは物理GPUを表し、そのプロパティ、メモリヒープ、キュー家族を照会できます。VkDeviceは、明示的に要求されたキューと拡張機能を備えた論理デバイスです。

cpp
// Vulkan論理デバイスの作成
VkDeviceCreateInfo devInfo {};
devInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
devInfo.queueCreateInfoCount = 1;
 
float queuePriority = 1.0f;
VkDeviceQueueCreateInfo queueInfo {};
queueInfo.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
queueInfo.queueFamilyIndex = 0;
queueInfo.queueCount = 1;
queueInfo.pQueuePriorities = &queuePriority;
devInfo.pQueueCreateInfos = &queueInfo;
 
VkDevice device;
vkCreateDevice(physicalDevice, &devInfo,
    nullptr, &device);
 
VkQueue queue;
vkGetDeviceQueue(device, 0, 0, &queue);

vkCreateDevice関数は、指定されたキューを持つ論理デバイスを作成します。VkQueueはコマンドを送信するためのキュー���ンドルです。対応するフラグがキュー家族によってサポートされている場合、1つのキューをグラフィックス、コンピュート、コピーに使用できます。キューの優先度(0.0–1.0)は、競合時の実行順序に影響します。

VkMemoryとVkBuffer — メモリ管理

Vulkanでは、メモリはVkDeviceMemoryを介して明示的に割り当てられます。開発者は物理デバイスからメモリタイプ(HOST_VISIBLE、DEVICE_LOCAL)を照会し、ブロックを割り当てます。バッファ(VkBuffer)とテクスチャ(VkImage)には独自のメモリがなく、vkBindBufferMemoryを介して割り当てられたブロックにバインドされます。

Vulkan Memory Allocator(VMA)は、メモリ管理を簡素化するAMDのライブラリです。VMAは小さな割り当てを自動的に大きなブロックにグループ化し、デフラグメンテーションを管理し、適切なメモリタイプを選択します。AMD(2025年)によると、VMAは手動管理と比較してメモリ割り当て数を50–100分の1に削減します。

VkCommandPoolとVkCommandBuffer

VkCommandPoolはコマンドバッファのメモリを管理します。バッファ(VkCommandBuffer)はCPU上で記録され、vkQueueSubmitを介してGPUに送信されます。Vulkanはプライマリバッファとセカンダリバッファをサポートしています。プライマリは直接送信され、セカンダリはマルチスレッドのコマンド構築のためにプライマリから呼び出すことができます。

コマンドの記録はvkBeginCommandBufferで始まり、vkEndCommandBufferで終了します。その間に、レンダリングコマンドが記録されます:vkCmdDraw、vkCmdDispatch、vkCmdCopyBuffer、および同期のためのvkCmdPipelineBarrier。プールリセットによるプーリングを使用して、フレームごとに新しいコマンドバッファが作成されます。

Vulkanによるレンダリング:パイプラインとコマンド

Vulkanでのレンダリングはパイプライン(VkPipeline)を介して編成されます。パイプラインの状態がグローバルに変更されるOpenGLとは異なり、VulkanはVkPipelineを使用します。これは、頂点入力、シェーダ、ラスタライゼーション、深度ステンシル、ブレンディングのすべてのステージを含むプリコンパイル済みパイプラインです。

VkPipeline — レンダリングパイプライン

VkGraphicsPipelineCreateInfoは完全なパイプラインを記述します:頂点シェーダとフラグメントシェーダ、トポロジ(triangle list、triangle strip)、ラスタライザ(fill mode、cull mode)、マルチサンプリング、深度ステンシルテスト、ブレンディング、ビューポート設定。パイプラインは一度作成され再利用されます。状態を変更するには、新しいパイプラインまたは動的状態が必要です。

cpp
// グラフィックスパイプラインの設定
VkGraphicsPipelineCreateInfo pipelineInfo {};
pipelineInfo.sType =
    VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
pipelineInfo.stageCount = 2;
pipelineInfo.pStages = shaderStages;
pipelineInfo.pVertexInputState =&;
    vertexInputState;
pipelineInfo.pRasterizationState =&;
    rasterState;
 
VkPipeline graphicsPipeline;
vkCreateGraphicsPipelines(device,
    VK_NULL_HANDLE, 1, &pipelineInfo,
    nullptr, &graphicsPipeline);

動的状態(VK_DYNAMIC_STATE_VIEWPORT、VK_DYNAMIC_STATE_SCISSOR)により、新しいパイプラインを作成せずに特定のパラメータを変更できます。Vulkan 1.4は、blend constants、depth bias、トポロジをオンザフライで管理するためのDynamic State 3(VK_EXT_extended_dynamic_state_3)のサポートを必須とし、プロジェクト内のパイプライン数を削減します。

Render PassとDynamic Rendering

VkRenderPassはレンダリングパスの構造を記述します:どのアタッチメントが使用され、それらがどのようにクリアおよびロードされるか。Dynamic Rendering(VK_KHR_dynamic_rendering、Vulkan 1.4以降必須)はプロセスを簡素化します。レンダーパスは、事前のVkRenderPassオブジェクトなしで、コマンドバッファ内でvkCmdBeginRenderingを介してオンザフライで作成されます。

Khronos(2026年)によると、Dynamic RenderingはVulkanの初期化コードを30–40%削減し、パイプラインの組み合わせ数を減らします。複雑な遅延レンダリング手法(Deferred Shading)の場合、Gバッファとライティング用の複数のサブパスを持つ従来のVkRenderPassが依然として便利です。

Vulkanのシェーダ:SPIR-VとGLSL

SPIR-Vは、Khronosによって開発されたVulkanのユニバーサルバイナリシェーダ形式です。シェーダはGLSL、HLSL、またはZink言語で記述でき、glslangValidator、dxc、またはGoogle Shadercを介してSPIR-Vにコンパイルできます。Vulkanはシェーダをソースコードでは受け付けません — バイナリのSPIR-Vのみです。

VulkanのGLSL

Vulkan用のGLSLは標準のOpenGL GLSLとは異なります。組み込み変数の代わりに、set番号とbinding番号を明示的に指定したブロック(layout)が使用されます。頂点属性はlocationを介して指定され、uniformはuniformブロックまたはバッファを介して指定されます。Push constants(最大128バイト)は、バッファなしで高速データ転送に利用できます。

glsl
// Vulkan/GLSL頂点シェーダ
#version 460
 
layout(location = 0) in vec3 inPosition;
layout(location = 1) in vec3 inNormal;
 
layout(binding = 0, set = 0)
uniform UniformBufferObject {
    mat4 modelViewProjection;
} ubo;
 
layout(location = 0) out vec3 outNormal;
 
void main() {
    gl_Position = ubo.modelViewProjection *
        vec4(inPosition, 1.0);
    outNormal = inNormal;
}

修飾子layout(set = N, binding = M)は、Vulkan GLSLとOpenGLの間の重要な違いです。Setはディスクリプタセット(VkDescriptorSet)に対応し、bindingは特定のリソース(バッファ、テクスチャ、サンプラ)に対応します。セットへの分割により、個々のリソースをバインドせずに、ドローコール間でリソースセットを効率的に切り替えることができます。

ディスクリプタとディスクリプタセット

VkDescriptorSetはシェーダにバインドされたリソース(バッファ、テクスチャ、サンプラ)のグループです。ディスクリプタレイアウトは、リソースタイプとそのbinding番号を記述します。ディスクリプタセットはvkUpdateDescriptorSetsを介して更新され、ドローコール間で再利用されます。Vulkan 1.4は、GPUからディスクリプタに直接アクセスするためのVK_EXT_descriptor_bufferをサポートしています。

Push Constantsは、ディスクリプタを作成せずにシェーダに少量のデータ(最大128バイト)を高速転送するためのメカニズムです。Push constantsはコマンドバッファ内でvkCmdPushConstantsを介して設定されます。Khronos(2025年)によると、uniform buffersの代わりにpush constantsを使用すると、1フレームあたり1万回以上のドローコールレートでCPUオーバーヘッドが10–15%削減されます。

さまざまなプラットフォームでのVulkan

Vulkanはすべての主要プラットフォームで動作する唯一のAPIです:Windows(公式ICDドライバ経由)、Linux(RADV、AMDVLK、NVIDIA)、Android(Vulkan 1.3+、Android 10以降必須)、およびAppleデバイスではMoltenVK(VulkanからMetalへの変換レイヤー)を介して動作します。

AndroidでのVulkan

Androidでは、VulkanはAndroid 10以降で必須です。Googleは新しいプロジェクト、特に高性能ゲームやARCoreを介したARアプリケーションにVulkanを推奨しています。Qualcomm AdrenoとARM Maliは、Adreno 8xxおよびMali-G720でハードウェアレイトレーシングを備えた完全なVulkan 1.3サポートを提供します。

Google(2026年)によると、Android 10+を搭載したAndroidデバイスの98%がVulkanをサポートしています。下位互換性のために、OpenGL ESをVulkanに変換するANGLE(Almost Native Graphics Layer Engine)が利用可能です。これにより、古いOpenGLアプリケーションをVulkanドライバ上で最大20%のパフォーマンス向上で実行できます。

Androidでは、Vulkanはエネルギー効率において高い優先順位を持っています。Vulkanアプリケーションは、Adreno 7xx+搭載デバイスで同じグラフィックス負荷の下で、OpenGL ESと比較して25–40%少ないエネルギーを消費します。これにより、Vulkanはモバイルデバイスでのゲームに好ましいAPIとなっています。

MoltenVKを介したAppleでのVulkan

MoltenVKは、LunarGとValveによって開発された、Metal上でのVulkan実装です。MoltenVKはVulkan API呼び出しをMetalに変換し、iOSとmacOSでVulkan 1.2をサポートします。MoltenVKのパフォーマンスはネイティブMetalに近く、変換オーバーヘッドはシナリオに応じて5–15%です。

LunarG(2025年)によると、MoltenVKはCrossOver(Mac用Wine)でmacOS上でWindowsゲームを実行するために使用されています。macOS上のDota 2、Civilization VI、Baldur's Gate 3は、M3/M4で30–60 FPSのパフォーマンスでMoltenVKを介して動作します。MoltenVKはパフォーマンス向上のためにMetalFXアップスケーリングをサポートしています。

Vulkan Ray Tracing

VK_KHR_ray_tracingはVulkanにおけるハードウェアレイトレーシングの拡張機能であり、Vulkan 1.4以降必須です。RTコアを搭載したGPUでサポートされています:NVIDIA RTX 20xx/30xx/40xx/50xx、AMD RX 6000+/9000、Intel Arc A/B。Vulkan RTはVkAccelerationStructure、VkRayTracingPipeline、Shader Binding Tableを提供します。

Vulkan Ray Tracingは、リアルタイムの反射、影、アンビエントオクルージョン、グローバルイルミネーションをサポートします。Khronos(2026年)によると、NVIDIA RTX 5090では、Vulkan Ray Tracingは参照品質のシーンで最大100 Giga rays/sを達成します。ポータブルプラットフォームの場合、Vulkan RTはブラー低減とテンポラルデノイジングによってスケーリングされます。

よくある質問

Vulkanとは何ですか?OpenGLとどう違いますか?

Vulkanは、明示的なリソース管理を備えた低レベルクロスプラットフォームGPU APIです。OpenGLとは異なり、メモリ、同期、マルチスレッドを制御でき、CPUバウンドのシナリオで最大50%のパフォーマンス向上を実現します。

Vulkanはどのプラットフォームで動作しますか?

VulkanはWindows、Linux、Android、Nintendo Switch、およびiOS/macOSではMoltenVK(Metalへの変換)を介して動作します。NVIDIA、AMD、Intel、Qualcomm、ARM、Apple(MoltenVK経由)のGPUでサポートされています。

VulkanのSPIR-Vとは何ですか?

SPIR-VはVulkan用のユニバーサルバイナリシェーダ形式です。シェーダはGLSLまたはHLSLで記述され、SPIR-VにコンパイルされてVulkanに渡されます。これにより、シェーダ言語の独立性と予測可能なコンパイルパフォーマンスが保証されます。

Vulkanはレイトレーシングをサポートしていますか?

はい。VK_KHR_ray_tracing(Vulkan 1.4以降必須の拡張機能)を介してサポートしています。RTコア搭載のGPU(NVIDIA RTX、AMD RX 6000+、Intel Arc)でサポートされています。Vulkan RTはBVH加速構造、Shader Binding Table、ハードウェアレイ交差を提供します。

Vulkanの使用を開始するのは難しいですか?

明示的なメモリ管理、同期、パイプラインのため、参入障壁はOpenGLやDirectX 11よりも高いです。KhronosはVulkan Tutorial、Vulkan Samples、Vulkan Guideを提供しています。最初の三角形を描画するには約500行のコードが必要です。

まとめ

  • Vulkan — Khronos Groupによるクロスプラットフォーム低レベルGPU API
  • 明示的な管理によるメモリ、同期、キューの制御がCPUオーバーヘッドを削減
  • VkPipeline — グラフィックスとコンピュート用のプリコンパイル済みパイプライン
  • SPIR-V — GLSLとHLSLからコンパイルされるバイナリシェーダ形式
  • Dynamic Rendering(Vulkan 1.4)がVkRenderPassなしでRender Pass作成を簡素化
  • MoltenVKがMetalを介してiOSとmacOSでVulkanを実現
  • Vulkan 1.4がMesh Shaders、Video Encode API、必須レイトレーシングを追加

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください