Differences

This shows you the differences between two versions of the page.

Link to this comparison view

pgapi:teme:2024:01 [2024/11/14 23:46]
maria_anca.balutoiu [Tema 1]
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:​** ​13 noiembrie 2024 +  * **Lansare:​** ​15 noiembrie 2024 
-  * **Termen de predare:​** ​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 84: Line 85:
 {{ :​pgapi:​teme:​2024:​10.png?​500 |}} {{ :​pgapi:​teme:​2024:​10.png?​500 |}}
  
 +După cum se observă, reflexia nu este una perfectă, ci doar o aproximare. Această variantă de implementare este cea propusă pentru că se leagă de laboratoarele anterioare. Totuși puteți folosi și o metodă alternativă pentru redarea reflexiilor,​ metodă care oferă rezultate realiste.
  
 +Metoda realistă este următoarea:​ Se folosește un frame buffer pentru a randa scena folosind o cameră care este dedesubtul apei, simetrică față de camera jucătorului. De asemenea, pentru a nu apărea artefacte vizuale, trebuie sa nu se mai randeze fragmentele obiectelor de sub suprafața apei (folosind gl_CullDistance). Imaginea rezultată de această cameră este flipped pe verticală, iar apoi mapata pe suprafața apei folosind coordonatele NDC ale pixelilor de pe ecran.
 +{{ :​pgapi:​teme:​2024:​11.png?​500 |}}
  
 ===== Cascada ===== ===== Cascada =====
  
-În cadrul acestei cerințe se va implementa un sistem de particule pentru simularea unei cascade. Particulele vor urma o traiectorie definită de o curbă Bezier, iar pentru a genera un efect natural, fiecare particulă va avea un offset aleatoriu față de această curbă. +În cadrul acestei cerințe se va implementa un sistem de particule pentru simularea unei cascade. Particulele vor urma o traiectorie definită de curba Bezier descrisă anterior, iar pentru a genera un efect natural, fiecare particulă va avea un offset aleatoriu față de această curbă. Particulele se vor deplasa pe curba Bezier cu un increment al parametrului t. Valorile pentru acest increment, precum și pentru valoarea de noise sunt la latitudinea voastră (alegeți valori astfel încât să obțineți un efect realist).
-Particulele se vor deplasa pe curba Bezier cu un increment al parametrului t. Valorile pentru acest increment, precum și pentru valoarea de noise sunt la latitudinea voastră (alegeți valori astfel încât să obțineți un efect realist).+
  
-Comparativ cu implementarea din cadrul laboratorului de particule, ​larticulele ​cascadei nu vor avea transparență aplicată prin blending; în schimb, pentru a evita incompatibilități cu tipul de randare deferred, se vor elimina (discard) pixelii transparenți din texturile folosite.+Comparativ cu implementarea din cadrul laboratorului de particule, ​particulele ​cascadei nu vor avea transparență aplicată prin blending; în schimb, pentru a evita incompatibilități cu tipul de randare deferred, se vor elimina (discard) pixelii transparenți din texturile folosite.
  
 De asemenea, sistemul de particule pentru cascadă trebuie să aibă activat testul de adâncime. De asemenea, sistemul de particule pentru cascadă trebuie să aibă activat testul de adâncime.
  
 +{{ :​pgapi:​teme:​2024:​12.png?​500 |}}
  
 +Pentru a nu complica aplicația, particulele NU trebuie să se reflecte pe suprafața apei (decât dacă doriți să implementați această funcționalitate).
  
 ===== Notare (250) ===== ===== Notare (250) =====
-   ​* ​TODO+   ​* ​Generarea terenului ​ (75) 
 +       * Generarea formei de munti & lac (25) 
 +       * Noise (25) 
 +       * Curbura pentru cascada (25) 
 +  * Cerul (50) 
 +    * Skybox (20) 
 +    * Puncte de lumină mișcătoare (30) 
 +  * Petic de apa (75) 
 +       * Reflexie (25) 
 +       * Pastarea iluminarii in reflexie (50) 
 +  * Cascada folosind sistem de particule (50) 
  
 ===== Bonusuri posibile ===== ===== Bonusuri posibile =====
  
-   ​* ​TODO +   ​* ​Refractie 
- +   * Stele 
- +   * Licurici in loc de lumini simple 
-</​hidden>​+   * Particule folosind blending in deferred rendering (care sa tina cont de depth-ul scenei) 
 +   * Reflexie a particulelor
 ===== Indicații suplimentare ===== ===== Indicații suplimentare =====
  
pgapi/teme/2024/01.1731620800.txt.gz · Last modified: 2024/11/14 23:46 by maria_anca.balutoiu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0