Metal — o que é, API gráfica e shaders

Autor: IT Sectr Publicado: 2026-05-03 Tempo de leitura: 10 min

Metal é uma API gráfica e de computação de baixo nível da Apple, que fornece acesso direto à GPU em iOS, macOS e tvOS. Ela substitui OpenGL e OpenCL, oferecendo sobrecarga mínima de CPU e desempenho previsível. De acordo com a Apple WWDC (2025), Metal é usado em 98% das aplicações com renderização por GPU no ecossistema Apple.

Pontos Principais

  • Metal — API GPU de baixo nível da Apple com suporte a gráficos e computação
  • MTLDevice — abstração da GPU através da qual todos os recursos Metal são criados
  • Buffers de comando MTLCommandBuffer permitem gravação multithread de comandos
  • Shaders Metal Shading Language compilam para código GPU baseado em C++14
  • Metal Performance Shaders fornecem funções GPU otimizadas para ML e filtragem

O que é Metal?

Metal é uma API de baixo nível para trabalhar com a unidade de processamento gráfico (GPU), apresentada pela Apple em 2014 juntamente com iOS 8 e OS X Yosemite. Metal foi criado como substituto de OpenGL e OpenCL com o objetivo de reduzir a sobrecarga da CPU e fornecer acesso mais direto ao hardware da GPU em dispositivos Apple.

Ao contrário do OpenGL, onde o driver realiza muitas verificações e transformações na CPU, Metal utiliza um modelo de gerenciamento explícito de recursos. O desenvolvedor controla a alocação de memória, sincronização e envio de comandos à GPU, proporcionando até 50% de melhoria de desempenho em relação ao OpenGL ES no mesmo hardware.

Metal suporta todos os chips Apple desde A7 (2013) até M4 Ultra (2025). A API evolui constantemente: Metal 3 (2022) adicionou suporte a mesh shaders e ray tracing, Metal 3.1 (2023) — compartilhamento rápido de recursos entre CPU e GPU, e Metal 4 (2025) — aceleração de hardware de redes neurais na GPU com suporte FP8 e INT4.

História do Metal

A primeira versão do Metal (2014) fornecia uma API básica para renderização gráfica no iOS. Metal 2 (2017) adicionou compute shaders e Metal Performance Shaders. Metal 3 (2022) introduziu MetalFX Upscaling — o próprio upscaling da Apple para jogos, concorrente do NVIDIA DLSS e AMD FSR. MetalFX oferece até 2x de melhoria de desempenho no Mac com M2.

Metal 4 (2025) focou em aprendizado de máquina e ray tracing. De acordo com a Apple (2025), Metal 4 no M4 Ultra oferece até 80 TFLOPS em tarefas de computação em FP16 e suporta decodificação de hardware AV1. Metal agora também é suportado no Apple Vision Pro através do serviço compositor para renderização de conteúdo imersivo.

Arquitetura Metal: Dispositivo e Recursos

A arquitetura Metal é construída em torno do conceito de gerenciamento explícito: o desenvolvedor cria objetos MTLDevice (dispositivo), MTLBuffer (buffers de dados), MTLTexture (texturas) e MTLCommandQueue (fila de comandos). Ao contrário do OpenGL, onde o estado é armazenado no contexto, Metal usa objetos de estado compilados antecipadamente.

MTLDevice — Ponto de Entrada da API

MTLDevice representa uma GPU física ou virtual. Todos os recursos Metal são criados através deste objeto: buffers, texturas, bibliotecas de shaders, pipelines. Em sistemas com múltiplas GPUs (Mac Pro) pode-se selecionar um dispositivo específico. O método supportsFamily: verifica suporte a recursos: ray tracing, mesh shaders, MetalFX.

swift
import Metal
 
// Obtendo o dispositivo GPU
guard let device = MTLCreateSystemDefaultDevice() else {
    fatalError("Metal não suportado")
}
 
// Verificando capacidades
let supportsRayTracing = device.supportsFamily(.metal3)
let gpuName = device.name // "Apple M4 Pro"
let maxBufferSize = device.maxBufferLength

A propriedade maxBufferLength determina o tamanho máximo de buffer suportado pelo dispositivo. No Apple Silicon com Unified Memory o limite é de até 128 GB (no M4 Ultra). Isso permite trabalhar com grandes conjuntos de dados para ML e computação científica sem segmentação de buffers. O dispositivo também gerencia o pool de memória através de MTLHeap.

MTLBuffer e MTLTexture — Dados para GPU

MTLBuffer — uma região de memória contígua acessível pela GPU. Buffers são usados para dados de vértices, matrizes, variáveis uniform. Modos: shared (acesso CPU + GPU em memória unificada), private (apenas GPU, mais rápido), managed (para GPUs discretas, com sincronização). No Apple Silicon recomenda-se shared pela simplicidade.

MTLTexture — um array multidimensional de pixels para texturas e render targets. Suporta texturas 1D, 2D, 3D, cube e array. Formatos: RGBA8Unorm, BGRA8Unorm, RGBA16Float, R32Float, ASTC (comprimido), profundidade (depth32Float) e stencil. As flags Texture Usage indicam como a textura será usada: renderização, leitura de shader, cópia.

MTLLibrary e Compilação de Shaders

MTLLibrary — uma coleção de funções GPU compiladas (shaders). Uma biblioteca pode ser criada a partir do código-fonte MSL (Metal Shading Language) em tempo de execução ou pré-compilada e incluída no bundle (.metallib). Recomenda-se a pré-compilação para eliminar atrasos na inicialização.

MTLFunction representa uma função shader específica. Vertex shaders, fragment shaders, compute kernels e mesh shaders são criados através da biblioteca. As funções são armazenadas em cache na GPU e reutilizadas entre quadros. Os argumentos de shaders são passados através de buffers e slots de textura com vinculação por índice.

Renderização com Metal: Buffers de Comando

A renderização em Metal é organizada através de filas de comando assíncronas. O desenvolvedor cria um MTLCommandBuffer, codifica comandos de renderização ou computação e o submete à MTLCommandQueue. A GPU executa os comandos sequencialmente enquanto a CPU pode continuar trabalhando. A sincronização ocorre através de semáforos ou completionHandler.

MTLCommandQueue e MTLCommandBuffer

MTLCommandQueue — uma fila de comandos criada a partir de MTLDevice. Uma aplicação pode ter múltiplas filas para gráficos, computação e cópia. Cada fila garante a execução sequencial de comandos. MTLCommandBuffer — um contêiner para um lote de trabalho da GPU. Após a codificação, é cometido e executado na GPU.

swift
// Loop principal de renderização
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()

O método drawPrimitives executa a renderização de geometria. O parâmetro vertexCount especifica o número de vértices. Um novo command buffer é criado para cada quadro. Present sincroniza a renderização com o VSync do display. Metal gerencia automaticamente a sincronização com o display através de CAMetalLayer.

Estado do Pipeline de Renderização

MTLRenderPipelineState — um estado de pipeline de renderização compilado, incluindo vertex e fragment shaders, configuração de depth-stencil, blending e formato de pixels de saída. Criar um pipeline state é uma operação cara, portanto os objetos são armazenados em cache e reutilizados. Diferentes pipeline states são criados para diferentes combinações de shaders.

Metal 3.1 introduziu renderização rápida através de Immutable Samplers que são armazenados em cache na GPU para acelerar a amostragem de textura. Metal suporta até 31 texturas por slot de shader no Apple Silicon. Em dispositivos antigos com A13 e abaixo o limite é reduzido para 16 slots. Recomenda-se combinar texturas em Texture Atlases para reduzir o número de amostras.

Metal Shading Language e Shaders

Metal Shading Language (MSL) é uma linguagem de programação de shaders baseada em C++14 com extensões para computação em GPU. MSL suporta templates, sobrecarga de funções, namespaces e aritmética de endereços. Os shaders são compilados em código GPU binário através do backend LLVM da Apple.

Vertex e Fragment Shaders

Vertex shader processa cada vértice: transforma coordenadas do espaço mundial para o espaço de tela, calcula normais e passa dados ao fragment shader. Fragment shader calcula a cor de cada pixel: aplica texturas, iluminação e efeitos de pós-processamento.

cpp
// Vertex shader 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;
}

Os atributos [[attribute(N)]] correspondem a formatos de vértice especificados em MTLVertexDescriptor. O buffer [buffer(0)] passa a matriz MVP como variável uniform. A posição do vértice deve ser marcada com [[position]] para passar ao rasterizador. Todos os tipos vetoriais MSL — float2, float3, float4 — mapeiam para registros de hardware da GPU.

Compute Kernels

Compute shader (kernel) é uma função GPU executada fora do pipeline gráfico. Funções kernel são marcadas com o qualificador kernel e executadas em threads organizadas em threadgroups. Compute shaders são usados para processamento de imagens, simulação de física, ML e pós-processamento.

cpp
// Kernel de computação para desfoque de imagem
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);
}

O parâmetro gid [[thread_position_in_grid]] contém o índice único da thread. Texture2D<type> é especializado por tipo de pixel: half (FP16), float (FP32). Compute kernels podem ser executados com tamanho de grid de mais de 1 bilhão de threads no M4 Ultra. O tamanho máximo do threadgroup é de 1024 threads em GPU Apple Silicon.

Desempenho e Metal Performance Shaders

Metal Performance Shaders (MPS) é uma biblioteca de funções GPU otimizadas fornecida pela Apple. MPS inclui redes neurais convolucionais (MPSNNConvolution), multiplicação de matrizes (MPSMatrixMultiplication), ordenação (MPSParallelSort) e processamento de imagens (MPSImageGaussianBlur). Todas as funções são otimizadas para GPUs Apple específicas.

MetalFX Upscaling

MetalFX é uma tecnologia de upscaling e anti-aliasing, concorrente do NVIDIA DLSS e AMD FSR. MetalFX oferece dois modos: Spatial (upscaling espacial através do algoritmo FSR 2) e Temporal (upscaling temporal com motion vectors). MetalFX Temporal oferece qualidade próxima ao 4K nativo a partir de uma renderização em 1440p.

De acordo com a Apple (2025), MetalFX Temporal no M4 Max oferece até 3x de melhoria de desempenho em jogos mantendo qualidade visualmente indistinguível da resolução nativa. MetalFX funciona em qualquer GPU compatível com Metal 3, sem núcleos tensor dedicados. Integrar MetalFX num projeto requer cerca de 50 linhas de código.

Ray Tracing no Metal

Ray Tracing no Metal 3 é suportado em chips M3, M4 e A17 Pro com unidades de aceleração de hardware (Ray Tracing Accelerators). Metal fornece MTLAccelerationStructure para construir BVH e MTLIntersectionFunction para interseção de raios em shaders. Cenas massivas com milhões de triângulos são compiladas em BVH em milissegundos.

De acordo com a Apple (2025), o ray tracing por hardware no M4 Ultra realiza até 40 bilhões de interseções de raios por segundo (Giga rays/s). Isso é 4 vezes mais rápido que o ray tracing por software no M1 Ultra. Metal RT suporta intersection queries, geometria dinâmica e Motion Blur para animações realistas. Reflexos e sombras com ray tracing funcionam em tempo real a 60 FPS.

Memória Unificada e Zero-Copy

Unified Memory é a arquitetura Apple Silicon onde CPU e GPU compartilham a mesma memória física. Metal no Apple Silicon não requer cópia de dados entre CPU e GPU: MTLBuffer em modo shared é acessível a ambos os processadores sem cópia. Isso elimina o principal gargalo das GPUs tradicionais (transferências PCIe).

Zero-Copy no Metal permite que a CPU escreva dados num buffer e a GPU os leia sem atrasos. De acordo com a Apple (2025), isso proporciona uma melhoria de desempenho de 30–50% em relação a GPUs discretas em jogos e tarefas de ML. Para GPUs discretas (Mac Pro com Radeon) Metal suporta modo managed com sincronização automática através de memory barriers.

Perguntas Frequentes

O que é Metal e para que serve?

Metal é a API GPU de baixo nível da Apple que fornece sobrecarga mínima de CPU. É usada para gráficos 3D, computação ML, processamento de imagens e simulações em iOS, macOS e tvOS. Substitui OpenGL e OpenCL.

Como Metal difere do Vulkan?

Metal funciona apenas em dispositivos Apple, integrado com Unified Memory e Metal Performance Shaders. Vulkan é uma API multiplataforma para Windows, Android e Linux. Ambas as APIs são comparáveis em desempenho, mas Metal tem menor sobrecarga no Apple Silicon.

Metal suporta ray tracing?

Sim, com Metal 3 nos chips M3, M4 e A17 Pro está disponível ray tracing por hardware. Metal fornece MTLAccelerationStructure e suporte a intersection queries em shaders. Desempenho — até 40 Giga rays/s no M4 Ultra.

O que é MetalFX Upscaling?

MetalFX é a tecnologia de upscaling da Apple com modos Spatial e Temporal. Funciona em qualquer GPU com Metal 3, sem núcleos tensor. Oferece até 3x de melhoria de desempenho com qualidade próxima ao 4K nativo no M4 Max.

É difícil começar a trabalhar com Metal?

A barreira de entrada é maior que SceneKit ou Unity devido ao gerenciamento de recursos de baixo nível. A Apple fornece Metal Sample Code e tutoriais em developer.apple.com. A renderização básica de um triângulo requer cerca de 200 linhas de código.

Resumo

  • Metal — API GPU de baixo nível da Apple com sobrecarga mínima de CPU
  • MTLDevice e MTLCommandQueue — a base da arquitetura com gerenciamento explícito de recursos
  • MTLCommandBuffer e codificadores permitem gravação multithread de comandos GPU
  • Metal Shading Language (C++14) suporta vertex, fragment, compute e mesh shaders
  • MetalFX — upscaling com até 3x de melhoria em qualquer GPU com Metal 3
  • Ray tracing por hardware disponível em M3/M4/A17 Pro
  • Memória unificada no Apple Silicon elimina cópia de dados entre CPU e GPU

Vamos desenvolver um aplicativo móvel chave na mão

A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.

Discutir o projeto

Leia também