Présentation de GobLim - Informatique Graphique Moteurs 3D temps réels Guillaume Gilet

La page est créée François Gillet
 
CONTINUER À LIRE
Présentation de GobLim - Informatique Graphique Moteurs 3D temps réels Guillaume Gilet
GobLim

                                G.Gilet

 Informatique Graphique
 Moteurs 3D temps réels

Présentation de GobLim

         Guillaume Gilet
    Guillaume.Gilet@unilim.fr

            2012-2013
Présentation de GobLim - Informatique Graphique Moteurs 3D temps réels Guillaume Gilet
GobLim
Moteurs 3D, en général                                                  G.Gilet

Programme type
  I   Initialisation
  I   Une boucle principale
        I   Affichage de la scène
        I   Détection et traitement des interactions de l’utilisateur
        I   Mécanismes propres au jeu (I.A., physique,règles...)
        I   Mise a jour des positions/etats des entités
Présentation de GobLim - Informatique Graphique Moteurs 3D temps réels Guillaume Gilet
GobLim
Moteurs 3D, en général                                         G.Gilet

Affichage de la scène
  I   Calcul des informations globales à la scène (lumières,
      ombres...)
  I   Pour chague objet 3D :
        I   Préparation du pipeline (matrices, communication
            CPU-GPU...)
        I   Envoi de la géométrie dans le pipeline
        I   Remise en état du pipeline
  I   Calcul post-processing
Présentation de GobLim - Informatique Graphique Moteurs 3D temps réels Guillaume Gilet
GobLim
GobLim                                                        G.Gilet

GobLim
 I   Moteur 3D développé au sein de l’équipe SIR
 I   OpenGL 4.+ et OpenGL 3.2
 I   Windows, Linux et (avec difficulté encore) MacOSX
 I   2010 - Encore en développement

Principe
 I   Proposer une surcouche à la technique
 I   Automatiser chargements, managements des objets OpenGL
 I   Optimisation de mémoire (CPU et GPU)
 I   Permettre de réaliser facilement une idée/test/shader
 I   But : Développer une collection de méthodes de rendu
     indépendants
Présentation de GobLim - Informatique Graphique Moteurs 3D temps réels Guillaume Gilet
GobLim
GobLim                                                  G.Gilet
Dépendances
 GLFW (optionnel : interface)
   I   Interface et gestion des fenêtres
   I   Gestion des interactions

                      http ://www.glfw.org/

 GLEW (optionnel : management OpenGL sous Windows)
   I   Initialisation des extensions/fonctions OpenGL

              http ://glew.sourceforge.net/GLEW

 GLM (Pour se simplifier les math)
   I   Utiliser les types et fcontions GLSL en C/C++

                      http ://glm.g-truc.net/
GobLim
Interface (GLFW)                                                    G.Gilet

Principe
  I   Initialisation du programme (extensions openGL, création de
      fenêtre, contexte)
  I   Boucle principale
        I   Gère l’affichage
        I   Gère les interactions utilisateurs
        I   Tant que la fenêtre est ouverte
GobLim
Interface                                                                             G.Gilet
Initialisation

 GLFW
    I   Initialisation de l’interface
           I     glfwInit()
    I   Creation de la fenêtre
           I     glfwOpenWindow()
           I     Diverses options (titre, présence du curseur, clavier, buffers...)
    I   Définition des fonctions callbacks
           I     Fonctions appelées par GLFW
           I     En fonction des évènements (utilisateurs ou non)
           I     glfwSetCharCallback() dans le cas de caractères
           I     glfwSetKeyCallback() pour les touches spéciales

                              http ://www.glfw.org/
GobLim
Interface                       G.Gilet

            Boucle principale
GobLim
Interface                                                  G.Gilet

            Boucle principale
                 I   Draw() : Affichage de l’écran
                       I   Appel à render() de la classe
                           EngineGL
GobLim
Interface                                                  G.Gilet

            Boucle principale
                 I   Draw() : Affichage de l’écran
                       I   Appel à render() de la classe
                           EngineGL
                 I   glfwSwapBuffers() : Echange les
                     buffers d’affichage
GobLim
Interface                                                   G.Gilet

            Boucle principale
                 I   Draw() : Affichage de l’écran
                       I   Appel à render() de la classe
                           EngineGL
                 I   glfwSwapBuffers() : Echange les
                     buffers d’affichage
                 I   Evènement : Action utilisateur
                       I   Fonctions callback
                       I   void GLFWCALL OnChar(int c,int
                           action)
                       I   avec c le caractère
                       I   action
                           ∈ [GLFW_PRESS,GLFW_RELEASE]

                       I   Mécanisme identique pour la
                           souris, la fenêtre...
GobLim
Interface                                                         G.Gilet

                  Boucle principale
                       I   Draw() : Affichage de l’écran
                             I   Appel à render() de la classe
                                 EngineGL
                       I   glfwSwapBuffers() : Echange les
                           buffers d’affichage
                       I   Evènement : Action utilisateur
                             I   Fonctions callback
                             I   void GLFWCALL OnChar(int c,int
                                 action)
                             I   avec c le caractère
                             I   action
                                 ∈ [GLFW_PRESS,GLFW_RELEASE]

                             I   Mécanisme identique pour la
                                 souris, la fenêtre...
       Pas de commande OpenGL dans l’interface
GobLim
classe Engine                                                             G.Gilet

Classe Engine
  I   Le coeur du moteur 3D
  I   Gère l’affichage, la création de la scène, l’interaction avec le
      GPU...
  I   Une fonction initScene()
        I   Création de la scène (Modèles 3D (ModelGL), entités
            (Node), méthodes de rendu...)
        I   Paramètres OpenGL (couleur de fond, tests de profondeur...)
  I   Une fonction render()
        I   Nettoyage des buffers
        I   Collecte des Node du graphe
        I   Appel de la fonction render() des Node
  I   C’est ici qu’on va travailler
GobLim
Les scène 3D                                  G.Gilet

classe Scene
  I   Gère le graphe de scène
  I   Graphe de Node
  I   Une racine (root)
  I   Un ensemble de manager de ressources
  I   Gère liste des modèles 3D, Nodes...
  I   Contient une Camera

Utilisation de Scene
  I   C’est un singleton
  I   Des constructeurs/destructeurs privés
  I   Utiliser Scene : :getInstance()
GobLim

                                                            G.Gilet

Gestion des Node
 I   Chaque Node identifié par un nom
 I   Creation des Node au vol
 I   Dans Scene : Un manager de Node
 I   Dans Scene : Node* getNode(name)

Gestion des ModelGL
 I   Un manager de ModelGL
 I   Chaque ModelGL identifié par un nom
 I   Creation des ModelGL au vol
 I   Dans Scene : Un manager de ModelGL
 I   Dans Scene : ModelGL* getModel(string name)
GobLim
Les entités 3D                                                   G.Gilet

class Node
  I   Entité 3D : Les objets de la scène
  I   Regroupe une géometrie (Model), une méthode de
      rendu(Material) et un repère 3D(Frame)
  I   Des fonctions setModel(Model*) et setMaterial(Material*)

Classe ModelGL (hérite de Model)
  I   Gestion d’un modèle géométrique (stocké au format .obj)
  I   Création de Vertex Buffer Object (VBO) sur le GPU
  I   Une fonction drawGeometry()
        I   Envoie la géométrie dans le pipeline graphique
GobLim
Méthode de rendu                                                        G.Gilet

Un MaterialGL
  I   Correspond à une méthode de rendu
  I   Charge des GLProgram et un GLPipelineProgram
      (m_ProgramPipeline)
  I   Deux pointeurs vp et fp sur des GLProgram
  I   Une fonction render()
        I   Envoyer les informations nécessaires aux GLProgram
        I   Activer notre objet pipeline (bind() de GLPipelineProgram
        I   Envoyer la géometrie (drawGeometry() de Node
        I   Desactiver le pipeline (release() de GLPipelineProgram
GobLim
Un Pipeline Program                                               G.Gilet

Un GLPipelineProgram
  I   Les étapes programmables du pipeline graphique
  I   Pointe sur les GLProgram utilisés pour une exécution du
      pipeline
  I   Nécessite au moins un Vertex program et un Fragment
      program
  I   Changement dynamique des GLProgram utilisés à chaque
      étape (vertex,fragment...)
  I   Lié en mémoire graphique
  I   Une fonction d’activation ( bind()) et de désactivation (
      release())
GobLim
Les programs (shaders)                                            G.Gilet

Plusieurs GLProgram
  I   Peut être de plusieurs type (Vertex, Fragment...)
  I   Un shader lu dans un fichier
  I   Compilé et lié (inscrit en mémoire graphique) séparement
  I   Possède un espace en mémoire graphique pour ses variables
      globales
  I   Contient un manager de variables
  I   Convention de nom : NomFichier-VS.glsl : Vertex Shader
  I   Convention de nom : NomFichier-FS.glsl : Fragment Shader
GobLim
Communication avec le GPU                                     G.Gilet

En OpenGL < 3.0
  I   Mode direct
  I   A chaque frame :
        I   Activer le program
        I   Envoyer les informations au GPU (glUniform...)
  I   Contraintes et envoi d’information

GobLim (OpenGL 4+)
  I   Accès direct à la mémoire graphique (DSA)
  I   Chargement arbitraire
  I   Pointeurs sur la mémoire graphique
  I   Pour chaque GLProgram : Un manager de variables GPU :
      GLUniformManager* uniforms()
GobLim
Communication avec le GPU                                            G.Gilet

Principe
  I   Demander au manager un pointeur sur la mémoire graphique
  I   Un type GPUVariable : GPUvec3,GPUmat4,GPUfloat...
  I   Des fonctions GPUvec3* getGPUvec3(name), GPUmat4*
      getGPUmat4(name)
  I   avec name le nom de la variable dans le shader correspondant
  I   Une fonction Set() pour charger en mémoire graphique

Exemple : Matrice de transformation/projection (MVP)
  I   Dans le Material PremierTP :
        I   Une GPUVariable* : GPUmat4* ModelViewProj ;
  I   Lors de l’initialisation, récupération du pointeur mémoire
      graphique :
        I   ModelViewProj = vp->uniforms()->get("MVP") ;
  I   Lors de l’affichage, envoi des informations :
        I   ModelViewProj->Set(...) ;
GobLim
La caméra                                                              G.Gilet

Classe Camera
  I   Le point de vue du rendu
  I   Permet d’effectuer la projection
  I   Contient une matrice de projection et un repère (Frame)
  I   Définition d’une projection
        I   Orthographique : setOrthographicProjection()
        I   Perspective : setPerspectiveProjection() et setFrustum()
  I   Une fonction de placement (lookAt())
  I   Des fonctions de déplacement spécifiques
      (translate(),rotate())
  I   Une caméra doit être "‘liée"’ è la scène (link())
Vous pouvez aussi lire