Metal — 그래픽 API 및 셰이더

저자: IT Sectr 게시일: 2026-05-03 읽는 시간: 10 분

Metal은 Apple의 저수준 그래픽 및 컴퓨트 API로, iOS, macOS 및 tvOS에서 GPU에 직접 접근할 수 있게 해줍니다. OpenGL과 OpenCL을 대체하며 최소한의 CPU 오버헤드와 예측 가능한 성능을 제공합니다. Apple WWDC (2025)에 따르면 Apple 생태계에서 GPU 렌더링을 사용하는 애플리케이션의 98%에서 Metal이 사용됩니다.

핵심 요점

  • Metal — 그래픽 및 컴퓨트를 지원하는 Apple의 저수준 GPU API
  • MTLDevice — 모든 Metal 리소스가 생성되는 GPU 추상화
  • 명령 버퍼 MTLCommandBuffer는 멀티스레드 명령 기록을 가능하게 함
  • Metal Shading Language 셰이더는 C++14 기반 GPU 코드로 컴파일됨
  • Metal Performance Shaders는 ML 및 필터링을 위한 최적화된 GPU 함수를 제공

Metal이란?

Metal은 그래픽 처리 장치(GPU)를 사용하기 위한 저수준 API로, 2014년 Apple이 iOS 8 및 OS X Yosemite와 함께 발표했습니다. 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를 나타냅니다. 모든 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에서 제한은 최대 128GB(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 작업의 한 배치를 위한 컨테이너입니다. 인코딩 후 커밋되어 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는 두 가지 모드를 제공합니다: 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 애플리케이션을 만듭니다. 저희가 상담해 드리고 최적의 솔루션을 제안하겠습니다.

프로젝트 논의

더 읽어보기