TD d`infographie n°1
Transcription
TD d`infographie n°1
TD d'introduction à la 3D n°3 Licence 3ème année Informatique The power of shader Comprendre l'intérêt des shaders (et de la programmation graphique) par la « 2D » A savoir 1 : GLSL Le langage GLSL correspond au C avec quelques type primitifs supplémentaires et des règles plus strictes : • Pas de pointeur • Pas de conversion implicite (ou très peu) Les types primitifs les plus importants sont vec2, vec3, vec4, mat3 et mat4 qui sont, respectivement, des vecteurs à 2, 3 et 4 dimension ainsi que des matrices 3x3 et 4x4. L'accès aux différentes composantes des vecteurs ce fait comme pour un tableau ou comme une structure qui contiendrait des champs x, y, z et w. On peut aussi y accéder via r, g, b, a. Cela peut aussi s'utiliser comme un tableau. Concernant les fonctions, c'est comme en C, avec des passages en « paramètre » dictées par les mots clés in, out et in out. Enfin, dans un shader on peut accéder aux textures via un « accesseur de texture » appelé sampler2D. Toute variable de ce type doit être une variable uniforme et ne s'emploi que via des fonctions prédéfinies texture2D Exercice 1 : Prise en main en 2D Pour se simplifier la vie, nous allons utiliser un moteur de shader en ligne appelé ShaderToy. Allez sur le site https://www.shadertoy.com/ et cliquez sur « New Shader ». Vous arrivez sur une page permettant de réaliser n'importe quel fragment shader dans une application 2D. Ici, pas de scène 3D, simplement un triangle qui s'affiche sur l'ensemble de l'écran. On a simplement à disposition les coordonnées du fragment (dans l'espace image, des pixels) et dans le shader de base proposé, on peut voir comment calculer des coordonnées de « texture » allant de 0 à 1 sur les deux dimensions de l'image. Dans les données d'entrée on a des variables uniformes (voir onglet « shader input ») et également un certain nombre de texture d'entrée (cliquez sur les icones iChannel en dessous du shader). 1. Trouvez une manière d'afficher l'image suivante : 2. Trouvez une manière d'afficher une texture animée (disons la première vidéo) sur l'ensemble de l'image. 3. Faites en sorte que cette vidéo ne s'affiche que sur un cercle centré comme ceci : 4. Faites en sorte que le rayon du cercle varie avec le temps entre 0.5 & 1.0 Exercice 2: Des fractales Le but de cet exercice est de faire des fonctions en shader. L'idée est de dessiner une fractale de Julia, comme celle-ci : Une fractale se dessine en déterminant si, oui ou non, un nombre complexe crée, ou non, une suite divergente pour une suite récurrente (simple) donnée. Plus précisement, pour les fractales de Julia, on cherche à savoir si pour un nombre complexe x, la suite x = x² + c converge ou pas, c étant une constante (complexe). Dans la suite, vous prendrez pour valeur de N (voir ci-dessous) 10 ou 100 et pour valeur de c le nombre complexe (-0.0986,-0.65186) (voir aussi sur Internet pour d'autres constantes de Julia). 1. Créez, dans le shader, les fonctions de multiplication et d'addition de deux nombres complexes (internet est votre ami). Comment pourrait on représenter un nombre complexe dans le shader ? 2. Créez une fonction pour calculer le module (la norme) d'un nombre complexe. 3. Pour chaque point de l'image (fragcoord), considéré comme un nombre complexe, vérifiez (à l'aide d'une boucle) si la suite de Julia crée en N itérations, un nombre complexe dont la norme est plus grande que 2. Si oui, dessinez le fragment en noir. Sinon en blanc. 4. Faites en sorte de calculer, pour chaque fragment, un coefficient entre 0 & 1 permettant de déterminer quand, sur les N itérations, le nombre complexe à diverger. Appliquez ce coefficient pour pondérer la Cela vous donnera une fractale en niveau de gris. 5. Faites en sorte de zoomer en permanence vers le centre de l'écran (scaling) Exercice 3: Un ray tracer en shader Faire un raytracer est, finalement, assez simple en shader. Le problème se décompose en sous partie simple. Vous devrez réaliser ces étapes dans l'ordre : • Créez une structure de rayon. En shader cela se fait avec le code suivant : struct ray { vec3 pos; vec3 dir; }; Une structure se crée comme un « objet » en passant chaque champs, dans l'ordre en paramètre, du type ray r = ray(vec3(0,0,0),vec3(1,0,0)); • • • • • Calculez, pour chaque fragment, le rayon passant par l'oeil de la caméra considérée comme placée à l'origine et regardant vers les z négatifs. L'écran et donc le pixel concerné est situé à une distance de 0.1. On peut considéré que la hauteur de l'écran (virtuel) est aussi de 0.1 et que sa largeur dépend du ratio hauteur, largeur de l'image finale. C'est l'étape la plus complexe. Faites une fonction d'intersection entre ce rayon et l'objet dans la scène. Pour le premier objet, on prendra le plan d'équation y = -1. Demandez à votre enseignant la formule d'intersection entre le rayon et ce plan. Pour chaque point ayant réalisé l'intersection, fixez la couleur de ce point. Voilà vous avez votre première image générée par lancer de rayon. Essayez de rajouter une sphere de centre (0,0,5) et de rayon 1. Enfin, en s'inspirant du modèle d'éclairage du TD précédent, faire en sorte d'éclairer cette scène (2 objets donc un plan & une sphère) avec une lumière ponctuelle située en (-1,4,3)