TP OpenGL no 4 Nuit et Atmosph`ere R´ecup´erez les sources corrig´ees du TP pr´ec´edant ici. Exo.1 Jour et nuit 1. Faites tourner la Terre sur elle mˆeme en fonction de la donn´ee membre time. Exercice ` a faire dans la fonction : bool Render :: display ( const glm :: mat4 & view ) { // Earth display /* * TO C O M P L E T E * */ } 2. Transmettez les textures earth night.png et earth clouds.png au programme shader earth. Exercice ` a faire dans la fonction : bool Render :: init () { // Earth shader // Get uniform l o c a t i o n s // Set u n i f o r m s /* * TO C O M P L E T E * */ } 3. Dans le shader earth.fs, proposez une m´ethode pour afficher `a la fois la texture de jour earth day.png et de nuit earth night.png en fonction du coefficient diffuse kd : – Lorsque le jour est total seul la texture de jour doit ˆetre visible. – Lorsque la nuit est total seul la texture de nuit doit ˆetre visible. – Un m´elange des 2 textures doit apparaitre au cr´epuscule et `a l’aube. Exo.2 Nuages 1. Affichez une sph`ere suppl´ementaire de rayon ATMOSPHERE RADIUS qui englobe la Terre et tourne avec elle. Cette sph`ere sera l’atmosph`ere de la Terre. Exercice ` a faire dans la fonction : void Render :: display ( const glm :: mat4 & view ) { // A t m o s p h e r e display /* * TO DO * */ } 2. Transmettez la position de la lumi`ere et la texture earth clouds.png au programme shader atmosphere. Exercice `a faire dans la fonction : bool Render :: init () { // A t m o s p h e r e shader // Get uniform l o c a t i o n s // Set u n i f o r m s /* * TO DO * */ } 1 3. Compl´etez les shaders atmosphere.vs et atmosphere.fs pour qu’ils affichent la texture earth clouds.png avec un mod`ele d’illumination de Phong sans couleur ambiante (Voir les shaders earth.vs et earth.fs). Exploitez la composante alpha (l’opacit´e) de la texture earth clouds.png pour rendre l’atmosph`ere transparente aux endroits o` u il n’y a pas de nuages. Enfin utilisez le programme shader atmosphere pour afficher la sph`ere qui repr´esente l’atmosph`ere. Exo.3 Ombre des nuages Dans le shader earth.fs appliquez la texture earth clouds.png sur la surface de la Terre pour simuler l’ombre des nuages. N’utilisez pas les composantes rgb de la texture. Utilisez exclusivement la composante alpha de la texture earth clouds.png pour faire une interpolation entre la couleur initial de la Terre et une couleur sombre (du noir par exemple). Exo.4 Animation des nuages 1. Transmettez la donn´ee membre time aux programmes shaders earth et atmosphere. La donn´ee membre time est incr´ement´ee ` a chaque rafraichissement. 2. Dans les shaders earth.fs et atmosphere.fs, utilisez la variable uniforme time pour d´ecaler les coordonn´ees de textures dans le temps et ainsi faire tourner les nuages avec une vitesse de rotation diff´erente de celle de la Terre. Exo.5 Atmosph` ere 1. Transmettez les constantes ATMOSPHERE RADIUS EARTH RADIUS au programme shader atmosphere. et 2. Dans le shader atmosphere.fs calculer l’´epaisseur de l’atmosph`ere (e) travers´ee par le vecteur vision (~v ) en fonction de la position de la camera (C) de la direction du vecteur de vision (~v ), de la position du centre la Terre(P ), du rayon de la Terre(rt ) et du rayon de l’atmosph`ere(ra ). Pour cela vous pouvez utiliser les formules suivantes pour calculer la distance entre le a vecteur vision et le centre de la Terre : − − → t ∧~ v || d = ||CP ||~ v || Pour calculer la distance de recouvrement entre le vecteur vision et une sph`ere : D = r. sin (arccos ( dr )) Pour calculer l’´epaisseur de l’atmosph`ere travers´ ee par le vecteur vision : Da − Dt , si Dt > 0 e= 2.Da , sinon a Utilisez l’´epaisseur e pour d´eterminer la vat leur de la composante d’opacit´e de l’atmosph`ere tout en conservant l’affichage des nuages et l’illumination de Phong. 3. Enfin faites varier la couleur de l’atmosph`ere en fonction de l’incidence des rayons lumineux. Vous pouvez par exemple utilisez un bleu turquoise (1.0, 0.5, 0.0) pour une lumi`ere directe et de l’orange (0.25, 0.5, 1) pour une lumi`ere rasante. D D e v C 2 d r P r
© Copyright 2025 ExpyDoc