git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
mkdir build &&
cd build &&
cmake .. &&
cmake --build . -j &&
./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj
L'image rendue est enregistrée dans framebuffer.tga
.
Vous pouvez ouvrir le projet dans Gitpod, un environnement de développement en ligne gratuit pour GitHub :
À l'ouverture, l'éditeur compilera et exécutera le programme et ouvrira l'image résultante dans l'aperçu de l'éditeur. Modifiez simplement le code dans l'éditeur et réexécutez le script (utilisez l'historique du terminal) pour voir les images mises à jour.
Mon code source n'est pas pertinent. Lisez le wiki et implémentez votre propre moteur de rendu. Ce n’est que lorsque vous souffrirez de tous les petits détails que vous comprendrez ce qui se passe.
Dans cette série d'articles, je souhaite montrer comment fonctionne OpenGL en écrivant son clone (très simplifié). Étonnamment, je rencontre souvent des gens qui ne parviennent pas à surmonter l’obstacle initial de l’apprentissage d’OpenGL/DirectX. Ainsi, j'ai préparé une courte série de cours, après quoi mes étudiants font preuve d'assez bons rendus.
Ainsi, la tâche est formulée comme suit : en n'utilisant aucune bibliothèque tierce (notamment graphique), obtenez quelque chose comme cette image :
Attention : il s'agit d'un matériel de formation qui reprendra vaguement la structure de la bibliothèque OpenGL. Ce sera un moteur de rendu logiciel. Je ne veux pas montrer comment écrire des applications pour OpenGL. Je veux montrer comment fonctionne OpenGL. Je suis profondément convaincu qu'il est impossible d'écrire des applications efficaces en utilisant des bibliothèques 3D sans comprendre cela.
Je vais essayer de faire en sorte que le code final fasse environ 500 lignes. Mes étudiants ont besoin de 10 à 20 heures de programmation pour commencer à créer de tels moteurs de rendu. En entrée, on obtient un fichier test avec un fil polygonal + des images avec des textures. En sortie, nous obtiendrons une interface graphique rendue sans modèle, et le programme génère simplement une image.
Puisque l'objectif est de minimiser les dépendances externes, je donne à mes étudiants un seul cours permettant de travailler avec des fichiers TGA. C'est l'un des formats les plus simples prenant en charge les images aux formats RVB/RGBA/noir et blanc. Donc, comme point de départ, nous obtiendrons une manière simple de travailler avec des images. A noter que la seule fonctionnalité disponible au tout début (en plus du chargement et de la sauvegarde des images) est la possibilité de définir la couleur d'un pixel.
Il n'existe aucune fonction permettant de dessiner des segments de ligne et des triangles. Nous devrons faire tout cela à la main. Je fournis mon code source que j'écris en parallèle avec les étudiants. Mais je ne recommanderais pas de l’utiliser, car cela n’a aucun sens. L'intégralité du code est disponible sur GitHub, et vous trouverez ici le code source que je donne à mes étudiants.
# include " tgaimage.h "
const TGAColor white = TGAColor( 255 , 255 , 255 , 255 );
const TGAColor red = TGAColor( 255 , 0 , 0 , 255 );
int main ( int argc, char ** argv) {
TGAImage image ( 100 , 100 , TGAImage::RGB);
image. set ( 52 , 41 , red);
image. write_tga_file ( " output.tga " );`
return 0 ;
}
output.tga devrait ressembler à ceci :