name: inverse layout: true class: center, middle, inverse --- #Algorithmes du rendu 3D [the matrix has you] --- layout: false ## Quel est le problème à résoudre? ## Définition de l'algorithme --- ## Quel est le problème à résoudre? Afficher des objets définis en 3 dimensions sur une surface en 2 dimensions --- layout: false ## Définition de l'algorithme .right-column[ Sortie: - image (taille, pixels) Entrées : - vecteurs 3D (vertex) - position et orientation caméra - résolution de l'écran ] --- layout: false ## Définition de l'algorithme .right-column[ Structure de pipeline : Architecture représentant une chaine d'opérations dans laquelle le résultat d'une opération est la donnée d'entrée de la suivante ] --- layout: false ## Etapes importantes .right-column[ - Projection : passage d'une représentation vectorielle 3D à 2D - Rasterisation : passage d'une représentation vectorielle 2D à matricielle (tableau de fragments) ] --- layout: false ## Etapes intermédiaires .right-column[ ### Avant la projection - gestion de différents repères géométriques ### Après la rasterisation - test de profondeur - colorisation, illumination ] --- layout: false ## Un pipeline fonctionnel comprend donc .right-column[ - changements de repères - projection - rasterisation - test de profondeur - colorisation et illumination ] --- layout: false ## Les repères .right-column[ Repère orthonormé direct - repère local - repère monde - repère caméra ] --- layout: false ## Les repères .right-column[ Changement de repère opéré par une matrice 4x4: ![matrice](matrice-changement-repere.png) ] --- layout: false ## Les repères .right-column[ Changement de repère opéré par une matrice 4x4: ![matrice](matrice-id.png) ] --- layout: false ## Les repères .right-column[ Changement de repère opéré par une matrice 4x4: ![matrice](matrice-scale.png) ] --- layout: false ## Les repères .right-column[ Changement de repère opéré par une matrice 4x4: ![matrice](matrice-translation.png) ] --- layout: false ## Les repères .right-column[ Changement de repère opéré par une matrice 4x4: ![matrice](matrice-rotation.png) ] --- layout: false ## Les repères .right-column[ Point défini en écriture uniforme: ![vecteur](vecteur-point.png) ] --- layout: false ## Les repères .right-column[ Changement de repère d'un point: ![vecteur](transfo-point.png) ] --- layout: false ## Les repères .right-column[ Changement de repère d'un point: ![vecteur](transfo-point2.png) ] --- layout: false ## Les repères .right-column[ Trois repères principaux : - local - monde - caméra ] --- layout: false ## Les repères .right-column[ Trois repères principaux : - local : modèle 3D - monde : utilisateur - caméra : projection ] --- layout: false ## Les repères .right-column[ ![vecteur](transfo-point3.png) ] --- layout: false ## Les repères .right-column[ ![vecteur](comp-worldview.png) ] --- layout: false ## Les projections .right-column[ Ramener des objets 3D dans un plan 2D ] --- layout: false ## Les projections .right-column[ Ramener des objets 3D dans un plan 2D - orthogonale - perspective ] --- layout: false ## projection perspective .right-column[ Ramener des objets 3D dans un plan 2D ![projection](projection.jpg) ] --- layout: false ## projection perspective .right-column[ Frustum (pyramide de vision) définie par: - plan proche/lointain (near/far) - distance gauche/droite sur le plan proche - distance haut/bas sur le plan proche ] --- layout: false ## projection perspective .right-column[ Matrice de projection perspective ![projection](projection-matrix.png) ] --- layout: false ## Transformation d'un vertex ![projection](worldviewproj-matrix.png) --- layout: false ## Rasterisation .right-column[ Transformation de vecteurs en tableau de fragment Fonctionne sur des triangles Sort des fragments : - couleur - profondeur - normale - coordonnées texture ] --- layout: false ## Rasterisation .right-column[ Algorithme sur triangle quelconque: ![projection](rasterisation-triangle.png) ] --- layout: false ## Rasterisation .right-column[ Test de profondeur : conserver l'information perdue en 2D ![projection](zbuffer.jpg) ] --- layout: false ## OpenGL .right-column[ - Fourni une interface pour configurer certaines opérations (matrices, test de profondeur, colorisation) - Fourni une interface pour personnaliser les opérations complexes : - sur les vertex : vertex shader - sur les fragments: pixel/fragment shader - pour générer des primitives : geometry shaders ] --- layout: false ## Sources http://www.sunshine2k.de/coding/java/TriangleRasterization/TriangleRasterization.html http://www.songho.ca/opengl/gl_projectionmatrix.html http://www.construct-french.fr/ http://wikimedia.org