Rendu de paysages procéduraux en temps réel

De Ensiwiki
Aller à : navigation, rechercher


Rendu de paysages procéduraux en temps réel
Projet Projet de spécialité 2A
Sous-projet Image
Étudiants Benjamin ALLAIN (MMIS-IRVM), Pascal ARTUS (MMIS-IRVM), Thomas BRAURE (MMIS-IRVM)
Promo 2011
Tuteur Eric BRUNETON Eric.Bruneton@inria.fr

Introduction

L'objectif du projet est de mettre en oeuvre différentes techniques de génération et d'affichage de terrains en temps réel. Cela est rendu possible par le développement des cartes graphiques, desormais programmables, qui disposent d'une puissance de calcul considérable. Les techniques étudiées couvrent :

  • la génération de la géométrie
  • l'application de textures
  • des effets atmosphériques
  • le rendu d'eau animée

Nous avons intégré toutes ces techniques dans une application interactive permettant d'évoluer dans un monde procédural.

Projet spe 2010 AAB 13th.jpg



Note : Toutes les images présentes dans cette page sont issues de notre application.

Géométrie du terrain

Fonction de hauteur

La géométrie du terrain est décrite par une fonction multi-fractale, qui en apparence est très complexe mais dont la formulation reste simple.

Plus précisément nous utilisons un bruit fractal qui consiste en une somme de bruits à différentes amplitudes et fréquences :

\textrm{hauteur}({\vec{x}}) = \sum_{k=k_0}^{k_1}{\frac{1}{r^{kH}}S{(r^k\vec{x})}}

S est une fonction de bruit, et \vec{x} la position du point.

Les basses fréquences de la fonction définissent l'apparence globale du terrain, tandis que les hautes fréquences ajoutent les détails.

La fréquence maximale à évaluer est calculée afin d'éviter l'aliasing de la géométrie.

Domain Warping

L'utilisation d'un bruit fractal permet de créer des terrains assez convaincants à petite échelle. Cependant, à plus grande échelle le résultat apparait relativement homogène voir répétitif. Une apparence plus naturelle peut être obtenue en ajoutant une reparamétrisation du domaine : chaque coordonnée \left( \begin{array}{c} x_1 \\ y_1 \end{array} \right) est transformée par rotation et/ou translation en \left( \begin{array}{c} x_2 \\ y_2 \end{array} \right) :


\left( \begin{array}{c}
x_2 \\
y_2
\end{array} \right)

=

\left( \begin{array}{ccc}
cos{(\psi)} & -sin{(\psi)} & t_1 \\
sin{(\psi)} & cos{(\psi)} & t_2
\end{array} \right)

.

\left( \begin{array}{c}
x_1 \\
y_1 \\
1
\end{array} \right)

Pour encore améliorer le réalisme, on peut appliquer une transformation différente pour chaque terme de la somme définie plus haut, ce qui génère des "structures géologiques" dépendantes de l'altitude.

Niveau de détails

Pour rendre en temps réel la géométrie ainsi générée, nous utilisons la technique de la grille projetée : Une grille régulière dans l'espace de l'écran est projetée sur le plan z = 0, puis déplacée par la fonction de hauteur.

Grille projetée Déplacement des points projetés
Projection d'une grille régulière Déplacement des points projetés


Terrain rendu avec une grille 512x512 Maillage généré avec une grille 64x64
Terrain rendu avec une grille 512x512 Maillage généré avec une grille 64x64

Cette méthode permet de rendre des terrains infinis avec un maillage de bonne qualité tout en gardant un coût de calcul constant. En revanche elle introduit certains artefacts notamment un "mouvement fantôme" du au fait que l'on échantillonne la fonction de hauteur à des points différents lorsque la caméra se déplace.

Textures

L'utilisation de textures 100% procédurales étant beaucoup trop coûteux en temps de calcul, nous utilisons ici la méthode dite de proto-texturing qui est bien adaptée au texturing de terrains.

L'idée est d'utiliser un ensemble de textures 2D (herbe, roche, sable, neige ...) ainsi qu'une fonction de la hauteur et de la pente pour mélanger ces textures entre elles. La fonction définit quel "poids" est attribué à chaque texture à une altitude et une pente donnée, ce poids est ensuite utilisé comme coefficient de mélange.

Comme nous utilisons des textures 2D stockées dans des images, la texture finale est répétitive. Pour limiter cette répétition, on réduit progressivement la variance des images au fur et à mesure que l'on s'en éloigne.

Textures sans réduction de variance Textures avec réduction de variance
Textures sans réduction de variance Textures avec réduction de variance

Effets atmosphériques

Les effets atmosphériques (ou atmospheric scattering) permettent d'apporter plus de réalisme à la scène. Ils modélisent l'effet de l'atmosphère sur la lumière. Nous utilisons ici deux modèles physiques simplifiés : Rayleigh (effet des molécules de gaz) et Mie (effet de la pollution).

Terrain sans scattering Terrain avec scattering
Terrain sans scattering Terrain avec scattering

Ces effets donnent une couleur réaliste au ciel et ajoutent une atténuation du terrain avec la distance. De plus, l'ajout d'un filtrage HDR permet de renforcer la luminosité du soleil.

Rendu de l'eau

Répartition de l'eau

La génération d'un terrain fractal ne permet pas de savoir facilement où peuvent être situés les lacs et les rivières. Nous avons donc choisi d'afficher une mer, en fixant un niveau d'eau uniforme.

Forme des vagues

La hauteur d'eau est définie par :

  • un motif : un bruit interpolé, étiré dans une direction
  • une animation : le bruit dépend du temps
  • une propagation : translation uniforme

Modèle d'éclairage

Réflexion

La surface de l'eau se comporte comme un miroir déformé par les vagues. Elle reflète la couleur du ciel, qui est donnée par la direction du rayon incident.

Schéma réflexion eau
Réflexion sur l'eau

Comme l'eau est vue de haut, on peut se permettre d'utiliser une technique d'illusion, le bump mapping : la surface de l'eau est géométriquement dessinée avec un plan, mais l'éclairage de chaque point de ce plan est calculé avec la véritable normale.

Reflet du soleil dans l'eau
Reflet du soleil dans l'eau

Note : notre implémentation ne reflète pas le terrain.

Transparence

Une eau peu profonde est transparente, car la lumière provenant du sol sous-marin est peu absorbée. Pour simuler ce phénomène, on module la transparence (composante alpha) de la surface de l'eau en fonction de l'épaisseur d'eau traversée par la lumière (loi exponentielle).

Transparence de l'eau
Transparence de l'eau

Scintillement et aliasing

A l'horizon, l'aliasing (sous-échantillonnage abusif) des normales provoque un scintillement, qui reproduit relativement bien la réalité.
L'utilisation d'un filtre anti-aliasing produirait à l'horizon une mer plate comme un miroir (irréaliste).

Difficultés rencontrées

Les principales difficultés rencontrées sont inhérentes aux mondes procéduraux (aliasing, choix des paramètres) ou aux techniques déployées (mouvement fantôme).
Les autres problèmes majeurs ont été le manque de précision actuellement disponible sur les cartes graphiques (absence de double) et la présence de bugs dans les drivers eux-mêmes !

Le respect du critère temps réel nous a empêché d'ajouter certaines techniques d'ombres.

Améliorations possibles

Ce projet est vaste et de nombreuses extensions peuvent être ajoutées au programme, comme par exemple :

  • l'amélioration des effets atmosphériques pour mieux prendre en compte les couchers de soleil
  • l'ajout de végétations sur les zones herbeuses de faible pente
  • le remplacement de la grille projetée par une autre technique comme les clipmaps

Références bibliographiques

C. Dachsbacher, Interactive Terrain Rendering Towards Realism with Procedural Models and Graphics Hardware, 2006<br\> D. Erbert, F. Musgrave, D. Peachey, K. Perlin, S. Worley, Texturing & Modeling, A Procedural Approach, Third Edition, 2003<br\> N. Hoffman, A. J. Preetham, Rendering Outdoor Light Scattering in Real Time, 2005<br\> C. Johanson, Real-time water rendering Introducing the projected grid concept, 2004<br\> F. Kenton Musgrave, Methods for Realistic Landscape Imaging, 1993<br\> H. Malan, OpenGL Shading Language, Second Edition (Orange Book)<br\> A. J. Preetham, Modeling Skylight and Aerial Perspective, 1999<br\> J. Schneider, T. Boldte, R. Westermann, Real-Time Editing, Synthesis, and Rendering of Infinite Landscapes on GPUs, 2007<br\>


:-)