Introduction

Il y a de nombreuses choses à rajouter dans la scène pour la rendre plus crédible. J'ai décidé de commencer par quelques nuages. Première étape : une recherche internet pour savoir ce qui se fait.

On tombe globalement sur 2 approches différentes qui ont chacune leurs avantages et leurs incovénients. Le tout étant de savoir ce que l'on veut.

L'approche procédurale

Cette méthode consiste à générer une texture de nuage par combinaison de bruits cohérents. Comme la génération est procédurale, il est possible de facilement "piloter" l'effet à savoir augmenter/diminuer la densité de nuages etc... Une fois la texture générée, celle-ci est appliquée sur le dôme représentant le ciel.

Au niveau des performances:

  • Les calculs de composition de bruits se font au CPU
  • L'affichage ne coute rien de plus qu'une primitive texturée

Si les résultats sont très interessants visuellement, l'inconvénient est que l'on ne pourra jamais traverser les nuages. Il s'agit d'un effet trompe l'oeil .

Je vous laisse quelques liens sur le sujet Lien 1 Lien 2

L'approche à base de sprites

C'était la méthode que j'avais en tête depuis le début, celle qui me semblait le plus naturel. Je suis tombé sur une série d'articles très interessants, qui prennaient très souvent comme base l'article de Niniane Wang, programmeuse responsable du rendu des nuages sur Flight Simulator.

Son site se trouve ici. L'article complet se trouve ici.

Globalement, l'approche est très simple, on utilise une superposition de sprites ( quads texturés ) pour créer les nuages. Un nuage sera constitués d'une vingtaine de sprites. Pour rendre le résultat plus crédible, il faut ajouter une diversité sur les textures. Pour cela, on utilise une grosse texture qui regroupe plusieurs images de nuages.

Pourquoi une grosse texture et pas une seule ?

Tout simplement pour des raisons d'optimisation de rendu. En effet, il aurait été possible de découper la texture en 8 plus petites textures et obtenir le même résultat. Cependant, il faudrait pour la carte graphique changer de texture lors du rendu de chaque quad. Là on charge la texture en mémoire une seule fois et on joue avec les UVs pour aller chercher la bonne sous-image.

Cette technique est souvent utilisée dans les jeux vidéos et on peut faire des textures animées en modifiant les UVs d'une trame à l'autre ( flamme, explosion, éclaboussure etc... ).

Texture nuages

Billboard

Afin de maximiser l'occupation écran d'une nuage, on va transformer chaque sprite en billboard. Un billboard est un quad qui va s'orienter en fonction de sa position par rapport à la position de la caméra. Plus précisément, le sprite sera toujours orthogonal à la droite passant par le centre de la caméra et par le centre du sprite.

Tri

Comme nous travaillons avec des sprites transparents qui ni ne testent ni n'écrivent le Z-buffer, il faut bien penser à trier les sprites avant de les envoyer à l'affichage, du plus loin au plus proche. Cette approche est similaire à la manière de procéder d'un peintre qui va commencer par la couche du fond, puis va la recouvrir avec une autre et ainsi de suite.

Eclairage

L'éclairage est tout simple, on calcule la lumière diffuse entre le vecteur centre du sprite vers soleil et le vecteur centre du quad vers l'un des coins du sprite.

Aléatoire

Pour avoir quelques choses de diversifié, on rajoute de l'aléatoire sur chaque sous nuage sur:

  • La position au sein du nuage
  • La taille
  • La sous texture à utiliser parmis les 8
  • L'alpha

Résultats

Capture_d_ecran_2012-02-02_a_22.35.57.png Capture_d_ecran_2012-02-02_a_22.38.11.png Capture_d_ecran_2012-02-02_a_22.37.40.png