Absolument pas Minecraft

Tags :
  • POK
  • 2023-2024
  • temps 1
  • OpenGL
  • GLSL
  • C++
  • Bruit simplexe
Auteurs :
  • Paul Vietor

Génération et affichage d'un monde composé de voxels.

Dépôt Github

Mon objectif pour ce POK est de créer un programme qui génère un monde composé de voxels, puis affiche ce monde et permet se se déplacer dedans.

Techologies, bibliothèques et ressources

J'ai décidé de l'écrire en C++, en utilisant OpenGL pour l'affichage.
De plus, j'utilise quelques bibliothèques supplémentaires pour gérer la fenêtre (GLFW3), charger des images (stb_images), créer certains objets mathématiques tels que des matrices (glm), et accéder au fonctions OpenGL (glad).
Enfin, pour apprendre OpenGL, j'utilise le site LearnOpenGL, j'utilise également cppreference.

Objectifs pour le premier point POK

Je ne connaissais pas OpenGL avant de débuter ce POK donc pour le premier point, j'aimerais réussir à afficher un premier cube avec une texture et de l'éclairage basique.

Cela peut paraître bien peu, mais les quelques bibliothèques avec lesquelles je travaille sont d'assez bas niveau : par exemple les seules formes géométriques qu'il est possible d'afficher avec OpenGL sont des triangles, à partir de leurs sommets, des lignes et des points. Il faut donc transformer tout ce qu'on veut afficher en un ensemble de telles formes.

Ainsi, l'affichage de ce simple cube requiert :

Ainsi, ça fait un certain nombre de concepts à apprendre, donc même si c'est basique, ça me permettrait d'apprendre les bases d'OpenGL, et je pourrai enchaîner sur quelque chose de plus complexe pour la seconde moitié du POK.

Progrès après le premier sprint

Pour ce premier point POK, j'ai réussi à afficher un cube texturé, qui tourne, mais sans réel éclairage, puisque la structure de données que j'utilisais ne permet pas de le faire de façon pratique, il va donc falloir que j'en change.

cube

Objectifs pour le deuxième point

Progrès après le deuxième sprint

Dans ce deuxième sprint j'ai réussi à réaliser presque tous les objectifs que je m'étais fixé. Je n'ai malheureusement pas eu le temps d'implémenter un support manette, ni d'optimiser le rendu, mais cela n'est de toute façon pas nécessaire puisque j'atteins très largement les 60 images par secondes que peut afficher mon écran :

Pour l'implémentation du bruit simplexe, je me suis principalement basé sur la description de l'algorithme présente sur Wikipédia et sur l'implémentation en GLSL donnée sur The Book of Shaders (implémentation).

J'ai d'abord fait une implémentation en python, dont voici un exemple de résultat, avec 3 octaves :

Bruit simplexe à 3 octaves

J'ai ensuite porté cette implémentation en C++, celle-ci est disponible sur le dépôt Gihub du projet.