L'infographie est un vaste sujet utilisé dans un nombre croissant de domaines. Dans ce laboratoire seront présentés les concepts généraux des graphiques ainsi que l'utilisation du processeur graphique à cette fin. Le domaine de l’infographie requiert diverses connaissances: mathématiques, physique, algorithmes, graphismes numériques 2D et 3D, conception d’expérience utilisateur, etc.
Comme écrire une application OpenGL simple ne peut pas être facilement réalisé dans un court laps de temps, mais aussi pour pouvoir présenter les concepts de base de l’infographie moderne de manière plus simple, nous allons travailler dans les laboratoires sur un cadre offrant de nombreuses fonctionnalités prédéfinies. Le framework utilisé offre toutes les fonctionnalités de base d'un moteur graphique minimal, telles que:
De plus, en plus des fonctionnalités de base, le framework implémente un modèle générique pour l'écriture d'applications OpenGL. Ainsi, les aspects suivants sont offerts:
La fonctionnalité du framework est offerte à travers plusieurs bibliothèques (libraries):
glm::vec2, glm::vec3, glm::vec4
prin intermediul operatorului C++ supraîncărcat: operator«
Toute application doit garantir la fonctionnalité sur une certaine période. En fonction des besoins, cette période peut être:
Les applications graphiques prenant en charge la visualisation en temps réel (par exemple, les jeux ou ce que nous ferons par exemple chez Infographie) se trouvent dans le second modèle et sont basées sur une boucle de traitement.
Dans le framework, cette boucle consiste en une série d'étapes (voir World::LoopUpdate ()
):
En outre, un modèle de mise en mémoire tampon des événements d'entrée permet d'interroger le statut des entrées à tout moment d'une image. Il offre donc une plus grande flexibilité globale pour la mise en œuvre de nouveaux comportements / logiques. La classe WindowObject
prend en charge la mise en mémoire tampon, mais également le traitement ultérieur d'événements à travers des objets de type InputController
.
Nous vous recommandons de lire la documentation de GLFW sur la gestion des événements d'entrée pour mieux comprendre les concepts présentés: http://www.glfw.org/docs/latest/input_guide.html
En général, les applications graphiques utilisent plusieurs tampons d'image pour éviter l'apparition d'artefacts graphiques en modifiant directement l'image affichée à l'écran. Ainsi, l'image affichée à l'heure T
a été traitée à l'heure T-1
ou T-2
(en fonction de la taille du tampon).
Des informations supplémentaires sur cette technique de mise en mémoire tampon multiple peuvent être obtenues à partir du wiki:
Dans lelaboratoire, le modèle d'application graphique présenté ci-dessus est mis en oeuvre par la classe World
.
L'étape 2 est gérée par les instances de InputController, tandis que l'étape 4 est fournie par les variables FrameStart ()
, Update (float deltaTime)
et FrameEnd ()
héritées de la classe World
. La classe World
étend déjà InputController
pour faciliter le travail en laboratoire.
Tous les laboratoires seront mis en œuvre sur la base de “SimpleScene” qui offre les fonctionnalités suivantes:
Main.cpp
)Engine::Init()
glfwInit()
)LoopUpdate()
)OpenGL est un standard (API) que nous pouvons utiliser pour créer des applications graphiques en temps réel. Il est presque identique à Direct3D, qui ont tous deux une influence mutuelle au fil des ans.
Depuis 2016, l'API Vulkan a été lancée. Elle offre un accès bas niveau avancé aux capacités graphiques modernes des processeurs graphiques. La norme Vulkan est orientée vers le développement d’applications hautes performances et sa complexité dépasse de loin les aspects fondamentaux qui seront présentés dans les points suivants: laboratoire / point de rebroussement.
Pendant les travaux pratiques (mais également pendant le cours), vous passerez par toutes les étapes importantes qui sont à la base du rendu graphique. Cela enseignera des concepts tels que:
Le framework est écrit en C ++, et sera utilisé dans tous les laboratoires. Les concepts utilisés en laboratoire et qui doivent être connus sont:
Dans les graphiques, les mathématiques sont utilisées partout, des simples matrices de rotation aux intégrales infiniment dimensionnelles des algorithmes utilisés dans l'industrie cinématographique. C'est pourquoi nous souhaitons disposer d'un support mathématique robuste, bien documenté et aussi proche de Format OpenGL. Au lieu d'écrire une bibliothèque mathématique, nous utiliserons la bibliothèque GLM. GLM nous fournit des rotations, des translations, des vecteurs de taille 2/3/4, des matrices et de nombreuses autres fonctionnalités avancées (par exemple, des modèles de bruit). Nous n'utiliserons que les fonctionnalités les plus simples dans les laboratoires de ce sujet.
glm::mat4 identity = glm::mat4 (1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); glm::mat4 identity2 = glm::mat4(1); // short form for writing identity matrices glm::vec3 culoare = glm::vec3(1, 0.5, 1); glm::vec2 directie = glm::vec3(-1, 1); glm::vec3 pozitie = glm::vec3(100, 10, -20); pozitie.x = 2; // you can select components like so: .x .y .z .t .r .g. b. a
Le cadre de laboratoire peut être trouvé sur Github
Vous pouvez télécharger l'archive directement en y accédant ce lien
Dans le laboratoire 1, vous pouvez télécharger des modèles 3D sur la scène et demander l’affichage de la scène à l’aide de la fonction
RenderMesh(Mesh * mesh, glm::vec3 position, glm::vec3 scale)
Les couleurs de pixel par lesquelles la scène est représentée sont stockées dans une mémoire tampon appelée Framebuffer. Le contexte défini fournit automatiquement un tel tampon et est configuré pour fonctionner avec une double mise en mémoire tampon.
L'API OpenGL utilisée dans le laboratoire:
// définit un espace de dessin dans l'espace de la fenêtre // x, y représente les coordonnées du coin inférieur gauche // width, height représente la taille de l'espace de dessin. void glViewport(GLint x, GLint y, GLsizei width, GLsizei height); // Définit la couleur avec laquelle tout l'écran sera coloré lors de l'effacement void glClearColor(float r, float g, float b, float a); // met en œuvre l'opération d'effacement void glClear(GL_COLOR_BUFFER_BIT);
Le tampon de couleur utilisé (à la fois dans le laboratoire et généralement en raison de limitations imposées par l'affichage sur le moniteur) est au format RGBA32. Chaque composant (rouge, vert, bleu, alpha) occupe 8 bits, donc la plage 0 - 255. Ainsi:
Le programme en cours offre la possibilité de visualiser la scène créée par une caméra prédéfinie.
Laborator1::Init()
découvrez comment vous pouvez déclarer (et télécharger) un nouvel objet de type Mesh
InputController.h
comme vous les utiliserez dans chaque laboratoire