Introduction
LearnMSL.dev est une ressource éducationnelle entièrement gratuite. En espérant que tu fasses de belles choses avec ce cursus !
Les chapitres, les quiz et l'XP sont gratuits — il faut juste un compte pour suivre ta progression. L'abonnement ajoute une correction de ton code plus personnalisée, l'assistant RAG, et retire les publicités.
Les commentaires en bas à droite de chaque chapitre sont ouverts à tout le monde.
- Comprendre pourquoi Metal et C++ sont enseignés ensemble sur ce site
- Repérer les codes couleur utilisés dans tous les blocs de code du cours
- Savoir comment compiler et tester chaque chapitre (Make ou bouton Run Xcode)
- Découvrir le système d'XP, les quiz et la correction par soumission GitHub
Bienvenue à toi
Explore un langage de programmation qualifié de niche — un mot utilisé pour décourager — qui devient, une fois vraiment maîtrisé, un outil de création sans limites réelles.
Metal Shading Language - GPU programming on Apple Silicon
Metal étant une API graphique et non une plate-forme à part entière, il nécessite un second langage pour fonctionner. Nous avons opté pour le C++ qui est considéré comme un langage de niveau intermédiaire, combinant la puissance du bas niveau (gestion directe de la mémoire, performance) et les abstractions du haut niveau (programmation orientée objet, généricité). Il permet un contrôle matériel fin tout en offrant des structures de données complexes. Par conséquent, il sera appris en même temps.
Les langages de bas niveau (Assembleur, langage machine) communiquent directement avec le processeur, offrant un contrôle matériel total mais une complexité élevée. À l'inverse, les langages de haut niveau (Python, Java, …) utilisent des abstractions proches du langage humain, facilitant la programmation, la portabilité et la lisibilité au détriment de la performance brute.
Présentation du site
Les différents éléments pour ton parcours :
Les balises contenant du code
Les couleurs sont présentes à titre indicatif et peuvent être légèrement éronnées.
/// Ces morceaux contiennent le code et commençent par annoncer le langage :
→ MSL, C++, Objective-C, Objective-C++, Shell, C, Python, …
// On y retrouve ensuite le nom du fichier qui signifie que l'on garde cette partie pour la suite.
ou "Exemple" qui n'est qu'une démonstation, elle ne sera pas réutilisée.
// La dernière date de mise à jour du fichier (si le chapitre 126 est à jour, c'est que le -127
l'est jusqu'au 126 en passant par 0.
// Parfois une indication supplémentaire.
→ MSL — File.metal — update:09/09/26 — …
Cette couleur a été choisie pour colorer les types de données. Ce que le compilateur interprêtera.
→ float4x4, uint32_t, simd::float4, …
Cette couleur a été choisie pour colorer nos fonctions.
→ draw(), vertex_shader_main(), moveCamera(), …
Cette couleur a été choisie pour colorer nos classes :
→ Camera, Skybox, …
Cette couleur a été choisie pour colorer les chiffres.
→ Nous utilisons surtout les chiffres à virgules : 1.83483f, 3.141592654f, …
Cette couleur a été choisie pour colorer les chaines de caractères.
→ "Tout ce qui est texte" en programmation : ce qui est imprimé en console, ou encore les labels, …
Cette couleur a été choisie pour colorer les mots clés des langages.
→ if, else, for, const, static, bridge, class, …
Cette couleur a été choisie pour colorer les fonctions basiques fournies par les langages.
→ std::min, normalize, …
Pour colorer les fonctions déjà existantes et moins basiques, plutôt liées à Metal.
→ newTexture, setFragmentBuffer, addResidencySet, …
Pour cette couleur : nos namespaces, les pointeurs intelligents, nos templates et nos enumerateurs class.
→ Math::, meshes::, …
→ NS::SharedPtr, NS::TransferPtr et le get(), …
→ RenderMode, …
→ T, …
Cette couleur a été choisie pour colorer des commentaires
→ commentaire en C++, MSL, ObjC, C & ObjC++ : // … ou /* … */
→ commentaire en Shell & Python : # …
J'ai choisis ces couleurs pour colorer les directives de préprocesseurs & macros :
→ #define MTK_PRIVATE_IMPLEMENTATION, …
Tu y retrouveras aussi les structures nodes externes :
→ aiNode, aiScene, …
Pour ce qui est des includes :
→ #include <MetalKit/MetalKit.hpp>
Cette couleur a été choisie pour colorer les getters et setters.
→ getResult(), getLastHeight(), …
→ setTexture(), setComputePipelineState(), …
Celle-ci cherche une correspondance. Elle n'est pas utilse pour l'instant.
Cette couleur a été choisie pour colorer les classes déjà existantes fournies par Metal.
→ MTL::RenderPipelineDescriptor, MTL::TextureDescriptor, …
Cette couleur a été choisie pour colorer les protocoles.
→ NSApplicationDelegate, NSWindowDelegate, MTKViewDelegate, …
Cette couleur a été choisie pour colorer nos structures de données.
→ VertexOut, CameraUniforms, …
En blanc, toutes nos données.
→ frame, uniforms.position.y, …
La compilation en direct
Soit avec Make, soit avec le bouton Run dans l'éditeur Xcode d'Apple.
Le suivi
Première réponse sous 48 heures (généralement 45 minutes → (UTC+2))
Marco est un programme que j'ai écrit. Son rôle : garder le site en cohérence à mesure qu'il grandit — noms de variables, ordre des chapitres, code qui compile à chaque point, conventions respectées, tout en anglais là où c'est attendu, …
Si tu es abonné ou participatif et motivé, Marco reçoit ton code via GitHub pour vérifier la compilation et les conventions, il te corrigera sur certains aspects et t'enverra un premier feedback rapidement et je regarderai ensuite. Parfois j'y ajoute mon point de vue et évidemment je réponds aux questions mise en commentaire et autre — du premier point de participation jusqu'au projet final, qu'il s'agisse d'un jeu 3D ou d'un rendu qui pousse la puce à son maximum.
Style supplémentaire
Tout ceci inclut des mathématiques (algèbre linéaire, géométrie, trigonométrie, vecteurs, …) ré-expliquées, des techniques de rendu qui touchent à d'autres domaines et d’autres chapitres non-essentiels, tout dépend de tes projets. Plusieurs langages de programmation complètement différents sont évoqué, il y a de la conception sur le logiciel Blender avec des scripts écrits en Python.
Gagne de l'expérience dans ton parcours
Connectes-toi, réponds aux questions dès maintenant, fais-toi corriger par Marco et vois ton évolution ! En ouvrant le parcours tu accèdes à des questions, la légende des couleurs & d'autres surprises. En te faisant corriger, tu es certain de partir sur de bonnes bases. Tu peux suivre ton évolution en cliquant sur ton pseudo en haut à droite.
- Vecteurs
- Aucun en particulier
Une première référence au développement Bas Niveau :
L'ordre des chapitres commence à -127 : la valeur minimale qu'un signed char est garanti de pouvoir représenter d'après la norme C (SCHAR_MIN). Sur ton Mac c'est en réalité -128 — la norme s'arrêtait à -127 pour rester compatible avec les machines qui n'utilisaient pas le complément à deux.
Quelques mots
Tu n'es peut-être pas tombé ici par hasard. Ou peut-être que si — et c'est tout aussi bien parce que "Les meilleures directions sont parfois celles qu'on n'avait pas planifiées."
Ça peut faire peur, c'est vrai. Et parler directement au GPU, écrire des shaders qui s'exécutent sur des milliers de cœurs en parallèle, contrôler chaque pixel de ce qui s'affiche à l'écran — c'est un pouvoir monstrueux, certains pensent même que c'est une illusion.
Chacun des concepts que tu traverseras ici peut t'ouvrir des portes. L'apprentissage se révèle aussi stimulant que tu l'avais peut-être imaginé — parfois moins, souvent bien plus — parce qu'avoir une grande compréhension de ton Mac de manière générale peut s'avérer bien plus accessible que ce que tu pensais.
Si tu es arrivé ici, c'est que tu veux probablement apprendre le fonctionnement interne du rendu graphique et faire toi-même ce que tu voyais faire par d'autres avec des outils que tu ne contrôlais pas. Faire les choses toi-même est extrêmement satisfaisant, ça forge une débrouillardise rare.
Ce ne sera pas marrant tous les jours, mais ça ne dépend que de toi — de cette chose un peu irrationnelle qui te pousse à vouloir comprendre ce qui se passe vraiment derrière l'image et comment c'est possible, comment la lumière se simule, comment un GPU orchestre des millions d'opérations par frame, c'est l'une des expériences intellectuelles les plus satisfaisantes qu'un développeur puisse vivre.
La table des matières en dernier chapitre permet de retrouver les plus petites sections plus rapidement ou encore découvrir l'intégralité du cours.
Afin que tu essaies et modifies le code tout en suivant cette référence, pas mal de sujets sont expliqués en différés ou dans d'autres chapitres. J'ai fait au mieux. Au début il y a pas mal de mise en place mais ça reste super intéressant, réutilisable et fonctionnel.