Video Laborator 1:https://youtu.be/Hh-geX8VvxA .
Autor: Anca Morar
Grafica pe calculator este un subiect amplu utilizat într-un număr din ce în ce mai mare de domenii. În acest laborator se vor prezenta conceptele ce stau la baza graficii cât și a utilizării procesorului grafic pentru acest scop. Domeniul graficii computerizate necesită cunoștințe variate: matematică, fizică, algoritmică, grafică digitală 2D & 3D, user experience design, etc.
Întrucât scrierea unei aplicații simple OpenGL nu se poate realiza foarte ușor într-un timp scurt, dar și pentru a putea prezenta mai simplu conceptele de bază ale graficii computerizate moderne, în cadrul laboratoarelor se va lucra pe un framework ce oferă o serie de funcționalități gata implementate. Framework-ul utilizat oferă toate funcționalitățile de bază ale unui motor grafic minimal, precum:
De asemenea, pe langă funcționalitățile de bază, framework-ul implementează un model generic pentru scrierea de aplicații OpenGL. Astfel, sunt oferite următoarele aspecte:
Funcționalitatea framework-ului este oferită prin intermediul mai multor biblioteci (libraries):
glm::vec2, glm::vec3, glm::vec4
prin intermediul operatorului C++ supraîncărcat: operator«
Orice aplicație trebuie să asigure funcționalitatea pe o anumită perioadă de timp. În funcție de cerințe această perioadă poate fi :
Aplicațiile grafice cu suport de vizualizare în timp real (de exemplu jocurile, sau de exemplu ce vom face noi la EGC) se regăsesc în cel de-al doilea model și au la bază funcționarea pe baza unei bucle (loop) de procesare.
În cadrul framework-ului EGC acest loop constă într-o serie de pași (vezi World::LoopUpdate()
):
De asemenea, un model bazat pe buffering al evenimentelor de input oferă posibilitatea de a interoga starea input-ului în orice moment al unui frame, deci ofera și o flexibilitate generală mai mare pentru a implementa noi comportamente/logici. Clasa WindowObject
asigură suportul pentru buffering, dar și pentru procesarea ulterioară a evenimentelor prin intermediul obiectelor de tipul InputController
.
Recomandăm să citiți documentația GLFW despre tratarea evenimentelor de input pentru a înțelege mai bine conceptele prezentate: 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 bibliotecă de matematică vom folosi biblioteca GLM. GLM ne oferă rotații, translații, vectori de dimensiune 2/3/4, matrici și multe alte funcționalități avansate (de ex. 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 afisare a aplicatiei // 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(GLbitfield mask);
Bufferul de culoare utilizat (atât în cadrul laboratorului dar și în mod uzual datorită limitărilor impuse de afișarea pe monitoare) este în format RGBA8. Fiecare componentă (red, green, blue, alpha) este memorată pe 8 biți, deci are o valoare in intervalul 0 – 255. Astfel:
Programul rulat oferă posibilitatea vizualizării scenei create prin intermediul unei camere predefinite.
Lab1::Init()
găsiți modul în care puteți să declarați (și încărcați) un nou obiect de tip Mesh
input_controller.h
întrucât le veți utiliza în cadrul fiecărui laborator