flora-engine/README.md

🌸 Flora Engine

Work In Progress

Moteur de génération procédurale de mondes en voxels

2026 - En cours Projet personnel C#, .NET, OpenGL
$ cat contexte.md

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.

Question centrale : Comment générer un terrain infini qui reste cohérent géographiquement tout en restant performant ?
$ grep -r "technologies"

Choix des technologies

Langage de programmation : Le choix du C# s'est fait naturellement, c'est un langage que je maîtrise depuis longtemps grâce à des moteurs de jeu comme Unity ou MonoGame. Cependant ce genre de projet est généralement fait en C++ ou Rust, et j'apprends actuellement le C++.
API graphique : Le choix de Silk.NET me semble tout aussi logique. Il offre une approche moderne à ce qui se fait avec OpenTK. Il est plus performant au prix d'être plus bas-niveau. Il ressemble aussi à OpenGL sur C++, et permet de mieux comprendre le pipeline graphique. Il est aussi cross-platform et supporte plusieurs API graphique, comme Vulkan. Voulant apprendre quelque chose de bas-niveau et de polyvalent, le choix de Silk.NET m'est cohérent.
$ tail -f ./devlog.md

Journal de développement

# Chronologie du développement, des premiers tests aux dernières avancées

Octobre 2025 Setup

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.

Affichage d'un quad sur l'écran

Le fameux "Hello World" du rendu 3D avec Silk.NET

💡 Ce que j'ai appris :

Le pipeline OpenGL de base : shaders, VAO, VBO, et pourquoi tout ça est nécessaire.

Novembre 2025 3D

Premiers cubes

"Implémentation" de la 3D et d'une caméra pouvant se déplacer et explorer la scène.

Affichage des cubes dans la scène 3D

Premiers cubes

Vue des triangles composant les cubes

Vue wireframe des cubes

❌ Difficulté rencontrée :

Chaque face a un sens de rendu (front ou back). Besoin de face-culling (ne pas afficher les faces invisibles).

💡 Ce que j'ai appris :

L'utilisation de matrices pour la transformation de la 3D à un rendu 2D.

Novembre 2025 Terrain

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 relief

Chunk avec son terrain

Terrain modélisé avec DESMOS

Modélisation du terrain sur DESMOS

❌ Difficulté rencontrée :

Bottleneck sur le nombre de commandes envoyées à la carte graphique par le processeur. Besoin d'optimisation aussitôt dans le projet.

Décembre 2025 Terrain Rendu

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).

Terrain avec bruit de perlin

Rendu du terrain avec l'utilisation de bruit de perlin (Projet Lizard est l'ancien nom de Flora).

💡 Ce que j'ai appris :

Utilisation de bruit de perlin, meshing dit "naïf", occlusion ambiante.

Janvier 2026 Optimisation

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).

Terrain avec mesh naif

Culled meshing (naïf) : 130k triangles (avec frustum).

Terrain avec greedy meshing

Greedy meshing : 58k triangles (avec frustum aussi), soit moitié moins.

❌ Difficulté rencontrée :

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.

💡 Ce que j'ai appris :

Algorithme de greedy meshing, frustum culling.

Février 2026 Blocs

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 de belles textures

Terrain avec des textures prises depuis un pack Minecraft (ne sont pas sur le GitHub à cause des licences).

Terrain avec des textures de dev

Terrain avec les texture de développement (celles sur le GitHub).

$ ls ./screenshots/ | head -6

Galerie

Terrain avec plusieurs milliers de chunks

Grand rendu du terrain pour voir le nouveau générateur (Flora utilise le même, mais les textures sont différentes).

Sphere de test

Sphere pour tester l'occlusion ambiante et le meshing.

Terrain avec uniquement le rendu des normals

Rendu des normals (calcul de lumière).

Terrain avec uniquement le rendu des UVs

Rendu des UVs (calcul des textures) en culled meshing.

$ cat requirements.txt

Stack technique

Langage & Runtime

  • C# 12 — Langage principal
  • .NET 8 — Runtime cross-platform

Graphismes

  • Silk.NET — Bindings OpenGL
  • OpenGL — API de rendu
  • GLSL — Shaders

Algorithmes

  • Simplex Noise — Génération de terrain
  • Greedy Meshing — Optimisation
$ cat TODO.md

Prochaines étapes

Skybox En cours
Éclairage dynamique / coloré En cours
Meilleures textures En cours
Système de biomes
Système de détails de terrains (arbres, petits lacs, etc.)
Sauvegarde et lecture des mondes sur le disque
$ git diff

Ce qui aurait pu être fait différemment

Choix du langage : un langage comme le C++ ou Rust, est généralement plus adapté pour ces projets car ils sont plus rapides.
API graphique : Même si OpenGL fonctionne aujourd'hui partout, d'autres API comme Vulkan sont plus performantes (mais plus difficiles à implémenter).
Meshing : Une solution pouvant être plus rapide que le meshing traditionnel pour des mondes en voxels est le raytracing (différent de la lumière). Pour afficher un voxel, on lance un rayon depuis chaque pixel de l'écran et vérifie s'il touche un bloc. Les cartes graphiques modernes possèdent même des coeurs dédiés à ce processus.
Chunk : Chaque chunk du monde pourrait être des octrees : il s'agit d'une structure 3D pouvant s'auto-diviser en huit autres structures du même type. Cela permet à des chunks distants d'occuper une grande partie du monde.
$ ls ./bugs/ --hall-of-shame

Hall of Shame

# Les bugs les plus mémorables