Contexte & Problématique
Passionné par les jeux comme Minecraft et les systèmes de génération procédurale, j'ai voulu comprendre comment créer des mondes cohérents à partir d'algorithmes.
Choix des technologies
Journal de développement
# Chronologie du développement, des premiers tests aux dernières avancées
Apprentissage de OpenGL
Création du projet .NET, configuration de Silk.NET pour les bindings OpenGL. Premiers tests : afficher un quad (rectangle) coloré à l'écran.
Le fameux "Hello World" du rendu 3D avec Silk.NET
Le pipeline OpenGL de base : shaders, VAO, VBO, et pourquoi tout ça est nécessaire.
Premiers cubes
"Implémentation" de la 3D et d'une caméra pouvant se déplacer et explorer la scène.
Premiers cubes
Vue wireframe des cubes
Chaque face a un sens de rendu (front ou back). Besoin de face-culling (ne pas afficher les faces invisibles).
L'utilisation de matrices pour la transformation de la 3D à un rendu 2D.
Ajout de relief avec la fonction sinus
Génération d'un chunk de terrain avec l'utilisation de la fonction sinus pour le relief.
Chunk avec son terrain
Modélisation du terrain sur DESMOS
Bottleneck sur le nombre de commandes envoyées à la carte graphique par le processeur. Besoin d'optimisation aussitôt dans le projet.
Bruit de perlin et occlusion ambiante
Utilisation de bruit de perlin pour la génération et première tentative d'ajout d'effets de lumière sur le terrain (spoiler : ça ne sera pas la seule).
Rendu du terrain avec l'utilisation de bruit de perlin (Projet Lizard est l'ancien nom de Flora).
Utilisation de bruit de perlin, meshing dit "naïf", occlusion ambiante.
Meshing et frustum
Amélioration du système de rendu en implémentant du greedy meshing et du frustum culling (Les images sont sans occlusion ambiante).
Culled meshing (naïf) : 130k triangles (avec frustum).
Greedy meshing : 58k triangles (avec frustum aussi), soit moitié moins.
Conception de l'algorithme de greedy meshing : masques et agrandissement de quads. L'algorithme est simple à expliquer mais difficile à implémenter pour du temps réel.
Algorithme de greedy meshing, frustum culling.
Ajouts d'autres blocs
Création d'un atlas de texture et ajout de plusieurs types de blocs différents (donc texture différentes).
Terrain avec des textures prises depuis un pack Minecraft (ne sont pas sur le GitHub à cause des licences).
Terrain avec les texture de développement (celles sur le GitHub).
Galerie
Grand rendu du terrain pour voir le nouveau générateur (Flora utilise le même, mais les textures sont différentes).
Sphere pour tester l'occlusion ambiante et le meshing.
Rendu des normals (calcul de lumière).
Rendu des UVs (calcul des textures) en culled meshing.
Stack technique
Langage & Runtime
C# 12— Langage principal.NET 8— Runtime cross-platform
Graphismes
Silk.NET— Bindings OpenGLOpenGL— API de renduGLSL— Shaders
Algorithmes
Simplex Noise— Génération de terrainGreedy Meshing— Optimisation
Prochaines étapes
Ce qui aurait pu être fait différemment
Hall of Shame
# Les bugs les plus mémorables
Sympa le terrain
Le monde en bleu
Textures? Jamais entendu parler