文書の過去の版を表示しています。
目次
Metal (iOS/OS X)
- Apple 独自の API (Objective-C)
- Direct3D, Vulkan 同様 CPU 負荷が小さい低レベル API (Low Overhead API)
- シェーダー言語は C++ (GLSL でも hlsl でもない)
- GPU 世代対応表/API 対応表 Desktop GPU 毎の対応 API 一覧
対応 GPU の機能グループは 3 種類
Family | Group | Platform | PVRTCv1/ETC2 | ASTC | DXT(BC) | CubeArray | GPU |
---|---|---|---|---|---|---|---|
iOS GPUFamily1 | PowerVR Series 6 (Rogue) | iOS Apple A7 | Y | N | N | N | PowerVR G6430 |
iOS GPUFamily2 | PowerVR Series 6XT | iOS Apple A8/A8X | Y | Y | N | N | PowerVR GX6450/GX6850 |
OSX GPUFamily1 | Desktop GPUs | Mac OS X | N | N | Y | Y | GeForce/RADEON/Intel HD Grahics |
Mac OS X 10.11 El Capitan 以降で対応します。 ただし D3D10 世代の GPU 搭載機種では動きませんでした。
GPU ごとの違い
GPU | Family | D32F_S8 | D24_S8 | ThreadGroup |
---|---|---|---|---|
PowerVR G6430 | iOS GPUFamily1 | Y | N | 512/512 |
PowerVR G6450 | iOS GPUFamily2 | Y | N | 512/512 |
GeForce Kepler | OSX GPUFamily1 | Y | Y | 1024/1024 |
Intel HD Graphics | OSX GPUFamily1 | Y | N | 512/512 |
API Set
Metal の API は Objective-C です。 OpenGL とは違い C/C++ から直接呼び出すことはできません。
Metal Framework
MetalKit
iOS と OS X の違い
iOS 版 Metal はハードウエアが PowerVR Series 6/6XT のみなので、API 構造が PowerVR の仕様に従っています。 OS X 版も基本的に iOS 版を踏襲しているものの、 Intel HD Graphcis / GeForce / RADEON 等多くの GPU で動作させるためか、一部汎用的な仕様に改められています。
- 使用できる PixelFormat が異なる
- 圧縮テクスチャ
- iOS の圧縮テクスチャは PVRTCv1, ETC2(EAC), ASTC の 3種類のみ
- OS X は DirectX と全く同じ BC1〜BC7 (DXT) が採用
- Depth Format の種類が多く、Depth と Stencil がパックされた D24Unorm + S8 が追加。
- iOS 側にも Depth と Stencil を同時に設定できる D32Float + S8 が逆輸入されている。
ConsntaBuffer (UniformBuffer) は 256byte alignment が必要。(Direct3D 12 にも全く同様の制限があります)
OS X 版の OpenGL 4.x との違い
Mobile 向け API 、しかも特定の PowerVR 向けに設計された API なので若干仕様に偏りがあります。 想定 GPU が OpenGL ES 3.1 相当なので、ComputeShader はあるものの GeometryShader/Tessellator 等の OpenGL 4.x 相当の機能がありません。 OpenGL 4.x の完全な代わりとしては物足りない部分がいろいろ出てくる可能性があります。 iOS 向け Application の移植が当面の用途になるかもしれません。
Texture の転送
iOS では UMA 前提なので、他の低レベル API と違い Metal のリソース転送は即座に行われます。 OSX では Discrete GPU も存在するため DMA 転送が必要です。iOS の API との互換性を保つために、Default で Managed Resource が用いられます。 直接転送命令を意識せずに更新できるので、他の低レベル API よりも扱いが簡単になっています。 他の低レベル API の Copy に相当するのが Blt API です。これらを用いて自分でリソースを転送することもできます。