Chapitre -126 · Avant de commencer

Avant de commencer

Ce livre est né d'un constat simple : l'API Metal n'a pas son LearnOpenGL.com !
En dehors de la documentation d'Apple — dense, uniquement en anglais, parfois datée et rarement pensée comme un parcours progressif — il n'existe presque aucune ressource sérieuse sur Metal. Ce site comble ce vide.

Tu vas apprendre à programmer le GPU directement, en C++ et en MSL, sur Apple Silicon. Pas de framework tiers, pas d'abstraction opaque — on utilisera metal-cpp, le wrapper C++ officiel d'Apple : une fine couche de headers au-dessus de l'API Objective-C native. Même ABI, zéro overhead, et on reste en C++ pur.

Autres langages hôtes possibles

Swift — bindings natifs, très propres, c'est ce qu'Apple met en avant.

Objective-C — l'API Metal d'origine, toujours supportée à 100 %.

Que tu sois débutant, passionné ou adepte du vibe coding, ces tutoriels sont faits pour toi. Bienvenue dans la communauté !

🔑 Tip Wikipédia

Ce livre contient beaucoup de liens Wikipédia. Il est recommandé de les consulter en anglais — les articles techniques anglophones sont systématiquement plus complets, mieux sourcés, et plus à jour que leurs équivalents français.

La très grande majorité de la documentation (pages man, samples Apple Metal, références C++, PDF de spécification, …) est en anglais également.

Ce dont tu as besoin

Matériel

Ce livre est écrit sur un M2 Pro, qui expose Metal 4 — mais pas encore les Mesh Shaders (disponibles à partir du M3). Tout le code de ce livre est testé sur cette configuration. Un Mac avec d'une puce Apple Silicon M1 ou plus récent suffit.

Pourquoi Apple Silicon ?

Sur les puces M, le CPU et le GPU partagent physiquement la même mémoire. Un buffer GPU n'est pas une copie — c'est le même bloc d'octets. Ça change fondamentalement la façon de concevoir un pipeline de données.

↘ Vérifier ton environnement (clang, xcrun, SDK)

Logiciel

Xcode (gratuit sur le Mac App Store) — version 15 minimum.

Terminal (pré-installé). Il te fera gagner un temps considérable.

Comment lire ce livre

Chaque chapitre suit à peu près la même structure :

Tous les projets de ce livre se compilent en ligne de commande avec make. Aucun projet Xcode n'est imposé — même si on l'utilisera aussi — et tu comprends exactement ce qui se passe à chaque étape de compilation.

Le chapitre Makefile fournit un modèle de base très solide que l'on réutilisera pour l'intégralité du cours.

Notre communauté est là pour te répondre.

Configuration de l'environnement de travail recommandé

Deux approches, toutes les deux valables :

Makefile

Travailler avec un Makefile, l'éditeur de ton choix et un simple terminal — très satisfaisant, parfait pour démarrer et comprendre ce qui se passe réellement. Un chapitre entier lui est consacré. Attention aux tabulations !

Xcode

Travaille avec l'éditeur Xcode — recommandé pour les projets plus grands : profilage GPU, Metal debugger intégré, et documentation accessible en deux clics.

Ø„Ø — Étape 1 — Création du projet

Nouveau Projet → Multi-plateforme → Jeu → Metal → Objective-C

Ø„Ø — Étape 2 — Suppression du storyboard

Supprimer le fichier Storyboard → Main.storyboard → Supprimer l'emplacement sélectionné en bleu sur la capture d'écran → Main storyboard file base name (macOS).

Nous utiliserons une application partagée, entièrement pilotée depuis le code.

Réglages du projet Xcode : l'entrée « Main storyboard file base name (macOS) » à supprimer, surlignée en bleu.
désolé pour le dark-mode

Ø„Ø - Étape 3 — Récupérer metal-cpp et ses extensions

Points importants concernant la documentation Apple (metal-cpp) (que tu dois suivre), elle ne contient pas les wrapper d'extensions (metal-cpp-extensions) de l'API Metal dans ce que tu es invité à télécharger.

Comme tu peux le voire sur la capture d'écran, le fichier compressé metal-cpp_26.4.zip dans lequel se trouve le dossier de fichiers metal-cpp ne contient pas les Wrappers AppKit & MetalKit.

Deux solutions s'offrent à toi : soit le trouver dans le projet de la WWDC2022 sur le lien soit cloner le repository du cours :

# Shell
git clone https://github.com/remdal/Metal-x-C---LearnMSL.dev.git learnmsl

Il se trouve dans le dossier Frameworks/.

*„* - Étape 4 — Régler le projet

Trois réglages à modifier dans Build Settings, au même endroit que la capture de l'étape 2. Utilise le champ de recherche en haut à droite :

Champ « Other C++ Flags » des Build Settings, contenant le flag -fno-objc-arc.
-fno-objc-arc : metal-cpp gère lui-même les compteurs de références.

Quelques rappels

Un pixel (picture element) est la plus petite unité adressable d'un écran : une case dans une grille 2D — ton framebuffer — qui stocke une couleur.

Un écran 1920×1080 contient 2 073 600 cases ; un écran 1280×720 en contient 921 600. Le GPU remplit ces cases à chaque frame.

En Metal, ces cases sont alimentées par des fragments : ce que produit la fonction de fragment, un float4 (R, G, B, A). Attention, un fragment n'est pas exactement un pixel — plusieurs fragments peuvent contribuer à la même case (recouvrement, MSAA) et certains sont éliminés avant d'être écrits (test de profondeur, discard).

Sous-pixels

Physiquement, un pixel est composé de trois sous-pixels — rouge, vert, bleu. C'est leur intensité relative qui produit la couleur perçue.

Certains panneaux ajoutent un quatrième sous-pixel blanc (RGBW sur certains LCD, WRGB sur les OLED de téléviseurs) pour gagner en luminosité.

L'alpha, lui, n'existe pas côté écran : c'est une notion purement logicielle qui indique au GPU « à quel point ce fragment est-il opaque ? », pour le blending.

L'ordre des chapitres compte pour pouvoir essayer les pratiques en direct. Et si tu ne comprends pas certaines choses, avance et tu peux y revenir plus tard. Prends tout de même note du code dans ton projet du cours pour être raccord avec la suite.

Chaque chapitre est autonome, mais l'ordre compte : les exemples se construisent les uns sur les autres et tu peux les tester au fur et à mesure. Si un point te résiste, avance et reviens-y plus tard — pense simplement à reporter le code dans ton projet du cours pour rester raccord avec la suite.