- Implémentation d’un moteur de rendu logiciel à partir de zéro, sans bibliothèque graphique externe, pour comprendre le fonctionnement interne d’OpenGL, Vulkan, Metal et DirectX
- Transformation d’un modèle 3D en image, à partir d’un maillage de triangles et de textures ; l’implémentation d’une GUI ou d’une application GPU n’est pas abordée
- Le code final compte environ 500 lignes, et les étudiants mettent généralement 10 à 20 heures avant de commencer à obtenir un moteur de rendu fonctionnel
- Seules une classe de traitement TGA prenant en charge RGB, RGBA et les niveaux de gris, ainsi qu’une fonction de définition d’un pixel unique, sont fournies ; le tracé de segments et de triangles doit être implémenté directement
- Pour comprendre les concepts de rendu et saisir le fonctionnement interne des bibliothèques 3D, il faut écrire le code soi-même plutôt que copier le code final
Construire soi-même un pipeline de rendu
- Apprentissage du fonctionnement du pipeline de rendu en suivant librement la structure des bibliothèques graphiques 3D modernes
- Plutôt que d’apprendre à écrire une application GPU, on reproduit le fonctionnement interne avec un moteur de rendu logiciel
- L’entrée est un modèle 3D composé d’un maillage de triangles et de textures, et la sortie est une image rendue
- Le programme génère un fichier image sans interface graphique
- Utilisation du format d’image simple TGA afin de réduire les dépendances externes
- Les seules fonctionnalités fournies au départ sont le chargement et l’enregistrement d’images, ainsi que la définition de la couleur d’un seul pixel
- Aucune fonction intégrée ne permet de tracer des segments ou des triangles : tout doit être écrit à la main
- L’exemple de départ crée un framebuffer RGB
64x64, définit en blanc les pixels de trois coordonnées, puis l’enregistre sous framebuffer.tga
- Les valeurs de couleur sont indiquées dans l’ordre BGRA
Build et exécution du code
git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
cmake -Bbuild &&
cmake --build build -j &&
build/tinyrenderer obj/diablo3_pose/diablo3_pose.obj obj/floor.obj
- Le résultat de l’exécution est enregistré dans
framebuffer.tga
- Même si le code final compte environ 500 lignes, le processus d’implémentation soi-même est essentiel à la compréhension des concepts ; il n’est donc pas recommandé d’utiliser tel quel le code fourni
1 commentaires
Avis sur Hacker News
https://github.com/kshitijl/tinyrenderer-rs
Le dépôt contient beaucoup de captures d’écran du processus de développement et de bugs visuels amusants. J’ai beaucoup appris, non seulement sur les principes du rendu, mais aussi sur le fait que les CPU modernes sont extrêmement rapides et qu’un moteur de rendu CPU monothread peut faire tourner un jeu 3D interactif avec des effets spéciaux spectaculaires
C’était avant les LLM, donc cela m’a pris au moins deux mois, passés en grande partie à comprendre les maths de l’infographie et à traquer des erreurs de segmentation en C
Les notes de cours sur ce GitHub étaient meilleures pour réviser les concepts. Je n’aime pas le style du code du dépôt, et le rasterizer à l’ancienne est aussi trop simple et inefficace, mais je trouve tout de même le tout plus agréable à lire que le livre de Foley
Au fil des éditions, le langage utilisé est passé de Pascal à C, puis à C et C++, et la dernière édition contient aussi un peu de C#. Plusieurs concepts récents manquent, mais je pense qu’il reste encore beaucoup de contenu précieux
Le clipping au frustum peut être géré par une sélection de points sur des tuiles locales, et la synthèse de primitives est plus simple si l’on traite le rectangle de clipping transformé inversement dans le système de coordonnées barycentriques. On peut contrôler les erreurs d’arrondi avec de la double précision ou du point fixe, et la principale difficulté consiste à régénérer les valeurs Z et 1/Z des nouveaux sommets. Avec un rasterizer à synthèse différée des attributs, le reste traverse naturellement le pipeline ; on peut voir des exemples dans l’implémentation open source d’OpenSWR.org
Le plus grand obstacle psychologique est le manque de familiarité avec l’espace projectif et les coordonnées homogènes. Les six plans de l’espace de clipping sont simples :
x = ±w,y = ±w,z = ±w. Il suffit de parcourir chaque arête du polygone, de déterminer si ses deux extrémités sont à l’intérieur ou à l’extérieur, puis d’interpoler linéairement la position du point d’intersection avec la frontière et les attributs du sommet. En appliquant ce processus successivement à tous les plans, le triangle devient un polygone convexe de 9 sommets au maximum, facile à retrianguler. En précalculant les outcodes, on peut éviter le clipping des triangles entièrement à l’intérieur ou à l’extérieurArticle : https://dl.acm.org/doi/10.1145/360767.360802
En conservant une forme de pipeline fixe, on peut traiter un nombre étonnant de triangles avec des fonctions de dessin assez simples