This is an old revision of the document!
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 ()
):
* Exemple : un personnage dans une partie doit avancer tant que l'utilisateur appuie sur la touche W . * Pour gérer correctement cette logique, il est nécessaire de conserver le statut de la touche W . Lorsque le caractère est déplacé, il est directement proportionnel au temps écoulé depuis le dernier traitement de la trame. * La même chose s'applique aux boutons de la souris
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
În general, aplicațiile grafice folosesc mai multe buffere de imagini separate pentru a evita apariția artefactelor grafice prin modificarea directă a imaginii randate pe ecran. Astfel, imaginea afișată la momentul T
a fost procesată la momentul T-1
, sau T-2
(în funcție de dimensiunea bufferului).
Informații adiționale despre această tehnică multi-buffering pot fi obțiunute de pe wiki:
În cadrul unui laborator modelul aplicației grafice prezentat mai sus este implementat de către clasa World
.
Pasul 2 este tratat de către instanțele InputController în timp ce pasul 4 este asigurat de funcțiile FrameStart()
, Update(float deltaTime)
, și FrameEnd()
moștenite de la clasa World
. Clasa World
extinde deja InputController
pentru a ușura munca în cadrul laboratorului.
Toate laboratoarele EGC vor fi implementate pe baza SimpleScene
ce oferă următoarele facilități:
Main.cpp
)Engine::Init()
glfwInit()
)LoopUpdate()
)OpenGL este un standard (API) pe care îl putem folosi pentru a crea aplicații grafice real-time. Este aproape identic cu Direct3D, ambele având o influență reciprocă de-a lungul anilor.
Pe parcursul laboratoarelor (dar și a cursului) se va trece prin toate etapele importante ce stau la baza redării grafice. Astfel vor fi învățate concepte precum:
Framework-ul este scris în limbajul C++, ce va fi utilizat pe tot parcursul laboratoarelor. Conceptele utilizate în cadrul laboratorului și care trebuie știute sunt:
În grafică, matematica este folosită peste tot, de la simple matrici pentru rotații până la integrale infinit dimensionale pentru algoritmii folosiți în industria filmului, de aceea ne dorim să avem un suport de matematică robust, bine documentat și nu în ultimul rând cât mai apropiat de formatul OpenGL. În loc să scriem noi o librărie de matematică vom folosi librăria GLM. GLM ne oferă rotații, translații, vectori de dimensiune 2/3/4, matrici și multe alte funcționalități avansate (e.g. modele de zgomot). Vom folosi doar cele mai simple funcționalități în laboratoarele de la această materie.
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
Framework-ul de laborator se găsește pe Github
Puteți să descărcați direct arhiva accesând acest link
În cadrul laboratorului 1 puteți încărca modele 3D în cadrul scenei și cere afișarea scenei utilizând funcția
RenderMesh(Mesh * mesh, glm::vec3 position, glm::vec3 scale)
Culorile pixelilor prin care se reprezintă scena sunt salvate într-un buffer, numit Framebuffer. Contextul definit oferă automat un astfel de buffer și este configurat să ruleze cu double-buffering
API-ul OpenGL utilizat în cadrul laboratorului:
// defineste un spatiu de desenare in spatiul ferestrei de vizualizare // x, y reprezinta coordonatele coltului stanga jos // width, height reprezinta dimensiunea spatiului de desenare. void glViewport(GLint x, GLint y, GLsizei width, GLsizei height); // seteaza culoarea cu care va fi colorat tot ecranul la operatia de clear void glClearColor(float r, float g, float b, float a); // implementeaza operatia de clear void glClear(GL_COLOR_BUFFER_BIT);
Bufferul de culoare utilizat (atât în cadrul laboratorului dar și în mod uzual datorită limitărilor impuse de afișarea pe monitore) este în format RGBA32. Fiecare componentă (red, green, blue, alpha) ocupă 8 biți, deci intervalul 0 – 255. Astfel:
Programul rulat oferă posibilitatea vizualizării scenei create prin intermediul unei camere predefinite.
Laborator1::Init()
găsiți modul în care puteți să declarați (și încărcați) un nou obiect de tip Mesh
InputController.h
întrucât le veți utiliza în cadrul fiecărui laborator