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)

Documents pareils