This shows you the differences between two versions of the page.
pgapi:teme:2024:01 [2024/11/14 23:53] maria_anca.balutoiu |
pgapi:teme:2024:01 [2024/12/08 16:55] (current) silviu.stancioiu00 [Teren] |
||
---|---|---|---|
Line 2: | Line 2: | ||
* **Responsabili:** Anca Băluțoiu, Silviu Stăncioiu, Mihnea Mitrache, Andrei Voicu | * **Responsabili:** Anca Băluțoiu, Silviu Stăncioiu, Mihnea Mitrache, Andrei Voicu | ||
- | * **Lansare:** 14 noiembrie 2024 | + | * **Lansare:** 15 noiembrie 2024 |
- | * **Termen de predare:** 5 decembrie 2024, ora 23:55 | + | * **Termen de predare:** 11 decembrie 2024, ora 23:55 |
* **Regulament:** https://ocw.cs.pub.ro/courses/pgapi/regulament_general | * **Regulament:** https://ocw.cs.pub.ro/courses/pgapi/regulament_general | ||
* **Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!** | * **Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!** | ||
- | <hidden> | + | În cadrul acestei teme va trebui să realizați o simulare a unui lac de la munte, în care se varsă o cascadă. Simularea se va face pe timp de noapte, în scenă fiind prezente surse de lumină dinamice. Un video demonstrativ ce înfățișează o posibilă implementare îl puteți viziona în filmulețul de mai jos: |
- | În cadrul acestei teme va trebui să realizați o simulare a unui lac de la munte, în care se varsă o cascadă. Simularea se va face pe timp de noapte, în scenă fiind prezente surse de lumină mișcătoare. Un video demonstrativ ce înfățișează o posibilă implementare îl puteți viziona în filmulețul de mai jos: | + | |
<html> | <html> | ||
<p style="text-align:center;margin:auto;"> | <p style="text-align:center;margin:auto;"> | ||
Line 17: | Line 16: | ||
===== Teren ===== | ===== Teren ===== | ||
- | Se va genera procedural un mesh pentru teren. Inițial se va porni de la un grid de rezoluție m x n, iar apoi se vor face următoarele operații de displacement pe vertecșii acestuia: | + | Se va genera procedural un mesh pentru teren. Pentru a simplifica lucrurile, mesh-ul va fi generat în întregime pe CPU (folosind metoda prezentată în laboratorul 2 de EGC), nefiind necesară folosirea de Geomtry Shaders. Inițial se va porni de la un grid de rezoluție m x n, iar apoi se vor face următoarele operații de displacement pe vertecșii acestuia: |
- | - Definirea suprafețelor concave și convexe ale terenului: Terenul va defini o suprafață convexă pentru zona în care se va afla lacul și una concavă unde vor fi munții. Displacement-ul aferent acestor parabole va fi calculat în funcție de distanța dintre vertecși și centrul mesh-ului astfel:{{ :pgapi:teme:2024:screenshot_2024-11-14_232244.png?300 |}}unde hmax este înălțimea dorită pentru suprafață, iar d este o valoare calculată în felul următor: {{ :pgapi:teme:2024:screenshot_2024-11-14_232359.png?200 |}} unde v este poziția vertexului curent în planul XZ, c este centrul mesh-ului în planul XZ, iar r este raza gropii. Rezultatul dorit este următorul (imaginea afișează normalele suprafeței pentru a fi mai ușor de perceput forma): {{ :pgapi:teme:2024:1.png?500 |}} | + | - Definirea suprafețelor concave și convexe ale terenului: Terenul va defini o suprafață convexă pentru zona în care se va afla lacul și una concavă unde vor fi munții. Displacement-ul aferent acestor parabole va fi calculat în funcție de distanța dintre vertecși și centrul mesh-ului astfel: |
+ | {{ :pgapi:teme:2024:formula_teren.png?200 |}} | ||
+ | unde hmax este înălțimea dorită pentru suprafață, iar d este o valoare calculată în felul următor: {{ :pgapi:teme:2024:screenshot_2024-11-14_232359.png?200 |}} unde v este poziția vertexului curent în planul XZ, c este centrul mesh-ului în planul XZ, iar r este raza gropii. Rezultatul dorit este următorul (imaginea afișează normalele suprafeței pentru a fi mai ușor de perceput forma): {{ :pgapi:teme:2024:1.png?500 |}} | ||
- Denivelări ale suprafeței pentru a da impresia de munți: Pentru asta se poate folosi noise: [[https://thebookofshaders.com/11/|The Book of Shaders: Noise]]. După aplicarea denivelarilor, un rezultat satisfăcător este acesta: {{ :pgapi:teme:2024:2.png?500 |}} | - Denivelări ale suprafeței pentru a da impresia de munți: Pentru asta se poate folosi noise: [[https://thebookofshaders.com/11/|The Book of Shaders: Noise]]. După aplicarea denivelarilor, un rezultat satisfăcător este acesta: {{ :pgapi:teme:2024:2.png?500 |}} | ||
- Curbură ce definește zona prin care se va vărsa cascada: Se va folosi o curbă Bezier pe baza căreia se va denivela o parte a terenului. Pentru fiecare pereche (xv, zv) de coordonate ale vertecșilor terenului în planul XZ și fiecare pereche (xc, zc) de coordonate ale curbei Bezier în planul XZ se va calcula parametrul t al curbei Bezier pentru care distanța dintre (xv, zv) și curba proiectată este minimă. | - Curbură ce definește zona prin care se va vărsa cascada: Se va folosi o curbă Bezier pe baza căreia se va denivela o parte a terenului. Pentru fiecare pereche (xv, zv) de coordonate ale vertecșilor terenului în planul XZ și fiecare pereche (xc, zc) de coordonate ale curbei Bezier în planul XZ se va calcula parametrul t al curbei Bezier pentru care distanța dintre (xv, zv) și curba proiectată este minimă. | ||
Line 26: | Line 27: | ||
{{ :pgapi:teme:2024:3.png?500 |}} | {{ :pgapi:teme:2024:3.png?500 |}} | ||
- | De asemenea, pe lângă parametrul t, ne interesează și distanța dbezier dintre vertexul nostru proiectat pe XZ și punctul găsit anterior. | + | De asemenea, pe lângă parametrul t, ne interesează și distanța d_bezier dintre vertexul nostru proiectat pe XZ și punctul găsit anterior. |
Parametrul t este apoi folosit pentru a evalua curba propriu-zisă (nu cea proiectată pe OZ) și a găsi cel mai apropiat punct de pe curbă. O să numim acest punct b_closest. | Parametrul t este apoi folosit pentru a evalua curba propriu-zisă (nu cea proiectată pe OZ) și a găsi cel mai apropiat punct de pe curbă. O să numim acest punct b_closest. | ||
- | Pentru a realiza curbura în teren putem interpola între înălțimea sa inițială și înălțimea celui mai apropiat punct pe curba în 3D (yb_closest) astfel:{{ :pgapi:teme:2024:screenshot_2024-11-14_232359.png?200 |}} unde r_cascada este raza cascadei noastre. | + | Pentru a realiza curbura în teren putem interpola între înălțimea sa inițială și înălțimea celui mai apropiat punct pe curba în 3D (y_b_closest) astfel:{{ :pgapi:teme:2024:screenshot_2024-11-14_233111.png?200 |}} unde r_cascada este raza cascadei noastre. |
Folosind formula descrisă mai sus vom avea o curbură, dar aceasta nu va avea o formă naturală. Putem îmbunătăți forma acesteia folosind funcția sinus: | Folosind formula descrisă mai sus vom avea o curbură, dar aceasta nu va avea o formă naturală. Putem îmbunătăți forma acesteia folosind funcția sinus: | ||
Line 55: | Line 56: | ||
===== Cerul ===== | ===== Cerul ===== | ||
- | În implementarea temei trebuie să sintetizați atât cerul cât și pereții exteriori ai mediului înconjurător. Veți folosi un cubemap sugestiv pentru a realiza această sinteză. | + | În implementarea temei trebuie să sintetizați atât cerul cât și pereții exteriori ai mediului înconjurător. Veți folosi un cubemap sugestiv pentru a realiza această sarcină. Varianta folosită în temă este disponibilă {{:pgapi:teme:2024:cubemap.zip | aici}}. |
{{ :pgapi:teme:2024:7.png?500 |}} | {{ :pgapi:teme:2024:7.png?500 |}} | ||
Line 71: | Line 72: | ||
{{ :pgapi:teme:2024:8.png?500 |}} | {{ :pgapi:teme:2024:8.png?500 |}} | ||
- | Dacă dorim să se păstreze și iluminarea în reflexia calculată, atunci va trebuie modificat modul de randare a mediului în cubemap. Pentru a face asta, este nevoie de deferred rendering la nivel de cube map, cu shader speciale pentru asta (shader care sa scrie informațiile despre scenă și shader pentru light accumulation). | + | Dacă dorim să se păstreze și iluminarea în reflexia calculată, atunci va trebui modificat modul de randare a mediului în cubemap. Pentru a face asta, este nevoie de deferred rendering la nivel de cube map, cu shader speciale pentru asta (shader care sa scrie informațiile despre scenă și shader pentru light accumulation). |
Procesul este similar cel folosit în laboratoarele despre reflexie și deferred rendering, cu excepția câtorva observații: | Procesul este similar cel folosit în laboratoarele despre reflexie și deferred rendering, cu excepția câtorva observații: | ||
Line 106: | Line 107: | ||
* Noise (25) | * Noise (25) | ||
* Curbura pentru cascada (25) | * Curbura pentru cascada (25) | ||
- | * Puncte de lumina miscatoare (50) | + | * Cerul (50) |
+ | * Skybox (20) | ||
+ | * Puncte de lumină mișcătoare (30) | ||
* Petic de apa (75) | * Petic de apa (75) | ||
* Reflexie (25) | * Reflexie (25) | ||
Line 119: | Line 122: | ||
* Licurici in loc de lumini simple | * Licurici in loc de lumini simple | ||
* Particule folosind blending in deferred rendering (care sa tina cont de depth-ul scenei) | * Particule folosind blending in deferred rendering (care sa tina cont de depth-ul scenei) | ||
- | </hidden> | + | * Reflexie a particulelor |
===== Indicații suplimentare ===== | ===== Indicații suplimentare ===== | ||