Synthèse d`images 3/3
Transcription
Synthèse d`images 3/3
Synthèse d’images 3/3 ENSEEIHT – 3AI Traitement & Synthèse d’Images Rappel séance précédente Geometry Shader Vertex Shader Paramétrage des triangles programmable Transformation écran Découpage Discrétisation des triangles Pixel Shader paramétrable Fusion fixe Séance 3 MISE EN ŒUVRE OPENGL Plan • Mise en œuvre du pipeline en OpenGL – Démo per fragment shading • Quelques techniques avancées OpenGL: bases • Fonctions – Préfixées par gl: glEnable (), glMatrixMode () – Suffixées par: le nombre et le type des arguments • glColor3i () – Scalaires/ vectorielles: glLightfv () • Constantes: – Majuscules – Préfixées par GL_ • glShadeModel (GL_SMOOTH) Shaders en OpenGL • Historiques: Register Combiners, assemblers… • OpenGL 2.0: normalisation du langage GLSL • Unification des geometry, vertex et fragment shaders – Même nombres d’instructions – Même fonctions (e.g. accès texture dans VS) GLSL • Démonstration • Code disponible à – http://dehais.perso.enseeiht.fr/tsi_ogl/ Séance 3 QUELQUES TECHNIQUES AVANCÉES Rendu multi passes Vertex Shader Geometry Shader Transformation écran Découpage Texture Pixel Shader Fusion Images Rendu multi passes • Post-processing: effet de halo Rendu multi passes • Post-processing: profondeur de champ Rendu multi passes • Post-processing: profondeur de champ Rendu multi passes • Post-processing: profondeur de champ Deferred rendering • Première passe: stockage des positions, normales,couleurs, profondeur dans des tampons séparés (G-buffers) • Deuxième passe: assemblage et ombrage • Bénéfices: – Limiter le nombre de calculs par pixels – Limiter le nombre d’appel de fonction (batch, draw calls) • Inconvénients – Bande passante mémoire – Anti-aliasing difficile Deferred rendering Deferred rendering Deferred rendering Deferred rendering Ombres Ombres • Pour chaque source lumineuse si – Calcul de la profondeur de la scène vue depuis la source de lumière • Rendu standard: – Pour chaque pixel, calculer sa profondeur vis-à-vis de chaque source lumineuse si – Si profondeur > zbuffer (si), alors le pixel est ombré