Metal — co to je, grafické API a shadery

Autor: IT Sectr Publikováno: 2026-05-03 Doba čtení: 10 min

Metal je nízkoúrovňové grafické a výpočetní API od Apple, které poskytuje přímý přístup k GPU na iOS, macOS a tvOS. Nahrazuje OpenGL a OpenCL, poskytuje minimální režii CPU a předvídatelný výkon. Podle údajů Apple WWDC (2025) je Metal používán v 98% aplikací s GPU renderingem v ekosystému Apple.

Hlavní body

  • Metal — nízkoúrovňové GPU API Apple s podporou grafiky a výpočtů
  • MTLDevice — abstrakce GPU, přes kterou jsou vytvářeny všechny prostředky Metalu
  • Příkazové buffery MTLCommandBuffer zajišťují vícevláknový zápis příkazů
  • Shadery Metal Shading Language jsou kompilovány do GPU kódu na základě C++14
  • Metal Performance Shaders poskytují optimalizované GPU funkce pro ML a filtraci

Co je Metal?

Metal je nízkoúrovňové API pro práci s grafickým procesorem (GPU), představené Apple v roce 2014 spolu s iOS 8 a OS X Yosemite. Metal byl vytvořen jako náhrada za OpenGL a OpenCL s cílem snížit režii CPU a poskytnout přímější přístup k GPU hardwaru na zařízeních Apple.

Na rozdíl od OpenGL, kde ovladač provádí mnoho kontrol a transformací na CPU, Metal používá model explicitního řízení zdrojů. Vývojář kontroluje alokaci paměti, synchronizaci a odesílání příkazů GPU, což poskytuje zvýšení výkonu až o 50% ve srovnání s OpenGL ES na stejném hardwaru.

Metal podporuje všechny čipy Apple, od A7 (2013) až po M4 Ultra (2025). API se neustále vyvíjí: Metal 3 (2022) přidal podporu mesh-shaderů a sledování paprsků, Metal 3.1 (2023) — rychlé sdílení zdrojů mezi CPU a GPU, a Metal 4 (2025) — hardwarovou akceleraci neuronových sítí na GPU s podporou FP8 a INT4.

Historie Metalu

První verze Metalu (2014) poskytovala základní API pro grafický rendering na iOS. Metal 2 (2017) přidal výpočetní shadery a Metal Performance Shaders. Metal 3 (2022) představil MetalFX Upscaling — vlastní technologii upscalingu pro hry, konkurenta NVIDIA DLSS a AMD FSR. MetalFX poskytuje zvýšení výkonu až 2x na Macu s M2.

Metal 4 (2025) se zaměřil na strojové učení a sledování paprsků. Podle údajů Apple (2025) dosahuje Metal 4 na M4 Ultra až 80 TFLOPS ve výpočetních úlohách při FP16 a podporuje hardwarové dekódování AV1. Metal je nyní také podporován na Apple Vision Pro prostřednictvím compositor služby pro rendering imerzivního obsahu.

Architektura Metalu: zařízení a zdroje

Architektura Metalu je postavena kolem konceptu explicitního řízení: vývojář vytváří objekty MTLDevice (zařízení), MTLBuffer (datové buffery), MTLTexture (textury) a MTLCommandQueue (fronta příkazů). Na rozdíl od OpenGL, kde je stav uložen v kontextu, Metal používá objekty stavu (state objects), které jsou kompilovány předem.

MTLDevice — vstupní bod API

MTLDevice představuje fyzické nebo virtuální GPU. Všechny prostředky Metalu jsou vytvářeny přes tento objekt: buffery, textury, knihovny shaderů, pipeliny. V systémech s více GPU (Mac Pro) lze zvolit konkrétní zařízení. Metoda supportsFamily: kontroluje podporu funkcí: sledování paprsků, mesh-shadery, MetalFX.

swift
import Metal
 
// Získání GPU zařízení
guard let device = MTLCreateSystemDefaultDevice() else {
    fatalError("Metal není podporován")
}
 
// Kontrola možností
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // „Apple M4 Pro”
let maxBufferSize = device.maxBufferLength

Vlastnost maxBufferLength určuje maximální velikost bufferu podporovanou zařízením. Na Apple Silicon s Unified Memory je limit až 128 GB (na M4 Ultra). To umožňuje práci s velkými datovými sadami pro ML a vědecké výpočty bez segmentace bufferů. Zařízení také spravuje paměťový pool prostřednictvím MTLHeap.

MTLBuffer a MTLTexture — data pro GPU

MTLBuffer — souvislá oblast paměti přístupná GPU. Buffery se používají pro vrcholová data, matice, uniform proměnné. Režimy: shared (přístup CPU + GPU v jednotné paměti), private (pouze GPU, rychlejší), managed (pro diskrétní GPU se synchronizací). Na Apple Silicon se doporučuje shared pro jednoduchost.

MTLTexture — vícerozměrné pole pixelů pro textury a renderovací cíle. Podporovány jsou 1D, 2D, 3D, cube a array textury. Formáty: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (komprese), hloubkové (depth32Float) a stencil. Texture Usage flagy určují, jak bude textura použita: rendering, čtení shaderem, kopírování.

MTLLibrary a kompilace shaderů

MTLLibrary — kolekce kompilovaných GPU funkcí (shaderů). Knihovna může být vytvořena ze zdrojového kódu MSL (Metal Shading Language) za běhu nebo předkompilována a zahrnuta do balíčku (.metallib). Doporučuje se předkompilace pro odstranění zpoždění ve fázi inicializace.

MTLFunction představuje konkrétní funkci shaderu. Vertex shadery, fragment shadery, výpočetní (kernel) a mesh-shadery jsou vytvářeny prostřednictvím knihovny. Funkce jsou ukládány do cache na GPU a znovu používány mezi snímky. Argumenty shaderů jsou specifikovány prostřednictvím bufferů a texturových slotů s vazbou podle indexu.

Rendering přes Metal: příkazové buffery

Rendering v Metalu je organizován prostřednictvím asynchronních front příkazů. Vývojář vytvoří MTLCommandBuffer, zakóduje do něj příkazy renderingu nebo výpočtů a odešle do MTLCommandQueue. GPU provádí příkazy sekvenčně, zatímco CPU může pokračovat v práci. Synchronizace probíhá prostřednictvím semaforů nebo completionHandler.

MTLCommandQueue a MTLCommandBuffer

MTLCommandQueue — fronta příkazů vytvořená z MTLDevice. Aplikace může mít několik front pro grafiku, výpočty a kopírování. Každá fronta zaručuje sekvenční provádění příkazů. MTLCommandBuffer — kontejner pro jednu dávku práce GPU. Po zakódování je potvrzen a proveden na GPU.

swift
// Hlavní renderovací cyklus
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()

Metoda drawPrimitives provádí kreslení geometrie. Parametr vertexCount udává počet vrcholů. Pro každý snímek je vytvořen nový command buffer. Present synchronizuje kreslení s VSync obrazovky. Metal automaticky spravuje synchronizaci s displejem prostřednictvím CAMetalLayer.

Stav renderovacího pipeline

MTLRenderPipelineState — kompilovaný stav renderovacího pipeline, zahrnující vertex a fragment shadery, konfiguraci depth-stencil, blending a formát výstupních pixelů. Vytvoření pipeline state je nákladná operace, proto jsou objekty ukládány do cache a znovu používány. Pro různé kombinace shaderů jsou vytvářeny různé pipeline states.

Metal 3.1 představil rychlý rendering prostřednictvím Immutable Samplers, které jsou ukládány do cache na GPU pro urychlení vzorkování textur. Metal podporuje až 31 textur na slot shaderu v prostředích Apple Silicon. Na starších zařízeních s A13 a níže je limit snížen na 16 slotů. Doporučuje se spojování textur do Texture Atlases pro snížení počtu vzorků.

Metal Shading Language a shadery

Metal Shading Language (MSL) — programovací jazyk shaderů založený na C++14 s rozšířeními pro GPU výpočty. MSL podporuje šablony (templates), přetěžování funkcí, jmenné prostory a adresní aritmetiku. Shadery jsou kompilovány do binárního GPU kódu prostřednictvím Apple LLVM backendu.

Vertex a fragment shadery

Vertex shader zpracovává každý vrchol: transformuje souřadnice z prostoru světa do prostoru obrazovky, počítá normály a předává data fragment shaderu. Fragment shader počítá barvu každého pixelu: aplikuje textury, osvětlení a efekty post-processingu.

cpp
// Metal vertex shader
#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;
}

Atributy [[attribute(N)]] odpovídají formátům vrcholů specifikovaným v MTLVertexDescriptor. Buffer [buffer(0)] předává matici MVP jako uniform proměnnou. Pozice vrcholu musí být označena [[position]] pro předání rasterizátoru. Všechny MSL vektorové typy — float2, float3, float4 — jsou mapovány na hardwarové registry GPU.

Výpočetní shadery (Compute Kernels)

Compute shader (kernel) — GPU funkce prováděná mimo grafický pipeline. Kernel funkce jsou označeny kvalifikátorem kernel a prováděny ve vláknech (threads) organizovaných do skupin (threadgroups). Výpočetní shadery se používají pro zpracování obrazu, simulaci fyziky, ML a post-processing.

cpp
// Compute kernel pro rozostření obrazu
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);
}

Parametr gid [[thread_position_in_grid]] obsahuje jedinečný index vlákna. Texture2D se specializuje podle typu pixelu: half (FP16), float (FP32). Compute kernels mohou být spuštěny s velikostí mřížky přes 1 miliardu vláken na M4 Ultra. Maximální velikost threadgroup je 1024 vláken na GPU Apple Silicon.

Výkon a Metal Performance Shaders

Metal Performance Shaders (MPS) — knihovna optimalizovaných GPU funkcí od Apple. MPS zahrnuje konvoluční neuronové sítě (MPSNNConvolution), maticové násobení (MPSMatrixMultiplication), třídění (MPSParallelSort) a zpracování obrazu (MPSImageGaussianBlur). Všechny funkce jsou optimalizovány pro konkrétní GPU Apple.

MetalFX Upscaling

MetalFX — technologie upscalingu a vyhlazování, konkurent NVIDIA DLSS a AMD FSR. MetalFX nabízí dva režimy: Spatial (prostorový upscaling pomocí algoritmu FSR 2) a Temporal (časový upscaling s motion vectors). Temporal MetalFX poskytuje kvalitu blízkou nativnímu 4K z renderingu ve 1440p.

Podle údajů Apple (2025) poskytuje MetalFX Temporal na M4 Max zvýšení výkonu až 3x ve hrách při zachování kvality vizuálně nerozeznatelné od nativního rozlišení. MetalFX funguje na jakémkoli GPU podporujícím Metal 3, bez vyhrazených tensor jader. Integrace MetalFX do projektu vyžaduje přibližně 50 řádků kódu.

Sledování paprsků v Metalu

Ray Tracing v Metal 3 je podporován na čipech M3, M4 a A17 Pro s hardwarovými akceleračními bloky (Ray Tracing Accelerators). Metal poskytuje MTLAccelerationStructure pro stavbu BVH a MTLIntersectionFunction pro průsečík paprsků v shaderech. Obří scény s miliony trojúhelníků jsou kompilovány do BVH v milisekundách.

Podle údajů Apple (2025) provádí hardwarové sledování paprsků na M4 Ultra až 40 miliard průsečíků paprsků za sekundu (Giga rays/s). To je 4krát rychlejší než softwarové sledování paprsků na M1 Ultra. Metal RT podporuje intersection queries, dynamické geometrie a Motion Blur pro realistické animace. Odrazy a stíny se sledováním paprsků fungují v reálném čase při 60 FPS.

Unified Memory a Zero-Copy

Unified Memory — architektura Apple Silicon, kde CPU a GPU používají stejnou fyzickou paměť. Metal na Apple Silicon nevyžaduje kopírování dat mezi CPU a GPU: MTLBuffer v shared režimu je přístupný oběma procesorům bez kopírování. To odstraňuje hlavní úzké hrdlo tradičních GPU (PCIe přenosy).

Zero-Copy v Metalu umožňuje CPU zapisovat data do bufferu a GPU je číst bez zpoždění. Podle údajů Apple (2025) to poskytuje zvýšení výkonu o 30–50% ve srovnání s diskrétními GPU ve hrách a ML úlohách. Pro diskrétní GPU (Mac Pro s Radeon) Metal podporuje managed režim s automatickou synchronizací prostřednictvím memory barriers.

Často kladené otázky

Co je Metal a k čemu slouží?

Metal — nízkoúrovňové Apple API pro práci s GPU, poskytující minimální režii CPU. Je potřeba pro 3D grafiku, ML výpočty, zpracování obrazu a simulace na iOS, macOS a tvOS. Nahrazuje OpenGL a OpenCL.

Čím se Metal liší od Vulkanu?

Metal funguje pouze na zařízeních Apple, je integrován s Unified Memory a Metal Performance Shaders. Vulkan je multiplatformní API pro Windows, Android a Linux. Z hlediska výkonu jsou obě API srovnatelná, ale Metal má nižší režii na Apple Silicon.

Podporuje Metal sledování paprsků?

Ano, od Metal 3 na čipech M3, M4 a A17 Pro je k dispozici hardwarové sledování paprsků. Metal poskytuje MTLAccelerationStructure a podporu intersection queries v shaderech. Výkon — až 40 Giga rays/s na M4 Ultra.

Co je MetalFX Upscaling?

MetalFX — technologie upscalingu Apple s režimy Spatial a Temporal. Funguje na jakémkoli GPU s Metal 3, bez tensor jader. Poskytuje zvýšení výkonu až 3x s kvalitou blízkou nativnímu 4K na M4 Max.

Je těžké začít pracovat s Metalem?

Práh vstupu je vyšší než u SceneKit nebo Unity kvůli nízkoúrovňovému řízení zdrojů. Apple poskytuje Metal Sample Code a tutoriály na developer.apple.com. Pro základní rendering trojúhelníku je potřeba přibližně 200 řádků kódu.

Shrnutí

  • Metal — nízkoúrovňové GPU API Apple s minimální režií CPU
  • MTLDevice a MTLCommandQueue — základ architektury s explicitním řízením zdrojů
  • MTLCommandBuffer a kodéry zajišťují vícevláknový zápis GPU příkazů
  • Metal Shading Language (C++14) podporuje vertex, fragment, compute a mesh shadery
  • MetalFX — upscaling se zvýšením až 3x na jakémkoli GPU s Metal 3
  • Hardwarové sledování paprsků k dispozici na M3/M4/A17 Pro
  • Unified Memory na Apple Silicon odstraňuje kopírování dat mezi CPU a GPU

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také