M2-Images - Rendu temps réel
Transcription
M2-Images - Rendu temps réel
Introduction Cartes graphiques et OpenGL Développement Opérations M2-Images Rendu temps réel - OpenGL 2 et 3 J.C. Iehl December 6, 2010 J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Introduction OpenGL et la 3D : I A quoi ça sert ? I Qu’est ce que c’est ? I Comment ça marche ? J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations OpenGL OpenGL I api 3d ? I dessiner des objets sur l’écran : I définir un point d’observation (une caméra), I définir la forme des objets, I définir les matières / l’aspect des objets. l’api 3d est l’ensemble de fonctions permettant de réaliser toutes les opérations nécessaire à l’affichage des objets. et indirectement, une api 3d permet de ”programmer” une carte graphique. J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Introduction I cartes graphiques 3D I opérations I api 3d (DirectX / OpenGL) I pipeline graphique et shaders I utilisation efficace I effets / rendu multi-passes J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Cartes graphiques et OpenGL I A quoi ça sert ? I Qu’est ce que c’est ? I Comment ça marche ? J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations A quoi ça sert ? à dessiner des polygones 3d sur une image 2d : 1. décrire les objets à afficher sous forme d’un ensemble de triangles (primitives), 2. décrire les positions des sommets des triangles, 3. décrire la matière des triangles (couleur, aspect mat ou réfléchissant, texture, etc.), 4. (décrire la lumière qui éclaire les objets), 5. décrire le point de vue (passage 3d vers l’écran 2d). J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Qu’est ce que c’est ? une librairie / api 3d : permet à l’application d’utiliser les fonctionalités de la carte graphiqe 3D, un driver : permet à la librairie de transmettre les données au matériel et de réaliser l’affichage demandé par l’application, du matériel spécialisé : réalise l’affichage le plus vite possible (G80 600M triangles / seconde). J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Comment ça marche ? dessine les primitives une par une, dans l’ordre : plusieurs paramètres disponibles selon le type de primitive (point, ligne, triangle). le contexte permet de stocker l’ensemble des paramètres d’affichage. J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Comment ça marche ? la librairie / api 3d : I vérifie que l’application utilise correctement l’api, I prépare les données et les paramètres pour simplifier leur utilisation par le matériel. le driver : I construit le contexte, I transmet le contexte, les données et les commandes au matériel. J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Comment ça marche ? le matériel : I récupère les données, I récupère les commandes, I récupère le contexte. utilise les paramètres du contexte et les données mises en forme par la librairie et / ou le driver pour réaliser les opérations demandées par l’application. modèle client-serveur : I le client : l’application, la librairie et le driver, I le serveur : le matériel (et le driver dans certains cas). J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Mais à quoi ça sert (réellement) ? résumé : I afficher des triangles, I rendu interactif ! I calculs génériques (autres que 3d). ce qu’une api 3d ne sait pas faire : I OpenGL est une librairie graphique, I on ne l’utilise jamais seul ! I (idem pour DirectX Graphics) J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations OpenGL : Développement portabilité : I OpenGL est disponible plusieurs plateformes, I utiliser des librairies ”annexes” disponibles sur les mêmes plateformes, I libSDL (images, textes, plugins, threads, réseaux, timers, audio, joystick, évènements, etc.), I SFML, I OpenAL (audio 3D), I ... J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations OpenGL : Développement extensions : I introduction de nouvelles fontionnalités, I optimisation de fonctionnalités existantes, I permet de tester avant d’intégrer dans la version suivante. utiliser une librairie pour utiliser les extensions : GLEW J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations OpenGL 2,3,4 et OpenGL ES 1,2 fonctionnalités différentes : I openGL 2 : carte graphique SM3 (geforce 5, radeon 9800) I openGL 3 : carte graphique SM4 (geforce 8, radeon hd 2000) I openGL 4 : carte graphique SM5 (geforce 400, radeon 5000) openGL 2 + extensions : fonctionnalités SM4 et SM5 ... mais openGL 3 et 4 : meilleure intégration dans l’api des nouvelles fonctionnalités. openGL ES : sous ensemble des fonctionnalités pour les systèmes embarqués. J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations OpenGL Core Profile évolution de l’api : I openGL 2 et cartes SM4 : fonctions ”cablées”, non programmables, mais configurables, I openGL 3.0 et 4.0 : transition vers un modèle entièrement basé sur les shaders, plus de fonctions ”cablées”. l’api reflète ce changement matériel : la description des lumières et des matières n’existe plus, il faut écrire un shader pour obtenir le même résultat, ou autre chose (?). mais on peut avoir les deux ! cf. compatibility profile. J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Opérations OpenGL et DirextX Graphics exposent les mêmes fonctionnalités : I initialisation, I description de la caméra, I (description des sources de lumières), I description des objets (forme) + attributs (matière), I (compilation et paramétrage des shaders), I affichage des objets + paramètres, I présentation du résultat, I . . . recommencer. J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Initialisation créer un contexte de rendu : I permettre à plusieurs applications / threads d’utiliser la carte graphique, I interactions avec le système de fenêtrage. définir comment afficher : I dans une fenêtre / en plein écran, I avec / sans synchronisation, I plusieurs buffers : draw, display, color, z-buffer, stencil, . . . I format : RGB, RGBA, 8bits, float 32bits, float16 bits, . . . J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation SDL : exemple SDL_Init ( SDL_INIT_VIDEO ) ; info = SDL_GetVideoInfo () ; S D L _ GL _ S e t A t t r ib u t e ( SDL_GL_DEPTH_SIZE , 16) ; S D L _ GL _ S e t A t t r ib u t e ( SDL_GL_DOUBLEBUFFER , 1) ; screen = SDL_SetVideoMode ( width , height , info - > vfmt - > BitsPerPixel , ... SDL_OPENGL ) ; J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Caméra I position, I orientation, I projection 2D / orthographique, 3D / perspective, centrée, . . . J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation SDL : exemple // s e l e c t i o n n e la matrice de v i s u a l i s a t i o n glMatrixMode ( GL_PROJECTION ) ; // r e i n i t i a l i s e les t r a n s f o r m a t i o n s glLoadIdentity () ; // definit une p r o j e c t i o n p e r s p e c t i v e gluPerspective (50. , 1. , 1. , 1000.) ; J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Lumière énergie : I comportement ambiant, I comportement diffus, spéculaire, réfléchissant (glossy / phong). type de source : I ponctuelle, directionnelle, I spot, . . . J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Objets (forme) + Matières forme : I placée et orienté devant la caméra, I description par des primitives simples, matière, interaction avec la lumière : I ambiante, I diffuse, spéculaire, réfléchissante (glossy / phong), I détails : textures, (shaders). mêmes ”types” d’énergie que pour les sources de lumières. J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Objets et Primitives d’affichage une carte est spécialisée pour afficher des points, droites, triangles (quadrangles, polygones convexes). afficher un objet == décomposer la forme de l’objet en primitives : I un objet est un ensemble de faces (triangles, quadrangles), I une face est un ensemble de sommets (3 ou 4), I un sommet est un ensemble d’attributs. ou se trouve l’objet ? J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Objets décrire la forme d’un objet : I ensemble de sommets des primitives, I ensemble d’indices + ensemble de sommets, I description sous forme de tableaux (sommets, sommets + indices), I stockage par l’application (conséquences ?) I stockage sur la carte graphique (conséquences ?) J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Primitives indexées un cube : 8 sommets, 6 faces. description par sommet : I 24 positions (6 faces de 4 sommets) I 24*float[4] (position == VEC4) description indexée : I 8 positions + 24 indices I 8*float[4] + 24*uint8 Quelle est la meilleure solution (résultat identique) ? J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation SDL : exemple J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation SDL : exemple GLuint GLuint GLuint GLuint GLuint GLuint frontIndices = {4 , 5 , 6 , 7}; rightIndices = {1 , 2 , 6 , 5}; bottomIndices = {0 , 1 , 5 , 4}; backIndices = {0 , 3 , 2 , 1}; leftIndices = {0 , 4 , 7 , 3}; topIndices = {2 , 3 , 7 , 6}; // de ssiner face par face glDrawElements ( GL_QUADS , 4 , glDrawElements ( GL_QUADS , 4 , glDrawElements ( GL_QUADS , 4 , glDrawElements ( GL_QUADS , 4 , glDrawElements ( GL_QUADS , 4 , glDrawElements ( GL_QUADS , 4 , GL_UNSIGNED_INT , GL_UNSIGNED_INT , GL_UNSIGNED_INT , GL_UNSIGNED_INT , GL_UNSIGNED_INT , GL_UNSIGNED_INT , frontIndices ) ; rightIndices ) ; bottomIndices ) ; backIndices ) ; leftIndices ) ; topIndices ) ; // de ssiner les 6 faces d i r e c t e m e n t GLuint allIndices = { 4, 5, 6, 7, 1, 2, 6, 5, 0, 1, 5, 4, 0, 3, 2, 1, 0, 4, 7, 3, 2, 3, 7, 6 }; glDrawElements ( GL_QUADS , 24 , GL_UNSIGNED_INT , allIndices ) ; J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Vertex sommets attribués (Vertex) : I position 3D, I matière : couleurs ambiente, diffuse, etc. I normales, I textures + coordonnées, I paramètres supplémentaires (shaders). J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Affichage des objets pour chaque objet : I placer et orienter l’objet devant la caméra, I activer le type de primitive (triangles), I activer le format des sommets : position, + couleur, + normale, + textures, I activer les tableaux de sommets et d’indices, I activer les textures utilisées, I (activer et parametrer les shaders) I draw(). J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation SDL : exemple // place et oriente l ’ objet glRotatef ( rotation_x , 1. f , 0. f , 0. f ) ; glRotatef ( rotation_y , 0. f , 1. f , 0. f ) ; glRotatef ( rotation_z , 0. f , 0. f , 1. f ) ; glTranslatef ( position_x , position_y , position_z ) ; // active le tableau de p o s i t i o n s g l E n ab l e C l i e n t St a t e ( GL_VERTEX_ARRAY ) ; glVertexPointer (3 , GL_FLOAT , sizeof ( VERTEX ) , mesh - > vertices ) ; // dessine ( mesh - > i n d i c e s _ n / 3) t r i a n g l e s glDrawElements ( GL_TRIANGLES , mesh - > indices_n , GL_UNSIGNED_INT , mesh - > indices ) ; J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation Présentation boucle d’affichage : I effacer les buffers utilisés (couleur, z-buffer, etc.), I placer / orienter la caméra, I afficher les objets, I échanger les buffers de dessin et de présentation. J.C. Iehl M2-Images Introduction Cartes graphiques et OpenGL Développement Opérations Initialisation Caméra Lumière Objets Affichage Présentation SDL : exemple // efface " l ’ ecran " glClear ( G L_ C O L O R _ B U FF E R _ B I T | G L _ D E PT H _ B U F F E R _B I T ) ; // s e l e c t i o n n e la matrice de la scene glMatrixMode ( GL_MODELVIEW ) ; // r e i n i t i a l i s e les t r a n s f o r m a t i o n s glLoadIdentity () ; // oriente la scene par rapport a la camera qui est restee en 0 ,0 ,0 glRotatef ( rotation_x , 1. f , 0. f , 0. f ) ; glRotatef ( rotation_y , 0. f , 1. f , 0. f ) ; glTranslatef ( camera_x , camera_y , camera_z ) ; // de sssine la scene display ( ... ) ; // pr esente le resultat S DL _G L _S w ap Bu f fe r s () ; J.C. Iehl M2-Images