Génération de terrain en utilisant le bruit de Perlin et des fractales

Pourquoi une démo de génération de terrain ? Eh bien pour plusieurs raisons :

  • Nos cours de synthèse d'image ne commenceront pas avant encore quelque temps, et j'ai envie de m'y mettre.
  • Mon portfolio n'a pas une seule appli 3D vu que je n'ai trouvé ma voie que récemment.
  • J'aimerais trouver un stage dans la prog' graphique, à l'étranger, donc d'ici deux mois ... (cf point précédent)
  • La génération procédurale c'est fun voyons :D

Donc il y a un mois de cela, j'ai fait une première version de cette petite application. J'ai utilisé la SFML - après l'avoir recompilée - pour créer la fenêtre et le contexte OpenGL, et implémenté la génération de heightmap (dans une image SFML), en empilant plusieurs couches de Perlin Noise façon fractale (paraît que ça s'appelle un fBm, toutefois je ne m'aventurerai pas à donner une définition d'un concept que je ne maîtrise pas encore).

Heightmap générée

Les images produites avaient une bonne tête, donc je suis passée à l'étape suivante : la 3D ! Un vertex par pixel de la heightmap, la coordonnée y fonction de la valeur de gris dans la heightmap ...

Terrain en fil de fer

Enfin, m'inspirant de ce tutoriel, j'ai généré une texture à partir de trois images (herbe / roche / neige) en fonction de l'altitude.

Terrain texturé

Bon, du filtrage maintenant ?

Tout ceci m'a demandé environ une semaine. Après avoir ajouté une navigation sommaire au clavier et à la souris (type FPS sans gravité), j'ai voulu rendre cela plus ergonomique en ajoutant une interface graphique. Vous pouvez lire ici que la première partie, à savoir le choix de la librairie, n'a pas exactement été une partie de plaisir. Je me suis donc fixée sur gtkmm, très prometteuse ...

... jusqu'à ce qu'il s'avère qu'il n'y avait pas moyen de créer un contexte OpenGL sans effacer les widgets. J'ai essayé avec la SFML (en reprenant ce code), ou sans, et rien à faire : le contexte semblait prendre la main sur toute la fenêtre plutôt que sa sous-partie. Après une journée entière à ramer, la conclusion fut : ouvrir deux fenêtres.

Au cours de trois semaines, j'ai ajouté progressivement des fonctionnalités à l'interface. J'ai commencé par la génération de la heightmap :

Onglet génération

Puis la géométrie du terrain :

Onglet géométrie

Puis la texture ...

Onglet texture

... et finalement l'éclairage.

Onglet éclairage (soleil)

Je ne vais pas détailler ici le rôle de chaque bouton ou slider, il y en aurait pour un petit moment ;). Je rendrai l'application disponible, ainsi qu'un readme. Je mettrai également les sources en ligne même si elles n'ont que peu d'intérêt (code interface verbeux).

Sous le capot, l'application fonctionne donc avec gtkmm pour l'interface, la SFML pour le contexte OpenGL, deux shaders simplistes, et un VBO (après qu'on m'ait dit que les displayList c'était un peu daté :D).

Je prévois d'ajouter un ciel digne de ce nom, peut-être avec des nuages, et un horizon agréable, soit en générant sur un intervalle plus large, soit avec un hack comme celui de cette présentation (à savoir : effet miroir). Oh puis du brouillard aussi. Enfin, pour le moment, j'ai des lettres de motivation à écrire et un portfolio à remplir :D

EDIT : Plus d'informations et des fichiers ici.