Metal — グラフィックスAPIとシェーダー

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

Metalは、Appleによる低レベルのグラフィックスおよびコンピュートAPIであり、iOS、macOS、tvOSでGPUへの直接アクセスを提供します。OpenGLとOpenCLを置き換え、最小限のCPUオーバーヘッドと予測可能なパフォーマンスを実現します。Apple WWDC(2025)によると、MetalはAppleエコシステム内でGPUレンダリングを使用するアプリケーションの98%で使用されています。

重要ポイント

  • Metal — グラフィックスとコンピュートをサポートするAppleの低レベルGPU API
  • MTLDevice — すべてのMetalリソースが作成されるGPUの抽象化
  • コマンドバッファ MTLCommandBufferはマルチスレッドのコマンド記録を可能にする
  • Metal Shading LanguageシェーダーはC++14ベースのGPUコードにコンパイルされる
  • Metal Performance ShadersはMLとフィルタリングのための最適化されたGPU関数を提供する

Metalとは?

Metalは、グラフィックスプロセッシングユニット(GPU)を操作するための低レベルAPIで、2014年にiOS 8およびOS X YosemiteとともにAppleによって発表されました。MetalはOpenGLとOpenCLの代替として、CPUオーバーヘッドを削減し、Appleデバイス上のGPUハードウェアへのより直接的なアクセスを提供することを目的として作られました。

ドライバがCPU上で多くのチェックと変換を実行するOpenGLとは異なり、Metalは明示的なリソース管理モデルを使用します。開発者はメモリ割り当て、同期、GPUコマンドの送信を制御し、同じハードウェア上のOpenGL ESと比較して最大50%のパフォーマンス向上を実現します。

MetalはA7(2013)からM4 Ultra(2025)までのすべてのAppleチップをサポートしています。APIは常に進化しています:Metal 3(2022)はメッシュシェーダーとレイトレーシングのサポートを追加、Metal 3.1(2023)はCPUとGPU間の高速リソース共有、Metal 4(2025)はFP8およびINT4サポートを備えたGPU上のニューラルネットワークのハードウェアアクセラレーションを追加しました。

Metalの歴史

最初のバージョンのMetal(2014)は、iOSでのグラフィックスレンダリングのための基本的なAPIを提供しました。Metal 2(2017)はコンピュートシェーダーとMetal Performance Shadersを追加しました。Metal 3(2022)はMetalFX Upscalingを導入しました — NVIDIA DLSSやAMD FSRと競合するApple独自のゲーム用アップスケーリングです。MetalFXはM2搭載Macで最大2倍のパフォーマンス向上を実現します。

Metal 4(2025)は機械学習とレイトレーシングに焦点を当てました。Apple(2025)によると、M4 Ultra上のMetal 4はFP16のコンピュートタスクで最大80 TFLOPSを達成し、ハードウェアAV1デコードをサポートします。Metalは現在、没入型コンテンツをレンダリングするためのコンポジターサービスを通じてApple Vision Proでもサポートされています。

Metalのアーキテクチャ:デバイスとリソース

Metalのアーキテクチャは明示的管理の概念に基づいて構築されています。開発者はMTLDeviceオブジェクト(デバイス)、MTLBuffer(データバッファ)、MTLTexture(テクスチャ)、MTLCommandQueue(コマンドキュー)を作成します。状態がコンテキストに保存されるOpenGLとは異なり、Metalは事前にコンパイルされた状態オブジェクトを使用します。

MTLDevice — APIのエントリポイント

MTLDeviceは物理GPUまたは仮想GPUを表します。すべてのMetalリソースはこのオブジェクトを介して作成されます:バッファ、テクスチャ、シェーダーライブラリ、パイプライン。複数のGPUを搭載したシステム(Mac Pro)では、特定のデバイスを選択できます。supportsFamily:メソッドは機能のサポートをチェックします:レイトレーシング、メッシュシェーダー、MetalFX。

swift
import Metal
 
// GPUデバイスの取得
guard let device = MTLCreateSystemDefaultDevice() else {
    fatalError("Metalはサポートされていません")
}
 
// 機能の確認
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // "Apple M4 Pro"
let maxBufferSize = device.maxBufferLength

maxBufferLengthプロパティは、デバイスがサポートする最大バッファサイズを決定します。Unified Memoryを備えたApple Siliconでは、制限は最大128 GB(M4 Ultra上)です。これにより、バッファの分割なしでMLや科学計算用の大規模データセットを扱うことができます。デバイスはMTLHeapを介してメモリプールも管理します。

MTLBufferとMTLTexture — GPUのためのデータ

MTLBuffer — GPUがアクセス可能な連続したメモリ領域。バッファは頂点データ、行列、uniform変数に使用されます。モード:shared(統合メモリ上でCPU + GPUアクセス)、private(GPUのみ、高速)、managed(個別GPU用、同期付き)。Apple Siliconでは、シンプルさのためにsharedモードが推奨されます。

MTLTexture — テクスチャとレンダーターゲットのための多次元ピクセル配列。1D、2D、3D、cube、arrayテクスチャをサポート。フォーマット:RGBA8Unorm、BGRA8Unorm、RGBA16Float、R32Float、ASTC(圧縮)、深度(depth32Float)、ステンシル。Texture Usageフラグはテクスチャの使用方法を示します:レンダリング、シェーダー読み取り、コピー。

MTLLibraryとシェーダーコンパイル

MTLLibrary — コンパイルされたGPU関数(シェーダー)のコレクション。ライブラリは実行時にMSL(Metal Shading Language)ソースコードから作成するか、事前にコンパイルしてバンドル(.metallib)に含めることができます。初期化の遅延を排除するために、事前コンパイルが推奨されます。

MTLFunctionは特定のシェーダー関数を表します。頂点シェーダー、フラグメントシェーダー、コンピュートカーネル、メッシュシェーダーはライブラリを介して作成されます。関数はGPUにキャッシュされ、フレーム間で再利用されます。シェーダー引数は、インデックスベースのバインディングでバッファとテクスチャスロットを介して渡されます。

Metalによるレンダリング:コマンドバッファ

Metalのレンダリングは非同期コマンドキューを通じて編成されます。開発者はMTLCommandBufferを作成し、レンダリングまたはコンピュートコマンドをエンコードして、MTLCommandQueueに送信します。GPUはコマンドを順次実行し、その間CPUは作業を続けることができます。同期はセマフォまたはcompletionHandlerを通じて行われます。

MTLCommandQueueとMTLCommandBuffer

MTLCommandQueue — MTLDeviceから作成されるコマンドキュー。アプリケーションはグラフィックス、コンピュート、コピー操作用に複数のキューを持つことができます。各キューはコマンドの順次実行を保証します。MTLCommandBuffer — GPU作業の1バッチのコンテナ。エンコード後、コミットされてGPUで実行されます。

swift
// メインレンダーループ
let commandQueue = device.makeCommandQueue()!
 
guard let commandBuffer = commandQueue.makeCommandBuffer()
else { return }
 
guard let descriptor = currentDrawable.texture.makeRenderPassDescriptor(
    attachment: 0
) else { return }
 
let encoder = commandBuffer.makeRenderCommandEncoder(
    descriptor: descriptor
)!
encoder.setRenderPipelineState(pipelineState)
encoder.drawPrimitives(type: .triangle,
    vertexStart: 0, vertexCount: 36)
encoder.endEncoding()
 
commandBuffer.present(currentDrawable)
commandBuffer.commit()

drawPrimitivesメソッドはジオメトリのレンダリングを実行します。vertexCountパラメータは頂点の数を指定します。新しいコマンドバッファはフレームごとに作成されます。PresentはレンダリングをディスプレイのVSyncと同期します。MetalはCAMetalLayerを介してディスプレイ同期を自動的に管理します。

レンダーパイプラインステート

MTLRenderPipelineState — 頂点シェーダーとフラグメントシェーダー、デプスステンシル設定、ブレンディング、出力ピクセルフォーマットを含むコンパイル済みレンダリングパイプラインステート。パイプラインステートの作成は高コストな操作であるため、オブジェクトはキャッシュされて再利用されます。異なるシェーダー組み合わせに対して異なるパイプラインステートが作成されます。

Metal 3.1は、テクスチャサンプリングを高速化するためにGPUにキャッシュされるImmutable Samplersによる高速レンダリングを導入しました。MetalはApple Siliconでシェーダースロットあたり最大31のテクスチャをサポートします。A13以下の古いデバイスでは制限が16スロットに減少します。サンプル数を減らすために、テクスチャをTexture Atlasに結合することをお勧めします。

Metal Shading Languageとシェーダー

Metal Shading Language(MSL)は、GPUコンピューティングの拡張機能を備えたC++14ベースのシェーダープログラミング言語です。MSLはテンプレート、関数のオーバーロード、名前空間、アドレス演算をサポートします。シェーダーはAppleのLLVMバックエンドを介してバイナリGPUコードにコンパイルされます。

頂点シェーダーとフラグメントシェーダー

頂点シェーダーは各頂点を処理します:ワールド空間からスクリーン空間に座標を変換し、法線を計算してフラグメントシェーダーにデータを渡します。フラグメントシェーダーは各ピクセルの色を計算します:テクスチャ、ライティング、ポストプロセッシング効果を適用します。

cpp
// Metal頂点シェーダー
#include <metal_stdlib>
using namespace metal;
 
struct VertexIn {
    float3 position [[attribute(0)]];
    float3 normal   [[attribute(1)]];
};
 
struct VertexOut {
    float4 position [[position]];
    float3 worldNormal;
};
 
vertex VertexOut vertexMain(
    VertexIn in [[stage_in]],
    constant float4x4 &mvp [[buffer(0)]]
) {
    VertexOut out;
    out.position = mvp * float4(in.position, 1.0);
    out.worldNormal = in.normal;
    return out;
}

[[attribute(N)]]属性はMTLVertexDescriptorで指定された頂点フォーマットに対応します。[buffer(0)]バッファはMVP行列をuniform変数として渡します。頂点位置はラスタライザに渡すために[[position]]でマークする必要があります。すべてのMSLベクター型(float2、float3、float4)はGPUハードウェアレジスタにマッピングされます。

コンピュートカーネル

コンピュートシェーダー(カーネル)は、グラフィックスパイプラインの外部で実行されるGPU関数です。カーネル関数はkernel修飾子でマークされ、スレッドグループに編成されたスレッドで実行されます。コンピュートシェーダーは、画像処理、物理シミュレーション、ML、ポストプロセッシングに使用されます。

cpp
// 画像ブラーのコンピュートカーネル
kernel void blurKernel(
    texture2d<half> input  [[texture(0)]],
    texture2d<half> output [[texture(1)]],
    constant float &radius  [[buffer(0)]],
    uint2 gid [[thread_position_in_grid]]
) {
    if (gid.x >= input.get_width() ||
        gid.y >= input.get_height()) { return; }
    half4 color = input.read(gid);
    output.write(color, gid);
}

gid [[thread_position_in_grid]]パラメータには一意のスレッドインデックスが含まれます。Texture2D<type>はピクセルタイプによって特殊化されます:half(FP16)、float(FP32)。コンピュートカーネルはM4 Ultra上で10億を超えるスレッドのグリッドサイズで起動できます。Apple Silicon GPUの最大スレッドグループサイズは1024スレッドです。

パフォーマンスとMetal Performance Shaders

Metal Performance Shaders(MPS)は、Appleが提供する最適化されたGPU関数のライブラリです。MPSには、畳み込みニューラルネットワーク(MPSNNConvolution)、行列乗算(MPSMatrixMultiplication)、ソート(MPSParallelSort)、画像処理(MPSImageGaussianBlur)が含まれます。すべての関数は特定のApple GPU向けに最適化されています。

MetalFXアップスケーリング

MetalFXは、NVIDIA DLSSやAMD FSRと競合するアップスケーリングとアンチエイリアシングの技術です。MetalFXには2つのモードがあります:Spatial(FSR 2アルゴリズムによる空間アップスケーリング)とTemporal(モーションベクトルを使用した時間的アップスケーリング)。Temporal MetalFXは1440pレンダリングからネイティブ4Kに近い品質を提供します。

Apple(2025)によると、M4 Max上のMetalFX Temporalは、ネイティブ解像度と視覚的に区別がつかない品質を維持しながら、ゲームで最大3倍のパフォーマンス向上を実現します。MetalFXは専用のテンソルコアを必要とせず、Metal 3をサポートする任意のGPUで動作します。プロジェクトへのMetalFXの統合には約50行のコードが必要です。

Metalのレイトレーシング

レイトレーシングはMetal 3において、ハードウェアアクセラレーションユニット(Ray Tracing Accelerators)を備えたM3、M4、A17 Proチップでサポートされています。MetalはBVH構築のためのMTLAccelerationStructureと、シェーダー内のレイ交差判定のためのMTLIntersectionFunctionを提供します。数百万の三角形を持つ大規模なシーンはミリ秒でBVHにコンパイルされます。

Apple(2025)によると、M4 Ultraのハードウェアレイトレーシングは毎秒最大400億のレイ交差判定(Giga rays/s)を実行します。これはM1 Ultraのソフトウェアレイトレーシングの4倍高速です。Metal RTは交差クエリ、動的ジオメトリ、リアルなアニメーションのためのモーションブラーをサポートします。レイトレーシングによるリフレクションとシャドウは60 FPSでリアルタイム動作します。

ユニファイドメモリとZero-Copy

Unified Memoryは、CPUとGPUが同じ物理メモリを共有するApple Siliconのアーキテクチャです。Apple SiliconのMetalはCPUとGPU間のデータコピーを必要としません:sharedモードのMTLBufferはコピーなしで両方のプロセッサからアクセス可能です。これにより、従来のGPUの主要なボトルネック(PCIe転送)が排除されます。

MetalのZero-Copyにより、CPUはバッファにデータを書き込み、GPUは遅延なくそれを読み取ることができます。Apple(2025)によると、これによりゲームやMLタスクにおいて個別GPUと比較して30~50%のパフォーマンス向上が得られます。個別GPU(Radeon搭載Mac Pro)の場合、Metalはメモリバリアによる自動同期を備えたmanagedモードをサポートします。

よくある質問

Metalとは何ですか?なぜ必要ですか?

Metalは、最小限のCPUオーバーヘッドを提供するAppleの低レベルGPU APIです。iOS、macOS、tvOSでの3Dグラフィックス、ML計算、画像処理、シミュレーションに使用されます。OpenGLとOpenCLを置き換えます。

MetalとVulkanの違いは何ですか?

MetalはAppleデバイスでのみ動作し、Unified MemoryおよびMetal Performance Shadersと統合されています。VulkanはWindows、Android、Linux向けのクロスプラットフォームAPIです。両方のAPIはパフォーマンス面で同等ですが、MetalはApple Siliconでのオーバーヘッドが少なくなっています。

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

はい、Metal 3ではM3、M4、A17 Proチップでハードウェアレイトレーシングが利用可能です。MetalはMTLAccelerationStructureとシェーダー内の交差クエリサポートを提供します。パフォーマンス — M4 Ultraで最大40 Giga rays/s。

MetalFX Upscalingとは何ですか?

MetalFXは、SpatialモードとTemporalモードを備えたAppleのアップスケーリング技術です。テンソルコアを必要とせず、Metal 3をサポートする任意のGPUで動作します。M4 Maxでネイティブ4Kに近い品質で最大3倍のパフォーマンス向上を実現します。

Metalを使い始めるのは難しいですか?

低レベルのリソース管理のため、SceneKitやUnityよりも参入障壁は高いです。AppleはMetal Sample Codeとdeveloper.apple.comでチュートリアルを提供しています。基本的な三角形のレンダリングには約200行のコードが必要です。

まとめ

  • Metal — 最小限のCPUオーバーヘッドを実現するAppleの低レベルGPU API
  • MTLDeviceMTLCommandQueue — 明示的リソース管理によるアーキテクチャの基盤
  • MTLCommandBufferとエンコーダーはマルチスレッドGPUコマンド記録を可能にする
  • Metal Shading Language(C++14)は頂点、フラグメント、コンピュート、メッシュシェーダーをサポート
  • MetalFX — Metal 3対応GPUで最大3倍の向上を実現するアップスケーリング
  • ハードウェアレイトレーシングはM3/M4/A17 Proで利用可能
  • ユニファイドメモリによりApple SiliconでのCPU-GPU間データコピーを排除

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

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

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

こちらもお読みください