3 points par GN⁺ 2023-11-24 | 1 commentaires | Partager sur WhatsApp
  • L’initiation au graphisme ne suit pas une seule bonne réponse : elle dépend des connaissances existantes, de la manière d’apprendre et du matériel, et l’équipe AMD Game Engineering estime qu’un point de départ plus accessible peut être nécessaire pour les débutants
  • La programmation graphique consiste à écrire à la fois du code C++ côté CPU et du code de shader côté GPU, puis à relier le tout via des API graphiques comme DirectX, Vulkan ou OpenGL
  • En 2023, les principaux choix se divisent entre les API legacy comme OpenGL, DirectX 11 et WebGL, et les API explicites modernes comme Vulkan, DirectX 12, Metal et WebGPU
  • Les API legacy sont plus faciles à apprendre, mais la complexité des pilotes et du runtime a augmenté ; les API modernes exigent davantage de code et une meilleure compréhension du GPU, en échange d’un contrôle accru
  • Au départ, on peut commencer dans un environnement simple comme OpenGL, WebGL, un moteur de jeu ou Shadertoy ; si l’on maîtrise déjà bien le C++ et le pipeline GPU, on peut aussi aller directement vers Vulkan ou DirectX 12

Structure de base de la programmation graphique

  • La réponse courte sur le langage principalement utilisé par les programmeurs graphiques est C++
  • En pratique, le travail consiste à écrire à la fois du code hôte exécuté sur le CPU et du code de shader exécuté sur le GPU
    • Le code hôte côté CPU est généralement écrit en C++
    • Le code GPU est écrit dans des langages de shading de haut niveau comme HLSL ou GLSL
  • Une API graphique est le point de jonction qui permet au code CPU de demander du travail au GPU à l’aide des shaders et des données et métadonnées nécessaires

Avec quelle API graphique commencer

  • En 2023, les API couramment utilisées pour les jeux PC et les applications 3D se divisent globalement en deux grandes catégories
    • API legacy : OpenGL, DirectX 11, WebGL
    • API explicites modernes : Vulkan, DirectX 12, Metal, WebGPU
  • OpenGL, DirectX 11 et WebGL reposent sur une approche historique de la programmation GPU et, du point de vue du programmeur, sont plus simples donc plus faciles à apprendre
  • Cette simplicité a un coût
    • Avec le temps, l’implémentation interne des pilotes et du runtime s’est complexifiée
    • Cela conduit à des goulets d’étranglement côté hôte et à une lourde charge de complexité pour les pilotes écrits par les fabricants de GPU
  • Mantle d’AMD est apparu sur PC entre 2013 et 2016 et, grâce à une collaboration entre les GPU AMD et EA DICE, a proposé un accès GPU plus bas niveau et une abstraction plus légère
  • Metal est apparu en 2014 sur les plateformes Apple, tandis que DirectX 12 et Vulkan sont arrivés en 2016 pour aborder la programmation GPU de manière plus bas niveau et plus explicite

Le compromis d’apprentissage entre API simples et API explicites

  • Vulkan et DirectX 12 demandent au programmeur de préciser plus clairement ce qu’il veut que le GPU fasse, ce qui alourdit la phase de démarrage
  • En contrepartie, on obtient plus de contrôle, ainsi que davantage d’occasions d’améliorer les performances et l’efficacité du travail GPU
  • Rien qu’avec l’exemple du premier triangle affiché, la différence entre les API apparaît clairement
    • OpenGL ou DirectX 11 permettent d’afficher un premier triangle avec environ 10 lignes
    • Vulkan et DirectX 12 demandent bien plus de code
  • OpenGL et DirectX 11 masquent beaucoup de détails, ce qui permet d’accéder rapidement à un travail graphique productif, mais peut donner l’impression que le fonctionnement du GPU est une boîte magique
  • Vulkan et DirectX 12 exigent dès le départ des connaissances plus bas niveau et une compréhension du GPU, mais en échange chaque ligne de code montre plus clairement ce qui va se passer sur le GPU

Les options de parcours d’apprentissage

  • Même au sein de l’équipe AMD Game Engineering, certains estiment que commencer avec DX12 ou Vulkan est trop abrupt pour des adolescents ou des débutants, tandis que d’autres pensent que c’est possible si les conditions sont réunies
  • OpenGL a perdu en modernité et en pertinence, mais reste jugé tout à fait suffisant pour apprendre les bases
  • WebGL peut constituer un point de départ facile pour comprendre le pipeline graphique
    • Sur le Web, on peut faire du graphisme temps réel en JavaScript sans C++
    • Avec WebAssembly, il est aussi possible d’exécuter du graphisme C++ dans le navigateur
  • WebGPU fournit des concepts plus proches des API graphiques modernes tout en pouvant exiger moins de détails bas niveau
    • Dès qu’on commence à écrire du code complexe, on peut encore rencontrer divers problèmes
    • Il est prometteur comme API de prototypage et d’apprentissage ou d’enseignement
  • Il est aussi possible de commencer par un moteur de jeu
    • Unreal Engine occupe une place importante dans les jeux PC
    • Unity est aussi une alternative courante
    • Il existe aussi des moteurs open source plus petits et plus simples comme Godot
  • Certaines écoles donnent leur premier cours de rendu avec Unity, mais cela comporte le risque que les étudiants ne comprennent pas pourquoi ils doivent apprendre les connaissances bas niveau
  • Pour commencer avec une API explicite, il faut soit déjà bien connaître le pipeline graphique moderne et la logique générale avec laquelle le matériel GPU l’implémente, soit être prêt à acquérir cette compréhension en parallèle

Ressources recommandées et étapes suivantes

  • LearnOpenGL : un bon site pour débuter et apprendre la programmation graphique avec une vraie API en C++
  • Scratchapixel : permet de se concentrer sur le fonctionnement de concepts comme le ray tracing sans beaucoup de code
  • Udemy : peut servir à trouver des cours pour débutants
  • Rastertek : tutoriels OpenGL et DirectX 11
  • Ray Tracing in One Weekend : adapté à une approche où l’on apprend en construisant soi-même, si l’on sait déjà un peu coder
  • A trip through the graphics pipeline : bien que datant de 2011 et antérieur aux API explicites, reste pertinent pour les concepts matériels et logiciels du point de vue du GPU
  • learn wgpu : site d’apprentissage WebGPU dans un style proche de LearnOpenGL, encore en cours d’élaboration
  • Your first WebGPU app : peut servir d’introduction à WebGPU
  • Shadertoy : point de départ plus simple, car il permet d’écrire des shaders sans manipuler directement une API graphique
  • Vulkan Tutorial : également cité dans l’idée qu’il ne faut pas avoir peur du copier-coller quand on apprend Vulkan ou DirectX 12
  • Si vous n’avez pas encore choisi un langage ou un écosystème d’API, vous pouvez essayer plusieurs approches puis continuer avec celle qui vous convient le mieux

1 commentaires

 
GN⁺ 2023-11-24
Commentaires sur Hacker News
  • Pour les débutants, il vaut mieux ne pas commencer par « quels outils utiliser ? », mais prendre un pas de recul et se demander d’abord « qu’est-ce que je veux créer ? »
    Même au moment d’apprendre, il ne faut pas perdre de vue le résultat final. Aujourd’hui, en infographie, il existe énormément d’outils qui abstraient les différentes étapes du rendu de pixels à l’écran ; on peut donc souffrir très tôt sur du code bas niveau, puis se rendre compte plus tard que, dans le domaine visé, on n’utilise presque que Unity, TouchDesigner, threejs ou After Effects, et quasiment pas C++
    Bien sûr, apprendre comment tout fonctionne au niveau le plus bas a une valeur énorme, mais en faire la toute première étape me semble être une approche lente. On apprend plus vite une fois entré dans le secteur, quand on acquiert l’intuition du fonctionnement interne à travers des outils d’abstraction comme les moteurs de jeu ou la programmation visuelle
    J’ai passé des années à apprendre péniblement C++ et OpenGL, et à lutter longtemps contre le coût irrécupérable qui m’empêchait d’accepter les approches no-code. Si, au final, cela ne vous aide pas à créer ce que vous voulez, mieux vaut ne pas gaspiller votre temps dans cette voie

    • Il faut écouter ce conseil. Au début de ma carrière, j’avais décidé de devenir un spécialiste d’OpenGL, et je pense y être parvenu dans une certaine mesure
      Je n’ai pas écrit de manuel comme Mark Kilgard, mais j’ai travaillé en profondeur sur plusieurs couches de l’API, depuis le niveau pilote jusqu’aux tests de conformité, à l’optimisation des performances, au code des jeux et des applications, sur les principales plateformes desktop et mobiles
      Mais où cela m’a-t-il mené ? En réalité, pas très loin. Presque plus personne ne se soucie d’OpenGL aujourd’hui, et la technologie est quasiment morte depuis que deux grands éditeurs d’OS l’ont finalement abandonnée. Il suffit de chercher OpenGL dans “HN Who's Hiring”
      J’aurais pu réapprendre d’autres API graphiques comme Direct3D, Vulkan ou Metal, mais les moteurs abstraient désormais le code graphique bas niveau, donc il n’y a pas tant d’endroits qui ont besoin de ce profil. Quant aux entreprises qui ont besoin de spécialistes des pilotes graphiques bas niveau, il n’y en a guère plus de 5 ou 6 dans le monde, ce qui en fait une niche qui limite la carrière
      Plus on se concentre sur une petite partie de la machine, plus il faut devenir un expert de niveau mondial pour en faire toute sa carrière. À moins de viser à devenir le prochain John Carmack, je recommande de privilégier la largeur plutôt que la profondeur
    • C’est un piège classique dans lequel tombent toujours les nouveaux développeurs. Et cela ne concerne pas seulement la programmation graphique
      YouTube regorge de vidéos de programmation pour débutants qui enchaînent les technologies au lieu de se concentrer sur la création de quelque chose d’intéressant. Résultat : pour remplir leur CV, ils construisent des usines à gaz façon cargo cult et Rube Goldberg pour afficher trois lignes de texte sur une page web
      À l’université, j’ai fait un peu de programmation graphique pendant un semestre, et c’était déjà suffisamment complexe pour que la seule réponse raisonnable à « qu’est-ce que je veux créer ? » soit « afficher un triangle vert sur fond noir ». À partir de là, passer à un rectangle, un cube, une sphère, une sphère animée, puis une balle qui rebondit, est une progression naturelle qui aide à rester focalisé sur l’objectif. Il faut donc éviter de répondre à cette question par « un FPS avec éclairage en ray tracing et diffusion sous-surfacique »
      Le code de la première version de la balle qui rebondit sera vraiment horrible. Et ce n’est pas grave. Avec le temps, on apprend à l’optimiser et à l’améliorer. Et il n’y a presque rien d’aussi grisant que de découvrir soi-même des design patterns. On lit un livre sur un nouveau sujet et on se dit : « Ah, mais je fais déjà ça ! »
    • En tant que personne qui essaie d’entrer dans ce domaine, j’ai un peu de mal à être d’accord. Une grande partie, peut-être même la totalité, des offres d’emploi en programmation graphique demandent des connaissances en C++ au préalable
      Bien sûr, on peut entrer par un autre rôle, comme programmeur gameplay, puis évoluer progressivement vers le graphisme, et c’est peut-être plus simple. Mais au final, le poste de programmeur graphique exige C++
      Ce qui a été dit plus haut correspond davantage à quelqu’un qui veut devenir rapidement productif sur des tâches liées au graphisme, plutôt qu’à la programmation graphique elle-même
    • C’est un bon conseil. On tombe dans le même piège avec des questions du type « quel langage faut-il apprendre / quel est le meilleur langage ? », parce qu’on saute l’étape « qu’est-ce que je veux créer ? »
      Les outils changent avec le temps et, d’après mon expérience, les excellents ingénieurs sont souvent ceux qui savent manier plusieurs outils avec des niveaux de maîtrise variés, plutôt que d’approfondir un seul outil
    • Je pense qu’il reste utile d’enseigner ce type de programmation bas niveau à l’université, comme on le fait pour les algorithmes de tri
      Même si l’on ne fait pas ce travail en entreprise ensuite, on y gagne beaucoup de connaissances théoriques et un entraînement à des algorithmes complexes
      Le graphisme apporte aussi beaucoup d’expérience en mathématiques appliquées. Il existe vraiment beaucoup de domaines qui cherchent désespérément des gens capables de faire des maths. Dans mon ancien emploi, dans les logiciels pour machines CNC, il fallait quelqu’un capable de programmer les mathématiques nécessaires pour contrôler la perceuse afin d’usiner une forme précise dans un bloc de métal, et c’était extrêmement difficile à trouver. À l’inverse, un ingénieur cloud DevOps, même cher, se trouvait relativement facilement
  • Pour un programmeur graphique, il est préférable d’avoir une compréhension globale et équilibrée du fonctionnement du graphisme. Au-delà de la simple programmation et de la connaissance des API, un bon programmeur graphique devrait connaître les matrices de rotation, de vue et de projection, les maths vectorielles en général, la programmation de shaders, les primitives procédurales comme Voronoi, SDF ou Perlin, la composition d’images, le rendu forward et deferred, diverses techniques d’échantillonnage, ainsi que les techniques d’ombres et d’éclairage
    Il faut aussi comprendre comment fonctionne le pipeline artistique et comment extraire les données depuis des applications 3D, savoir utiliser aisément profileurs et débogueurs, être capable de lire des articles du SIGGRAPH, maîtriser les techniques de partitionnement spatial et de hiérarchies volumiques, implémenter un ray tracer simple, comprendre des primitives comme les sprites, triangles et polygones à n côtés, et avoir de l’expérience avec les particules et la simulation

    • Je me demande si vous pourriez développer un peu le point « comment fonctionne le pipeline artistique et comment extraire les données depuis des applications 3D »
      Je connais le flux très basique de création d’un modèle — modélisation → skin/rigging → animation → texturing — ainsi que la manière générale dont cela s’écrit dans des fichiers. Mais c’est justement la partie où il est particulièrement difficile d’acquérir une vraie expérience pratique si l’on ne travaille pas avec des artistes
    • Si l’on connaît déjà la plupart des éléments de cette liste, je me demande comment décrocher un poste de développeur graphique
      Je fais de la programmation graphique comme hobby et j’ai appris beaucoup des choses mentionnées ici, mais comme je n’ai pas d’expérience professionnelle, j’obtiens très peu d’entretiens
    • Où peut-on apprendre tout ça ?
  • Je recommande le cours Graphics From Scratch de Pikuma. La première chose à faire est d’écrire une fonction set_pixel avec SDL, puis tout le reste est implémenté directement en code
    On écrit soi-même toutes les opérations matricielles, toutes les transformations de sommets, jusqu’à toute la rastérisation des triangles, en calculant quelle couleur chaque pixel doit avoir
    https://pikuma.com/courses/learn-3d-computer-graphics-progra...

    • Mon site web / livre / cours suit aussi cette approche, et c’est gratuit
      https://www.gabrielgambetta.com/computer-graphics-from-scrat...
    • Je plussoie cette recommandation. J’ai suivi ce cours il y a quelques mois en n’ayant presque aucune connaissance en programmation graphique, seulement quelques années d’expérience comme ingénieur logiciel généraliste, et j’en suis ressorti avec une compréhension assez solide de la façon dont les formes 3D sont dessinées à l’écran
      J’ai ensuite pu apprendre WebGPU en quelques jours, ce qui m’aurait probablement été impossible sans la compréhension acquise grâce au cours
      Si vous avez besoin de motivation, j’ai fait une démo compilée en Wasm du renderer qu’on construit à la fin du cours : https://rmshin.github.io/3d-renderer-wasm
    • C’est un point intéressant. Je réfléchis depuis un moment à la façon dont je concevrais moi-même un cours d’introduction au graphisme
      Faut-il commencer avec du code SDL façon putpixel comme dans les années 90, ou plutôt avec Shadertoy ? Les bases des mathématiques matricielles restent bien sûr toujours importantes. Mais comment enseigner la rastérisation des triangles ? Peut-on passer directement aux coordonnées homogènes et aux quadtrees sans passer par les scanlines ?
      Faut-il vraiment enseigner le shading de Phong, ou peut-on passer directement aux BRDF ? Certains éléments risquent de relever davantage de « vieilles astuces » que de techniques réellement utiles
      Aujourd’hui, les statistiques et l’échantillonnage sont bien plus importants. Je pense que le graphisme devient chaque année plus mathématique. Donc il faut apprendre les maths, et les enseigner
    • Il existe quelques bonnes ressources pour implémenter un rendu 3D à partir de zéro
      Parmi elles, je recommande vraiment très fortement ce dépôt GitHub : https://github.com/ssloy/tinyrenderer/wiki/Lesson-0:-getting...
      Et si vous apprenez plutôt de façon visuelle, cette chaîne est une mine d’or : https://www.youtube.com/watch?v=ih20l3pJoeU
    • « Pas de GPU, pas d’OpenGL, pas de DirectX ! » va exactement à l’encontre de ce qu’on s’attend à trouver quand on veut apprendre la programmation graphique
  • On peut apprendre le graphisme en écrivant des shaders sur Shadertoy. Beaucoup de programmeurs graphiques ont commencé comme ça
    Pour faire un peu d’autopromo, j’ai créé plus de 10 tutoriels sur l’écriture de shaders dans VS Code, les SDF, le ray marching, les fonctions de bruit, le mouvement brownien fractal, etc.
    https://github.com/suboptimaleng/shader-tutorials
    Bien sûr, je me tiens sur les épaules de géants comme Inigo Quilez, The Art of Code, SimonDev et Acerola

  • Il y a vraiment beaucoup de chemins pour devenir programmeur graphique sans commencer par DX/VK/OGL. Il n’est même pas nécessaire d’utiliser C++. Regardez les incroyables graphismes 3D que 3Blue1Brown fait en Python
    Si vous voulez utiliser un moteur de jeu, apprenez DirectX ou Vulkan ; si vous voulez créer des applications dans le navigateur, apprenez WebGL
    Mais ces API sont lourdes, et elles n’enseignent pas forcément grand-chose sur le graphisme à elles seules. Si vous voulez apprendre les concepts du graphisme, le mieux est de créer vous-même à la fois un rastériseur et un ray tracer dans le langage de votre choix
    Il existe aussi beaucoup d’environnements de code et de bibliothèques graphiques bien plus amusants que de s’acharner sur Vulkan ou DirectX. Processing est excellent, et PlotDevice.io en Python, son prédécesseur NodeBox, ainsi que DrawBot, valent aussi le détour. ShaderToy est un autre endroit où l’on peut beaucoup apprendre sur l’écriture de shaders et le rendu, tout en étant facile pour démarrer. JavaScript offre aussi beaucoup d’options et de bibliothèques. Tout cela est bien plus accessible et motivant pour les débutants, tout en donnant à un apprenant curieux la puissance et la flexibilité nécessaires pour aller aussi loin qu’il le souhaite

  • Puisque cet article est arrivé en première page, je partage une ressource réellement utilisée dans le secteur de la programmation graphique. Pour référence, j’en suis l’un des auteurs : https://raytracing.github.io/
    Elle figure aussi dans la section « Useful Websites » de l’article ci-dessus
    Le graphisme est maintenant tellement vaste qu’il n’existe plus une seule façon d’apprendre qui convienne à tout le monde. Si vous voulez apprendre le graphisme, je recommande de trouver un mentor

    • Excellente ressource. Je suis particulièrement d’accord avec l’approche qui consiste à enseigner d’abord les maths via le ray tracing plutôt qu’à travers les API
  • Je suis développeur de jeux, mais pas programmeur graphique de profession. Dans mon travail, j’utilise des API graphiques modernes et des shaders GLSL, mais récemment, quand un enfant de 13 ans a voulu passer de Scratch ou Python à C++, j’ai jugé que la meilleure approche était de ressortir une vieille DLL OpenGL 1.2 présente sur mon ordinateur depuis 1999, et de lui faire commencer avec glut et du code en mode immédiat avec glbegin/glvertex/glend
    C’est bien plus amusant que d’endurer toute la configuration nécessaire aux API modernes. L’enfant s’intéresse davantage à la géométrie algorithmique, comme les diagrammes de Voronoï, donc l’API graphique n’est qu’un moyen au service d’un but, et les shaders tape-à-l’œil ou l’éclairage ne sont pas importants pour le moment. Les performances de C++ et de l’ancien OpenGL sont environ mille fois supérieures à celles de Scratch, donc j’ai l’impression d’avoir trouvé un bon point d’équilibre pour son niveau actuel d’apprentissage
    Même avec l’API simplifiée d’OpenGL 1.2, essayer de comprendre à la fois C++ et OpenGL représente déjà un volume d’apprentissage assez ambitieux, et cette simplicité le rend mentalement gérable. Pour l’instant, ça se passe bien : l’enfant a réalisé une démo correcte de marching squares, et je l’ai aidé à y ajouter un menu IMgui permettant d’ajuster les paramètres à l’exécution. C’était très sympa

  • Je ne comprends pas très bien ce que ce site demande exactement. Vous voulez faire du rigging ? Du texturing ? Du modeling ? Écrire des pilotes ? Créer des interfaces GUI ? Des animations de site web ? Des outils graphiques ? Des shaders ? Un moteur photo 2D ? Un jeu 2D ? Un jeu 3D ? Des scripts procéduraux ? De l’optimisation de code graphique ?
    Sous « infographie », il existe des centaines de domaines. Or ce site se concentre sur un tout petit recoin d’entre eux : la programmation de SDK graphiques

    • Un programmeur graphique est une catégorie de programmeur assez bien définie. Une bonne partie des éléments cités plus haut, comme le rigging, le texturing ou le modeling, ne relèvent pas de la programmation graphique
      D’un programmeur graphique, on attend généralement qu’il puisse couvrir les jeux, la 3D, la 2D, les outils, les shaders et l’optimisation au sens large
    • Cela peut prêter à confusion, mais en général, un « programmeur graphique » désigne quelqu’un qui travaille sur un moteur de rendu graphique, qu’il soit en temps réel ou en rendu hors ligne
  • Je suis moi aussi sur ce parcours. Il y a deux ans, j’ai créé mon premier moteur 3D en suivant divers tutoriels et vidéos YouTube
    C’est très simple, mais j’aime les choses simples. En ce moment, j’utilise ce moteur pour créer un jeu de construction de ville. Apprendre à manipuler les éléments avec des matrices et des produits vectoriels est vraiment amusant
    https://www.youtube.com/watch?v=cvyrfPUpyp0