Farès Belhadj - Programmation (de cartes) Graphique(s) - 3D

 

 
Pour information : la validation de l'enseignement est faite sur pré-projet puis projet. Les projets sont à rendre par email (sujet de l'email : Projet PG3D1617S2) au plus tard le jeudi 27 avril 2017 à 23h59 (retard = session de rattrapage). Le projet sera soutenu (présentation de 5mn sur vidéo projecteur) et la soutenance se déroulera en B133 le mardi 02/05 ou le mardi 09/05 selon la date d'envoi du projet et convocation.
La dernière séance de cours aura donc lieu le mardi 28 mars 2017.
Pour le rattrapage, les projets sont à rendre par email (sujet de l'email : Projet PG3D1617S2) au plus tard le jeudi 11 mai 2017 à 23h59 et peuvent être soutenus en même temps qu'API8 (www.api8.fr) le 17 mai 2017.
 
Les liens barrés, tels que celui-ci : exemple de lien, seront disponibles au fur et à mesure de notre avancement dans le cours.
 
UNE NOUVELLE RELEASE gl4dummies-0.1.6.tar.gz EST DISPONIBLE SUR SOURCEFORGE, CERTAINS EXEMPLES SONT/SERONT BASES DESSUS.
 
Supports & liens
Documentations
 
Projet
    Une fois le pré-projet (voir plus bas) réalisé avec succès, deux possibilités sont offertes à l'étudiant :

  • Réaliser une Démo 64Ko selon les critères API8 incluant de la modélisation par génération de données et pourquoi pas participer à l'édition 2017 ;
  • Choisir et réaliser un projet dans la liste disponible ICI.

    Tout projet doit être réalisé sur une base GL4Dummies incluant des shaders en version 330.
 
Pré-projet
 
  • Descriptif : le principe du pré-projet est de réaliser, au plus tard pour le TP du 14 février 2017, votre premier moyen-programme OpenGL 3.3 core profile. La validation du pré-projet rendra possible le choix d'un projet pour la validation de l'EC. Il s'agit de donner la possibilité à l'utilisateur de se balader dans un univers virtuel pseudo-infini dans lequel il doit cueillir des champignons ... mais attention, il y a 3 type de champignons : les cèpes (bons), les bolets satan (mauvais et mortels si jauge à zéro) et les amanites phalloides (ces amanites sont immédiatement mortelles). La démonstration ci-après donne quelques indications sur le résultat attendu. Les textures utilisées sont fournies plus loin.
  • Démo :
  • Textures réutilisables : cepe.png, feuilles.png, phalloide.png, satan.png
 
Exemples utilisés en cours
Rotation de triangle texturé et colorié : SDL2GL3_3D_Exemple01-1.0.tgz
Plusieurs VIEWPORTs, une MODELVIEW, une PERSPECTIVE (trouver les matrices ici) et de l'ombrage : version de base SDL2GL3_3D_Exemple02-1.0.tgz, version utilisant les fonctions haut niveau de GL4Dummies SDL2GL3_3D_Exemple02_gl4du-1.0.tgz. Pour comprendre pourquoi les vecteurs normaux sont multipliés par la transposée de l'inverse de MODELVIEW, voir ce doc de Lighthouse3d.
La sphere en mode normal - ARRAY_BUFFER - et la même en mode indexé - ELEMENT_ARRAY_BUFFER - le tout dans le même exemple SDL2GL3_3D_Exemple03_sphere-1.0.tgz, appuyer sur "i" pour passer d'un mode à l'autre et sur "f" pour activer / désactiver le calcul des normales aux faces dans le geometry shader.
Exemple de Loader de fichiers 3D (.obj, .3ds, certains .fbx, ...) utilisant la bibliothèque Assimp (www.assimp.org), GL3 (VAO/VBO ...) et les shaders/matrices GL4Dummies : sample_3d_06-1.0.tgz, voir la fonction keydown pour les commandes clavier.
Grille de sommets et déplacement temps-réel des sommets dans le vertex shader en fonction d'une sinusoide : sample_3d_07-1.0.tgz.
sample_3d_07-1.1.tgz est une version générant une heightmap fractale (triangle-edge) + amplitude de la sinusoidale en fonction du son (utilisation de la bibliothèque SDL2_mixer).

Fonctions de génération de nombres aléatoires, de bruit paramétrique 1D et 2D, bruit de perlin CPU et bruit de Perlin GPU : rand_n_perlin_noise-1.0.tgz.
perlin_GPU-1.0.tgz.

Exemple de picking de couleur sample_3d_08-1.0.tgz et de picking d'objets mobilessample_3d_08-1.1.tgz.
Calcul d'ombres portées sur exemple de simulation de balles avec utilisation de Shadow Map : sample_3d_08-1.2.tgz.
Balade dans paysage fractal avec sphère de plasma jouant le role de la lumière : sample_3d_09-1.0.tgz.
Reprise du playsage fractal est ajout d'un plan d'eau avec utilisation de bruit de perlin et normal mapping pour l'eau : sample_3d_09-1.1.tgz.

Partant de l'exemple SDL2GL3_3D_Exemple03_sphere-1.0.tgz, réaliser l'ensemble des étapes nécessaires à l'obtention d'une représentation 3D du globe terrestre (voir illustration ci-contre) :

  1. Passer la lumière en mode positionnel et la placer devant à droite juste à la surface de la sphère-terre. Ecrire un program shader qui affiche une sphère-lumière à la position de la lumière. La lumière doit subir la même translation que la sphère-terre mais ne doit pas subir la rotation (elle est jaune et ne possède pas de calcul d'éclairage).
  2. Transposer les calculs d'ombrage (Luminance = dot(TransposeeInverseDeNormaleAuSommet, -Lumiere)) depuis le Vertex Shader vers le Fragment Shader (Gouraud vers Phong);
  3. Ajouter un layout de coordonnées de textures à la sphère (coordonnées sphétiques) ;
    **********************************
    (étape intermédiare commencée en cours - voir extrait youtube ci-contre - utiliser : "flèches" pour augmenter/diminuer les longitudes et latitudes ; shift-"flèches", "u" et "d" pour déplacer la source de lumière ; espace pour pause ; "f" pour activer/désactiver les normales par face ; "p" pour activer/désactiver le Phong ; "t" pour visualiser les coordonnées de texture)
    **********************************
  4. Charger l'ensemble des textures présentes dans l'archive images_4earth.tgz (je suggère l'usage d'IMG_Load de SDL_image) et les envoyer aux shaders et les tester ;
  5. Dans le Fragment Shader, plaquer la texture de jour (land_ocean_ice_2048.png) ;
  6. A l'aide de la fonction shader mix mélanger la texture jour avec la texture nuit en utilisant la luminance comme facteur de mélange;
  7. Ajouter le calcul de la lumière spéculaire au modèle d'éclairage ;
  8. Utiliser une des textures disponibles pour restreindre le calcul du spéculaire aux seuls sommets représentants les mers et les océans ;
  9. Dans le vertex shader, utiliser la texture des hauteurs (heightmap ou bumpmap) pour déplacer les sommets et donner du relief à la terre ;
  10. Soit en générant une normal map (carte perturbant les normales en fonction d'une carte de relief (ex. heightmap/bumpmap)) dans un logiciel le permettant, soit en la générant dans le fragment shader, modifier les normales aux fragments pour donner une meilleure (plus fine) impression de relief même quand le nombre de polygones de la sphère est faible ;
  11. Trouver une solution pour ajouter des nuages, de préférence dont le déplacement est légèrement différencié de celui du reste.

Exemple utilisé comme support pour la séance de cours du 13/02/17 et aide au pré-projet : sample_3d_04-1.0.tgz. Plan texturé avec un damier, filtre mipmapping (appuyez sur "m"), filtre anisotropique (appuyez sur "a"), sky dome (ciel) texturé avec un algorightme fractal de génération de terrain, déplacement avec caméra, boussole et fog (brouillard, appuyez sur "f"). A vous de compléter.
Ajouté pendant le cours du 13/02/17 : plan horizontal fixe et texture qui se décale pour simuler un déplacement (plan infini) + 2 objets (sphère) posées dans la scène pour vous aider à démarrer le pré-projet sample_3d_04-1.1.tgz.
Aide au pré-projet, déplacements sur plan infini + 2 cèpes : SDL2GL3_3D_Exemple06_deplacements-1.0.tgz. A vous de compléter.
Génération d'une surface fractale à l'aide de l'algorithme de déplacement des milieux Triangle-Edge et maillage indexé OpenGL : SDL2GL3_3D_Exemple07_landscape-1.0.tgz. A vous de compléter le calcul de normales / coordonnées de textures et leur application.
Exercices
Exercice 1 (pour le 30 janvier 2017 - TP au Bocal)
FACILE : Paramétrer votre machine de développement ou votre compte (installer GL4Dummies depuis le git) pour compiler et exécuter le premier exemple de cours. Puis modifier le vertex shader en ajoutant l'usage d'une matrice de projection de manière à avoir une vue en perspective du triangle.
  MOYEN : Télécharger et installer SDL2_image, puis utiliser la fonction IMG_LOAD pour charger et applique une image png ou jpg au triangle de l'exemple SDL2GL3_3D_Exemple01-1.0. Enfin, modifier le VAO pour écrire et utiliser la donnée en mode interleaved array.
*** correction faite en cours *** SDL2GL3_3D_Exemple01-1.1.tgz
Exercice 2 (pour le 30 janvier 2016 - TP au Bocal)
MOYEN : en partant de l'exemple SDL2GL3_3D_Exemple01-1.0.tgz, modéliser une sphère et modifier le Vertex Shader pour calculer correctement les normales aux points. Puis ajouter un Geometry Shader (voir wiki) et permettre le calcul dynamique des normales aux faces.
 
Exercice 3 (pour le 07 février 2017 - Cours/TP au Bocal)
Voir (PLUS HAUT).
 
Exercice 4 (pour le 07 mars 2017 - TP au Bocal)
A partir du code SDL2GL3_3D_Exemple07_landscape-1.0.tgz ajouter (voir vidéo ci-contre) :
  1. Un scale du terrain de manière à pourvoir avoir l'impression de se balader dessus (par exemple scale de 100, 10, 100) ;
  2. Le calcul de l'altitude à partir des x et z de la caméra et son usage pour toujours être au dessus du terrain et suivre son relief ;
  3. Le coloriage du terrain à l'aide d'une texture 1D que vous aurez créé ;
  4. La création d'une sphère à l'emplacement de la lumière et son mappage avec la heightMap ;
  5. Utilisation d'une texture 1D pour colorier la sphère en utilisant la valeur de luminance de la heightMap puis cycle sur les couleurs de manière à obtenir un effet plasma (pour les deux derniers points il est recommandé de créer un nouveau program shader) ;
  6. Déplacement de la lumière (et donc de la sphère) ;
  7. Passer d'une indexation Triangle à une indexation Triangle-strip.
 

 

 

Farès Belhadj

 

<-