This shows you the differences between two versions of the page.
vdvac:lab4 [2024/04/10 13:48] anca.morar [Implementare] |
vdvac:lab4 [2024/04/10 14:21] (current) anca.morar [Bonusuri posibile] |
||
---|---|---|---|
Line 60: | Line 60: | ||
=== Metode === | === Metode === | ||
- | **Metoda care creează un quad mare cât NDC** | + | **Crearea unui quad mare cât NDC** |
- | <code>Mesh* lab4::createQuad(const char *name) </code> | + | * <code>Mesh* createQuad(const char *name) </code> |
+ | * în ''Update()'' se vor desena 3 astfel de quad-uri, fiecare pe o treime din viewport | ||
+ | |||
+ | **Generarea rețelelor de triunghiuri din imaginile sursă și destinație** | ||
+ | * <code>void createNet(const string &path, const char *fileName)</code> | ||
+ | * se citesc din fișier perechile pe puncte de control din cele două rețele (cu care se completează vectorii ''vertices'') | ||
+ | * se citesc indicii pentru triunghiurile formate (cu care se completează vectorul ''indices'') | ||
+ | |||
+ | ** Calculul coordonatelor baricentrice** | ||
+ | * <code>bool Baricentric(glm::vec2 pos, glm::vec2 v0, glm::vec2 v1, glm::vec2 v2, float &u, float &v, float &w)</code> | ||
+ | * intoarce true dacă poziția punctului e în interiorul triunghiului | ||
+ | * calculează coordonatele baricentrice | ||
+ | |||
+ | ** Calculul imaginii intermediare ** | ||
+ | * <code>void ModifyImage(int crt_iteration, int iterations)</code> | ||
+ | * calculează vârfurile rețelei intermediare prin interpolare | ||
+ | * pentru fiecare pixel din imaginea intermediară | ||
+ | * calculează triunghiul care îl conține | ||
+ | * determină triunghiurile corespondente din imaginea sursă, respectiv din imaginea destinație | ||
+ | * calculează coordonatele baricentrice | ||
+ | * calculează pixelii corespondenți din imaginea sursă, respectiv din imaginea destinație | ||
+ | * calculează culoarea pixelului curent prin interpolare între culorile pixelilor corespondenți din imaginea sursă, respectiv din imaginea destinație | ||
+ | |||
+ | ==== Cerințe laborator ==== | ||
+ | - Să se completeze funcția ''Baricentric()'' astfel încât să calculeze corect ariile din triunghi (aria totală și ariile parțiale determinate de punctul curent) și să se calculeze coordonatele baricentrice | ||
+ | - Să se calculeze vârfurile rețelei intermediare prin interpolare, pentru imaginea intermediară curentă | ||
+ | - Să se determine vârfurile triunghiului care conține pixelul curent | ||
+ | - Să se calculeze vârfurile triunghiurilor corespondente triunghiului curent (din imaginea sursă și cea destinație) | ||
+ | - Să se calculeze coordonatele punctelor corespondente punctului curent (din imaginea sursă și cea destinație) | ||
+ | - Să se calculeze culoarea pixelului curent prin interpolare între culorile pixelilor corespondenți din imaginea sursă, respectiv din imaginea destinație | ||
+ | |||
+ | ==== Bonusuri posibile ==== | ||
+ | * Optimizarea procesării pixelilor | ||
+ | * în loc de parcurgerea pixel cu pixel și căutarea triunghiului care conține pixelul curent, ar trebui realizată parcurgerea triunghi cu triunghi și rasterizara fiecărui triunghi | ||
+ | |||
+ | ==== Demo ==== | ||
+ | |||
+ | <html> | ||
+ | <p style="text-align:center;margin:auto;"> | ||
+ | <iframe width="430" height="250" src="https://www.youtube.com/embed/iVTRa3xTXXs" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> | ||
+ | </p> | ||
+ | </html> |