This shows you the differences between two versions of the page.
egc:laboratoare:01 [2021/10/05 13:20] anca.morar [Laboratorul 01] |
egc:laboratoare:01 [2024/10/06 15:43] (current) silviu.stancioiu00 [Laboratorul 1] |
||
---|---|---|---|
Line 1: | Line 1: | ||
===== Laboratorul 01 ===== | ===== Laboratorul 01 ===== | ||
- | <hidden> | + | |
- | **Video Laborator 1**: https://www.youtube.com/watch?v=YlzFkjJjh4Q.\\ | + | **Video Laborator 1**:https://youtu.be/Hh-geX8VvxA .\\ |
**Autor**: [[anca.morar@cs.pub.ro | Anca Morar]] | **Autor**: [[anca.morar@cs.pub.ro | Anca Morar]] | ||
- | </hidden> | ||
==== Introducere ==== | ==== Introducere ==== | ||
Line 88: | Line 87: | ||
* **/core** | * **/core** | ||
* API-ul de bază al framwork-ului GFX | * API-ul de bază al framwork-ului GFX | ||
- | * **/gPU** | + | * **/gpu** |
* __gpu_buffers.cpp__ | * __gpu_buffers.cpp__ | ||
* Asigură suportul pentru definirea de buffere de date și încărcarea de date (modele 3D) pe GPU | * Asigură suportul pentru definirea de buffere de date și încărcarea de date (modele 3D) pe GPU | ||
Line 171: | Line 170: | ||
=== Etapele rulării aplicației === | === Etapele rulării aplicației === | ||
- | - Se definesc proprietățile pentru fereastra de lucru (''Main.cpp'') | + | - Se definesc proprietățile pentru fereastra de lucru (''main.cpp'') |
- Se inițializează Engine-ul astfel - ''Engine::Init()'' | - Se inițializează Engine-ul astfel - ''Engine::Init()'' | ||
- Se inițializează API-ul OpenGL (''glfwInit()'') | - Se inițializează API-ul OpenGL (''glfwInit()'') | ||
Line 177: | Line 176: | ||
- Se atașează evenimentele de fereastră prin intermediul __WindowsCallbacks.cpp__ | - Se atașează evenimentele de fereastră prin intermediul __WindowsCallbacks.cpp__ | ||
- Se inițializează managerul de texturi | - Se inițializează managerul de texturi | ||
- | - Se creează și inițializează o nouă scenă 3D de lucru având la bază modelul de update prezentat anterior (__Main.cpp__) | + | - Se creează și inițializează o nouă scenă 3D de lucru având la bază modelul de update prezentat anterior (__main.cpp__) |
- Se pornește rularea scenei încărcate (''LoopUpdate()'') | - Se pornește rularea scenei încărcate (''LoopUpdate()'') | ||
Line 204: | Line 203: | ||
==== Cerințe generale de laborator ==== | ==== Cerințe generale de laborator ==== | ||
- | * Citiți cu foarte mare atenție Framwork-ul de laborator întrucât îl veți utiliza pe tot parcursul laboratorului de EGC inclusiv și la temele de casă | + | * Citiți cu foarte mare atenție Framework-ul de laborator întrucât îl veți utiliza pe tot parcursul laboratorului de EGC inclusiv și la temele de casă |
* Citiți comentariile din cod – ar trebui să răspundă la majoritatea întrebărilor pe care le aveți | * Citiți comentariile din cod – ar trebui să răspundă la majoritatea întrebărilor pe care le aveți | ||
* Citiți documentația de la [[ https://github.com/UPB-Graphics/gfx-framework/blob/master/src/core/window/input_controller.cpp | __input_controller.h__]] întrucât veți utiliza constant funcțiile din cadrul acestei clase (prin suprascriere) pentru definirea de interacțiuni și comportament personalizat | * Citiți documentația de la [[ https://github.com/UPB-Graphics/gfx-framework/blob/master/src/core/window/input_controller.cpp | __input_controller.h__]] întrucât veți utiliza constant funcțiile din cadrul acestei clase (prin suprascriere) pentru definirea de interacțiuni și comportament personalizat | ||
Line 214: | Line 213: | ||
Conceptele utilizate în cadrul laboratorului și care trebuie știute sunt: | Conceptele utilizate în cadrul laboratorului și care trebuie știute sunt: | ||
* concepte de bază de OOP - obiecte, moștenire, metode virtuale, etc | * concepte de bază de OOP - obiecte, moștenire, metode virtuale, etc | ||
- | * utilizarea bibliotecilor standard: în special [[http://www.cplusplus.com/reference/vector/vector/ | std::vector]], [[ http://www.cplusplus.com/reference/list/list/ | std::list ]] și [[ http://www.cplusplus.com/reference/unordered_map/unordered_map/ | std::unorderd_map ]] | + | * utilizarea bibliotecilor standard: în special [[http://www.cplusplus.com/reference/vector/vector/ | std::vector]], [[ http://www.cplusplus.com/reference/list/list/ | std::list ]] și [[ http://www.cplusplus.com/reference/unordered_map/unordered_map/ | std::unordered_map ]] |
<note tip> | <note tip> | ||
Line 220: | Line 219: | ||
</note> | </note> | ||
- | == Generare si compilare == | + | == Generare și compilare == |
- | * Pentru generarea solutiilor compilabile pentru platformele suportate, framework-ul foloseste [[https://github.com/Kitware/CMake/|CMake]] | + | * Pentru generarea soluțiilor compilabile pentru platformele suportate, framework-ul folosește [[https://github.com/Kitware/CMake/|CMake]] |
- | * Platformele suportate in acest moment de framework sunt | + | * Platformele suportate în acest moment de framework sunt: |
* Windows (stabil) | * Windows (stabil) | ||
* Linux (experimental) | * Linux (experimental) | ||
* macOS (experimental) | * macOS (experimental) | ||
- | * Pentru generarea solutiei pentru platforma dorita, urmati pasii de instalare si generare descrisi la [[https://github.com/UPB-Graphics/gfx-framework|GFX Framework]] | + | * Pentru generarea soluției pentru platforma dorită, urmați pașii de instalare și generare descriși la [[https://github.com/UPB-Graphics/gfx-framework|GFX Framework]] |
- | == Visual Studio 2019 == | + | == Visual Studio 2022 == |
- | * În cadrul laboratorului vom utiliza [[https://www.visualstudio.com/vs/community/|Visual Studio 2019 Community Edition]] | + | * În cadrul laboratorului vom utiliza [[https://www.visualstudio.com/vs/community/|Visual Studio 2022 Community Edition]] |
* Installer-ul de Visual Studio vine cu posibilitatea de a instala modular doar ceea ce este necesar. Pentru acest laborator trebuie instalat doar modulul default **Desktop development with C++**, care se regăsește în **Workloads** | * Installer-ul de Visual Studio vine cu posibilitatea de a instala modular doar ceea ce este necesar. Pentru acest laborator trebuie instalat doar modulul default **Desktop development with C++**, care se regăsește în **Workloads** | ||
- | * Dupa generarea cu CMake, framework-ul va conține in folderul de **/build** un proiect pentru Visual Studio: __GFXFramework.sln__ | + | * După generarea cu CMake, framework-ul va conține in folderul de **/build** un proiect pentru Visual Studio: __GFXFramework.sln__ |
* Deschideți soluția în Visual Studio | * Deschideți soluția în Visual Studio | ||
Line 239: | Line 238: | ||
<note tip> | <note tip> | ||
- | Cei care doresc sa foloseasca **Linux** sau **macOS** pot face acest lucru, insa **atentie**, suportul in acest moment este experimental (au fost testate functionalitatile de baza pe unele din cele mai folosite distributii) si pot aparea diverse bug-uri in functie de implementarea de pe aceste platforme. | + | Cei care doresc sa folosească **Linux** sau **macOS** pot face acest lucru, însă **atenție**, suportul în acest moment este experimental (au fost testate funcționalitățile de bază pe unele din cele mai folosite distribuții) și pot apărea diverse bug-uri în funcție de implementarea de pe aceste platforme. |
</note> | </note> | ||
Line 291: | Line 290: | ||
// implementeaza operatia de clear | // implementeaza operatia de clear | ||
- | void glClear(GL_COLOR_BUFFER_BIT); | + | void glClear(GLbitfield mask); |
</code> | </code> | ||
Line 317: | Line 316: | ||
- Descărcați framework-ul, compilați și rulați proiectul | - Descărcați framework-ul, compilați și rulați proiectul | ||
- | * Trebuie să deschideți proiectul GFXFramework.sln (din folderul de __/build__) în Visual Studio 2019 | + | * Trebuie să deschideți proiectul GFXFramework.sln (din folderul de __/build__) în Visual Studio 2022 |
- Încărcați un alt model 3D și randați-l în scenă la o poziție diferită față de cele 2 cuburi | - Încărcați un alt model 3D și randați-l în scenă la o poziție diferită față de cele 2 cuburi | ||
* __/assets/models__ conține o serie de modele 3D ce pot fi încărcate | * __/assets/models__ conține o serie de modele 3D ce pot fi încărcate | ||
* În ''Lab1::Init()'' găsiți modul în care puteți să declarați (și încărcați) un nou obiect de tip ''Mesh'' | * În ''Lab1::Init()'' găsiți modul în care puteți să declarați (și încărcați) un nou obiect de tip ''Mesh'' | ||
- La apăsarea unei taste să se schimbe culoarea de ștergere a ecranului | - La apăsarea unei taste să se schimbe culoarea de ștergere a ecranului | ||
- | - La apăsarea unei taste să se schimbe obiectul afisat (render) la o poziție (să cicleze prin 3 obiecte, de ex cube, teapot, sphere) | + | - La apăsarea unei taste să se schimbe forma/mesh-ul unuia dintre obiectele afisate (render) astfel incat să se cicleze prin 3 obiecte (de ex cube, teapot, sphere) |
- Să se miște prin spațiu un obiect oarecare la apăsarea tastelor W, A, S, D, E, Q (pozitiv și negativ pe toate cele 3 axe) | - Să se miște prin spațiu un obiect oarecare la apăsarea tastelor W, A, S, D, E, Q (pozitiv și negativ pe toate cele 3 axe) | ||
Line 330: | Line 329: | ||
<hidden> | <hidden> | ||
+ | Cerinte alternative: | ||
+ | * 3.1 La apăsarea unei taste să se faca toggle intre utilizarea apelului glClear si neutilizarea lui, sa vada rezultatul care apare cand nu se sterge ecranul. | ||
+ | * 3.2 La apasarea a 3 taste diferite sa schimbe culoarea de ștergere a ecranului. Fiecare tasta schimba explicit o anumita culoare: tasta 1 -> rosu, tasta 2 -> galbel si tasta 3 -> cyan. In felul acesta se obisnuiesc putin si cu modelul de culoare. | ||
+ | * 4.1 Unul dintre cele 3 forme prin care se cicleaza sa fie format din doua modele 3d, de exemplu teapot care sta pe box. | ||
+ | * 5.1 Sa se aplice deplasarea pe obiectul prin care se cicleaza | ||
+ | * 5.2 Suplimentar, la apasarea tastelor Z si X sa se schimbe scara obiectului, continuu, cu window->KeyHold(). | ||
+ | |||
Bonusuri posibile: | Bonusuri posibile: | ||
* Rotația continuă a unui obiect în jurul unui punct, cu o anumită rază. | * Rotația continuă a unui obiect în jurul unui punct, cu o anumită rază. |