Rendu temps réel de mer et de nuages Linares Antonin, Boyer Julien 17 décembre 2008 1
Résumé Nous allons traiter dans ce document les différentes méthodes explorées afin de parvenir à un rendu en temps réel d une mer et de nuages. Après une rapide introduction de l existant nous verrons dans une première partie la démarche suivie puis les résultats obtenus. Enfin viendront les améliorations qu il serait possible d apporter au projet suivi d une conclusion. 2
Table des matières 1 Introduction 4 2 L existant 4 3 Les nuages 5 3.1 Modélisation................................... 5 3.2 Rendu...................................... 6 4 Modélisation de la mer 8 5 Performances 11 6 Problèmes rencontrés 11 6.1 Nuages...................................... 12 6.2 Mer....................................... 12 7 Améliorations possibles 12 7.1 Nuages...................................... 12 7.2 Mer....................................... 12 7.3 Skybox...................................... 13 8 Divers 13 9 Conclusion 13 3
1 Introduction Le rendu en temps réel de scènes extérieures est une problématique récurrente dans le monde de la 3D. En effet les phénomènes atmosphériques tels que les nuages, la simulation de fluides, de fumée, le rendu de végétaux ou même l absorption de la lumière dans l atmosphère sont des exemples de traitements qui coûtent très cher en terme de calcul et dont les modélisations mathématiques sont complexes. Néanmoins en tirant parti de la puissance des processeurs graphiques par l intermédiaire de shaders et en jouant sur des effets visuels il est possible de réaliser un rendu réaliste se soumettant aux exigences du temps réel à savoir obtenir au moins 25 images par secondes. Nous allons aborder dans un premiers temps les méthodes utilisées pour le rendu des nuages puis nous nous intéresserons au rendu de la mer. 2 L existant L idée de modéliser en 3D temps réel des scènes extérieurs n est pas nouvelle. De nombreux chercheurs se sont déjà penchés sur cette problématique [6] et ont aboutit à des résultats plus ou moins concluants. Concernant les nuages on trouve essentiellement deux méthodes : le billboarding que nous avons décidés d implémenter et la simulation de fluide basée sur des voxels bien plus difficile et lourde en terme de calculs mais qui donne des résultats largement plus convaincants tant au niveau de l apparence globale que de l expérience au sein des nuages.[2]concernant le rendu de la mer les deux tendances sont soit à la déforation de maillage soit à la simulation de fluides. Comme pour les nuages la simulation de fluide donne d excellents résultats mais il est aussi possible comme nous le verrons d obtenir un rendu agréable par une déformation de maillage. 4
3 Les nuages 3.1 Mode lisation Une rapide recherche sur le rendu de nuages nous a oriente s vers un article de Niniane Wang[7] alors de veloppeuse chez Microsoft sur le projet Flight Simulator 2004. Dans cet article il est fait e tat d une technique de rendu de nuages utilisant des billboards. De plus l atlas rassemblant les 16 textures utilse es e tant fournie nous nous sommes de cide s a utiliser cette me thode de rendu. Fig. 1 Texture des nuages Afin de repre senter un nuage nous commencons lors de sa cre ation par tirer ale atoirement son centre ainsi que ses dimensions (largeur, hauteur,profondeur). Ensuite chaque nuage est remplit par un nombre de partciules dont les centres et les dimensions sont aussi tire s ale atoirement gra ce au bruit de Perlin[5]. Les centres sont au passage ponde re s par une fonction implicite repre sentant une sphe re et prenant en compte plusieurs graines ; les centres de chaque particules sont e videmment contenus dans le volume du nuage. Le nombre de particules contenu dans chaque nuage est en fonction de la re solution de celui-ci c est a dire le pas de parcours de son volume. Chaque particule se voit attribuer une texture en fonction de sa position dans le nuage ; les particules se trouvant vers le bas auront une texture moins dense que celles du haut. Pour re sumer un nuage est constitue de : Un centre Une largeur ; Une hauteur ; Une profondeur ; Des particule place es gra ce au buit de Perlin et une fonction implicite ; 5
3.2 Rendu Le rendu des nuages s effectue par la méthode de billboarding.chaque particule constituant un nuage est en fait un quadrilatère. Ce quadrilatère est affiché de façon à être toujours orienté face à la caméra. Pour cela on récupère la matrice de vue actuelle dont on extrait les vecteurs up et right pour orienter chaque particule lors de son affichage. Dans un premier temps le billboarding était géré par le processeur ce qui ne posait pas de problème pour un petit nombre de particules mais lorsqu il était question d afficher plusieurs milliers de nuages le temps de calcul devenait trop important et la contrainte de temps réel n étaitplus respectée. Pour remédier à ce problème nous avons géré le billboarding grâce à un shader. Utiliser le processeur graphique très rapide en terme de calcul brut a permis de décharger le CPU de tout ces calculs. Gradient Une fois les nuages affichés leurs couleurs étaient en fait celle de la texture à savoir un blanc uniforme. Pour simuler l effet d atténuation de la lumière qui traverse le nuage nous avons implémentés un gradient de couleur fonctionnant entre trois valeurs arbitrairement choisies : blanc pour le haut, foncé pour le bas et gris au milieu. Fig. 2 Pas de gradient 6
Fig. 3 Gradient Re sultats Ci dessous nous allons voir l aspect des nuages selon leurs parame tres : Fig. 4 1 seed, blend 0.2 7
Fig. 5 2 seed, blend 1.0 Fig. 6 4 seed, blend 1.0 4 Mode lisation de la mer La mode lisation de la mer est ge re e par un shader et s est faite en plusieurs e tapes : Gerstner Waves [4] Les Gerstner waves sont une technique consistant a utiliser une somme de fonctions sinusoı dales que l on alte re par la suite afin de rapprocher les sommets proches du haut de la vague afin d obtenir un effet de cre te. Chaque vague a ses propres direction, amplitude, vitesse et parame tre de raideur. 8
Fig. 7 Illustration des Gerstner waves Réflexion Ce traitement est fait en refléant la texture de la cubemap sur la mer. Couleur [3] Enfin une couleur est affectée à chaque pixel en fonction du résultat du produit scalaire entre la normale au point et la direction de visée au delà caméra. Les pixels directement visés seront donc foncés tandis que les autres de plus en plus clairs. Fig. 8 Depth color, Shallow color Réflexion Ce traitement est fait en refléant la texture de la cubemap sur la mer. 9
Fig. 9 Depth color, Shallow color, reflection Bump Mapping [1] [3] En partant d une carte de normales trouve e sur internet on perturbe la normale du maillage apre s re flexion avec la normale stocke e dans la carte de normales. Cela permet de simuler un effet de relief. En multipliant les coordone es des textures de la normal map par le temps e coule on obtient un effet d animation que l on ame liore en moyennant trois normales qui se de placent chacune a trois vitesses diffe rentes. Fig. 10 Depth color, Shallow color, reflection, bump mapping Level of Detail Afin d e viter des traitemets superficiels nous avons de sactive s le calcul des Gerstner waves pour les sommets dont la distance a la came ra est au dela d une valeur seuil arbitraire. 10
5 Performances Afin d améliorer les performances de l affichage nous avons utilisé des VBO 1. Ce sont des zones mémoires réservées directement dans la RAM 2 de la carte graphique où sont stockées nos maillages. En utilisant l énorme bande passante d un processeur graphique et en s acquittant du temps de transfert en méoire vidéo lors de chaque affichage le frame rate s est vu grandement amélioré. De plus nous avons restreint l affichage à ce qui est contenu dans le volume de vision (view frustrum culling) ce qui a permis d encore augmenter notre frame rate. On constate les résultats suivants pour les nuages : Description FPS 3 max FPS moyen FPS min 66000 particules, no culling, no VBO, no shader 17 14.6 10 69000 particules, no culling, VBO, no shader 461 127 26 69000 particules, culling, VBO, shader 1500 150 27 On peut remarquer que l utilisation des VBO permet une très nette amélioration des performances (rapport de *9). Pour sa part le frustrum culling permet en général de conserver un framerate correct sauf si tous les nuages sont dans le champ de vision. Et pour la mer : Nombre de triangles FPS max FPS moyen FPS min 80000, 236 218 203 90000 205 187 175 500000 133 124 120 On observe que l augmentation du nombre de triangles du maillage induit une diminution du frame rate qui reste néanmoins raisonnable ; en effet c est surtout le fragment shader qui est le plus coûteux. Scène totale : Mer 90000 triangles + 70000 particules + heightmap de 32768 faces : FPS max 305, FPS moyen 55, FPS min 28 Avec 262768 triangles dans la scène on atteint un frame rate minimal de 28 ce qui est en accord avec la contrainte de temps réel. Il faut noter qu en divisant le nombre de particules par 6 le résultat est le même visuellement mais le frame rate moyen passe à 60. Les tests ont étés réalisés sur un ordinateur portable équipé d une carte graphique GeForce 8600M GT et un processeur core 2 duo T7500 cadencé à 2.2 GHZ. 6 Problèmes rencontrés Au cours du projet nous avons rencontrés plusieurs problèmes. Certans ont pu être résolus, d autres persistent encore. 1 Vertex Buffer Objects 2 Random Acces Memory 11
6.1 Nuages Les particules sont affichés comme des billboards. Lorsqu on tourne autour d un nuage celles-ci pivotent donc pour rester orientées face à la caméra et finissent par se chevaucher. Pour remédier au problème nous nous sommes résignés à désactiver le test de profondeur lors de l affichage des nuages. Les particules n étant pas triées au sein d un même nuage il en résulte un artefact d affichage. 6.2 Mer Concernant la mer nous avons essayés d implémenter la réfraction et la réflexion de Fresnel. Le problème était pour la réfraction que nous n avons pas de fond approprié et pour la réflexion la totalité de la texture était considérée comme de la luière et donc bien trop prononcée. 7 Améliorations possibles Outre le fait de solutionner les problèmes persistants que nous avons vu précédemment il serait très intéressant d apporter les améliorations qui suivent. 7.1 Nuages Pour l illumination des particules le gradient n est qu une solution basique. Une méthode qui donnerait un rendu beaucoup plus réaliste serait l utilisation de la méthode de scattering qui consiste à calculer pour chaque pixel du nuage l illumination reçue de la source en plus ce que les autres éléments déjà traversés lui renvoient. Ensuite il aurait été intéressant d implémenter des impostors afin de permettre une meilleure immersiondans la scène. L impostor fonctionne sur le même principe que le billboard sauf qu il s agit cette fois de ceinturer la position de la caméra par des quadrilatères texturés par les nuages qui sont trop loins de la caméra. L impostor n est mit,à jour qu à partir d un certain déplacement et de plus cela permet de faire un LOD. 4 De plus afin de garantir une meilleure expérience au sein des nuages il serait judicieux de bloquer l angle maximal d orientation du billboard ce qui éviterait lorsqu on est proche d eux qu un ptit mouvement de caméra n entraîne une grande rotation du sprite. Une autre amélioration possible serait de gérer le déplacement des nuages au grès du vent ainsi que l apparition et la disparition de nuages. Enfin pour éviter une redondance dans les textures utilisées appliquer une rotation aux particules serait un plus. 7.2 Mer La mer a aussi son lot d améliorations possibles comme par exemple appliquer une texture d écume sur le sommet des vagues. 4 Level Of Detail 12
Ensuite faire des réflexions dynamiques c est à dire rendre la scène dans une texture qui sera utilisée pour le calcul de la réflexion. 7.3 Skybox La skybox offre un meilleur visuel mais en prenant de l altitude on observe des défauts de jonction au niveau de l horizon qu il serait bien de corriger. 8 Divers Dans le but d avoir une idée de l échelle nous avons affichés une carte de hauteur carrée dont chaque côté a une longueur de 1024. Ensuite nous avons ajoutés une cubemap utilisée lors de l affichage pour améliorer l effet de réalisme en ajoutant un décor de fond qui entre aussi en compte dans la réflexion sur l eau. Enfin nous avons implémentés un brouillard afin de masquer les éléments trop loin de la caméra ainsi que l aliasage de la mer. En calculant le brouillard dans le fragment shader nous avons pu accéder à la valeur alpha des pixels ce qui permet de fondre les objets lointains dans la couleur de la skybox. 9 Conclusion Le projet a été mené à terme. Nous avons implémenté le rendu d une scène comprenant des nuages et une mer avec succès. Ce projet nous a permis de découvrir des extensions d OpenGL telles que les VBO et les cubemap mais à aussi été un excellent exercice d application à la programmation GPU. In fine la totalité de notre affichage est calculé au sein de la carte graphique. Outre l apprentissage de techniques avancées d opengl ce projet a été un excellent exemple de ce que peut représenter la contrainte de programmation en temps réel ; en effet avoir comme contrainte la limite basse de 25 frames par seconde nécessaires à un affichage fluide est compliqué. Enfin ce sujet nous a permis de faire de la programmation de terrain extérieur ce qui est une compétence plus qu appréciable car souvent utilisé dans le monde professionnel. 13
Références [1] Jérôme Guinot. Bump mapping avec le glsl. pages 1 4, 2006. [2] Mark Harris. Real time cloud rendering. [3] Jacob Munkberg. Advanced shading and rendering - water effects. 2008. [4] Nvidia. GPU Gems I. [5] Ken Perlin. noise machine. [6] vterrain. vterrain.org. [7] Niniane Wang. Realistic and fast cloud rendering in computer games. pages 1 1, 2003. Table des figures 1 Texture des nuages............................... 5 2 Pas de gradient................................. 6 3 Gradient..................................... 7 4 1 seed, blend 0.2................................ 7 5 2 seed, blend 1.0................................ 8 6 4 seed, blend 1.0................................ 8 7 Illustration des Gerstner waves........................ 9 8 Depth color, Shallow color........................... 9 9 Depth color, Shallow color, reflection..................... 10 10 Depth color, Shallow color, reflection, bump mapping............ 10 14