Differences

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

Link to this comparison view

spg:laboratoare:02 [2020/10/16 08:39]
alexandru.gradinaru [Cerinte laborator]
spg:laboratoare:02 [2023/09/29 13:39] (current)
andrei.lambru [Diferite tipuri de instanțiere]
Line 1: Line 1:
 ====== Laboratorul 02 ====== ====== Laboratorul 02 ======
  
-===== Suprafete ​generate =====+===== Suprafețe ​generate =====
  
 +În multe cazuri, putem cunoaște propietățile unei suprafețe fără a-i cunoaște geometria explicită. Putem genera această suprafață folosind o geometrie generatoare și un proces de generare. În acest laborator, vom explora câteva din metodele de generare existente.
  
-In multe cazuri putem cunoaste propietatile unei suprafete fara ai ii cunoaste geometria explicita. Putem genera aceasta suprafata folosind o geometrie generatoare si un proces de generare. In acest laborator vom explora cateva din metodele de generare existente. +Orice suprafață generată ​are: 
-Orice suprafata generata ​are: +  * Un generator, ​adică ​o geometrie explicit ​definită ​pe baza căreia ​are loc procesul de generare 
-  * un generator, ​adica o geometrie explicit ​definita ​pe baza careia ​are loc procesul de generare +  * Un algoritm de generare. Acesta ​poate fi bazat pe rotațietranslație ​sau pe orice fel de curbă definită ​prin puncte de control (ex: Bezier, Hermite, etc)
-  * un algoritm de generare, acesta ​poate fi bazat pe rotatietranslatie ​sau pe orice fel de curba definita ​prin puncte de control (ex: Bezier, Hermite, etc)+
  
-Procesul de generare decurge astfel: ​intai se deseneaza ​geometria generator, pe baza careia ​va fi construita suprafata generataDupa aceasta, se deseneaza ​un numar de instante ​ale geometriei generator, fiecare ​transformata ​de functia ​de generare ​intr-un mod progresiv. Rezultatul final este obtinut ​prin combinarea ​topologica ​a acestor ​instante.+Procesul de generare decurge astfel: ​întâi ​se desenează ​geometria generator, pe baza căreia ​va fi construită suprafața generatăDupă aceasta, se desenează ​un număr ​de instanțe ​ale geometriei generator, fiecare ​transformată ​de funcția ​de generare ​într-un mod progresiv. Rezultatul final este obținut ​prin combinarea ​topologică ​a acestor ​instanțe.
  
-==== Diferite tipuri de instantiere ​====+===== Diferite tipuri de instanțiere =====
  
-Instantierea reprezinta ​un mecanism prin care se amplifica numarul ​de primitive trimise la banda graficaAceasta ​amplificare este fie explicita ​(programata ​de utilizator ​in shader) fie implicita ​(generata ​prin comenzi OpenGL).+Instanțierea reprezintă ​un mecanism prin care se amplifică numărul ​de primitive trimise la banda graficăAceastă ​amplificare este fie explicită ​(programată ​de utilizator ​în shader)fie implicită ​(generată ​prin comenzi OpenGL).
  
-Pentru a instantia ​implict geometrie ​exista ​comanda:+Pentru a instanția ​implict geometrie, există ​comanda:
  
-<​code>​+<​code ​cpp>
 glDrawElementsInstanced(topologie,​ nr_indecsi, tip_data, offset, instante). glDrawElementsInstanced(topologie,​ nr_indecsi, tip_data, offset, instante).
 </​code>​ </​code>​
  
-De exemplu ​daca as dori sa desenez de 1540 de ori(instante) un obiect cu  99 de indecsi ​format din triunghiuri din bufferul ​de indecsi ​legat curent la banda grafica ​, atunci comanda ar fi:+De exemplu, dacă aș dori să desenez de 1540 de ori (instanțe) un obiect cu 99 de indecși, ​format din triunghiuri din buffer-ul ​de indecși, ​legat curent la banda grafică, atunci comanda ar fi:
  
-<​code>​ +<​code ​cpp
-glDrawElementsInstanced(GL_TRIANGLES,​ 99, GL_UNSIGNED_INT,​0,​1540);​+glDrawElementsInstanced(GL_TRIANGLES,​ 99, GL_UNSIGNED_INT,​ 0, 1540);
 </​code>​ </​code>​
  
-Instantierea explicita ​se face in shader, ​generand ​geometrie ​noua prin comenzi glsl, in acest caz prin comenzi de geometry shader: +Instanțierea explicită ​se face în shader, ​generând ​geometrie ​nouă prin comenzi glsl, în acest caz prin comenzi de geometry shader: 
-<​code>​ +<​code ​cpp
-gl_Position = P*V *M* vec4(p1, 1);​ EmitVertex();​ +gl_Position = P*V*M*vec4(p1,​ 1);​ EmitVertex();​ 
-gl_Position = P*V *M* vec4(p2, 1);​ EmitVertex();​ +gl_Position = P*V*M*vec4(p2,​ 1);​ EmitVertex();​ 
-gl_Position = P*V *M* vec4(p3, 1);​ EmitVertex();​+gl_Position = P*V*M*vec4(p3,​ 1);​ EmitVertex();​
 EndPrimitive();​ EndPrimitive();​
 </​code>​ </​code>​
-Instantirea ofera posibilitatea ​usoara ​de a creste ​rapid numarul ​de obiecte din scenadaca obiectele sunt identice. Ex: copaci, tile-uri de teren, ​unitati intr-un rts, etc.+Instanțirea oferă ​posibilitatea ​ușoară ​de a crește ​rapid numărul ​de obiecte din scenădacă obiectele sunt identice. Ex: copaci, tile-uri de teren, ​unități într-un rts, etc.
  
-Pentru a lucra cu suprafete ​de translatierotatie si/sau interpolare vom folosi ​instantiereTotusi, chiar daca avem N instante ​de geometrie generator, nu avem topologia ​necesara ​pentru a lega instantele, deoarece generatorul este o curba (topologie 2D), iar suprafata generata necesita ​topologie 3D.+Pentru a lucra cu suprafețe ​de translațierotație și/sau interpolarevom folosi ​instanțiereTotuși, chiar dacă avem N instanțe ​de geometrie generator, nu avem topologia ​necesară ​pentru a lega instanțele, deoarece generatorul este o curbă ​(topologie 2D), iar suprafața generată necesită ​topologie 3D.
  
 {{ :​spg:​laboratoare:​poza_suprafete.png?​nolink |}} {{ :​spg:​laboratoare:​poza_suprafete.png?​nolink |}}
  
-Din figura ​se observa ​clar cum avem mai multe tipuri de obiecte: +Din figură ​se observă ​clar cum avem mai multe tipuri de obiecte: 
-- obiectul ​generator (prima linie neagra ​din stanga+  Obiectul ​generator (prima linie neagră ​din stânga
-- obiectul ​nou generat(2 ​instante ​ale generatorului ​si topologie de legatura intre linii) +  Obiectul ​nou generat (2 instanțe ​ale generatorului ​și topologie de legatură între ​linii) 
-- suprafata finala generata+  Suprafața finală generată
  
-Daca nu am fi folosit acest proces atunci prin instantiere ​am fi obtinut ​liniile ​instantiate ​dar nu si topologia de legatura intre linii, ​adica exact ca in urmatoarea ​imagine:+Dacă nu am fi folosit acest procesatunci prin instanțiere ​am fi obținut ​liniile ​instanțiate, ​dar nu și topologia de legatură între ​linii, ​adică ​exact ca în următoarea ​imagine:
  
 {{ :​spg:​laboratoare:​poza_curbe.png?​nolink |}} {{ :​spg:​laboratoare:​poza_curbe.png?​nolink |}}
  
-====Suprafete ​de translatie====+===== Suprafețe ​de translație =====
  
-suprafata ​de translatie ​este o suprafata generata ​prin instantierea ​unui obiect generator. Fiecare ​instanta ​a generatorului ​sufera ​o transformare de translatie. O suprafata ​de translatie ​poate fi definita ​prin instantierea ​unui generator cu fiecare ​instanta translatata ​progresiv dupa o functie.+suprafață ​de translație ​este o suprafață generată ​prin instanțierea ​unui obiect generator. Fiecare ​instanță ​a generatorului ​suferă ​o transformare de translație. O suprafață ​de translație ​poate fi definită ​prin instanțierea ​unui generator cu fiecare ​instanță translatată ​progresiv dupa o funcție.
  
-Un exemplu de suprafata translatata ​este+Un exemplu de suprafață translatată ​este:
  
 {{ :​spg:​laboratoare:​suprafata_translatie.png?​nolink |}} {{ :​spg:​laboratoare:​suprafata_translatie.png?​nolink |}}
  
-====Suprafete ​de rotatie====+===== Suprafețe ​de rotație =====
  
-suprafata ​de rotatie ​este o suprafata generata ​prin instantierea ​unui obiect generator. Fiecare ​instanta ​a generatorului ​sufera ​o transformare de rotatie. Aceasta poate fi definita ​prin instantierea ​unui generator cu fiecare ​instanta rotita ​progresiv dupa o functie.+suprafață ​de rotație ​este o suprafață generată ​prin instanțierea ​unui obiect generator. Fiecare ​instanță ​a generatorului ​suferă ​o transformare de rotație. Aceasta poate fi definită ​prin instanțierea ​unui generator cu fiecare ​instanță rotită ​progresiv dupa o funcție.
  
 {{ :​spg:​laboratoare:​suprafata_rotatie.png?​nolink |}} {{ :​spg:​laboratoare:​suprafata_rotatie.png?​nolink |}}
  
-====Curbe ​si suprafete ​de forma libera====+===== Curbe și suprafețe ​de formă liberă =====
  
-Curbele ​si suprafatele ​de forma libera ​sunt generate ​plecand ​de la niste puncte de control ​si generand ​alte puncte pe baza acestor puncte de control care apoi sunt legate prin topologie pentru a crea suprafataExista ​mai multe tipuri de curbe de control: Hermite, Bezier, etc. Daca folosim ​cate curba de control pentru fiecare dimensiune ​obtinem ​metode de generare de suprafete ​(petice), de volume sau de forme multidimensionale. ​In acest laborator vom lucra cu o curba de control Bezier, dar vom descrie pe scurt si un petic Bezier.+Curbele ​și suprafețele ​de formă liberă ​sunt generate ​plecând ​de la niște ​puncte de control ​și generând ​alte puncte pe baza acestor puncte de controlcare apoi sunt legate prin topologie pentru a crea suprafațaExistă ​mai multe tipuri de curbe de control: Hermite, Bezier, etc. Dacă folosim ​câte curbă ​de control pentru fiecare dimensiune, obținem ​metode de generare de suprafețe ​(petice), de volume sau de forme multidimensionale. ​În acest laborator vom lucra cu o curba de control Bezier, dar vom descrie pe scurt și un petic Bezier.
  
-Formal, o curba Bezier este construita ​pe baza a N puncte, numite puncte de control. ​Ecuatia ​unui punct generat, pe baza acestor puncte de control este:+Formal, o curbă ​Bezier este construită ​pe baza a N puncte, numite puncte de control. ​Ecuația ​unui punct generat, pe baza acestor puncte de controleste:
  
 {{ :​spg:​laboratoare:​formula bezier 1.png?​nolink |}} {{ :​spg:​laboratoare:​formula bezier 1.png?​nolink |}}
  
-Unde B(t) este noul punct generat iar t reprezinta distanta parametrica intre primul punct de control ​si ultimul punct de control.+Unde B(t) este noul punct generatiar t reprezint distanța parametrică între ​primul punct de control ​și ultimul punct de control.
  
-In cazul comun in care N = 4, ecuatia ​devine:+În cazul comun, în care N = 4, ecuația ​devine:
  
 {{ :​spg:​laboratoare:​formula bezier 2.png?​nolink |}} {{ :​spg:​laboratoare:​formula bezier 2.png?​nolink |}}
  
-O reprezentare ​vizuala ​a procesului de generare de puncte pe baza punctelor de control:+O reprezentare ​vizuală ​a procesului de generare de puncte pe baza punctelor de control:
  
 {{ :​spg:​laboratoare:​bezier.png?​nolink |}} {{ :​spg:​laboratoare:​bezier.png?​nolink |}}
  
-unde punctele albe sunt punctele de control iar punctele ​rosii sunt cele generate. +unde punctele albe sunt punctele de controliar punctele ​roșii ​sunt cele generate. 
-Procesul poate fi extins cu usurinta ​la 2 dimensiuni prin utilizarea unei petic Bezier. ​In cazul particular dar comun al unui petic cu 16 puncte (4x4) acesta poate arata astfel:+ 
 +Procesul poate fi extins cu ușurință ​la 2 dimensiuni prin utilizarea unei petic Bezier. ​În cazul particulardar comun al unui petic cu 16 puncte (4x4)acesta poate arăta ​astfel:
  
 {{ :​spg:​laboratoare:​bezier_suprafata.png?​nolink |}} {{ :​spg:​laboratoare:​bezier_suprafata.png?​nolink |}}
- 
-===Ce inseamna de fapt, din punct de vedere geometric, o curba Bezier? === 
-In imaginea alaturata putem observa cum toate segementele P0P1, P1P2, P2P3, A1A2, A2A3 si B1B2 sunt taiate la un t% predefinit. Acesta este t-ul din ecuatia de interpolare liniara. Astfel A1 este interpolarea liniara intre P0 si P1, A2 intre P1 si P2, B1 intre A2 si A1, samd. Punctul final C este rezultatul acestui sir de interpolari. Daca as avea N segmente de control, procesul de determinare al punctului de pe curba ar include N-1 + N-2 + N-3 + …. +2+ 1 interpolari. Acelasi proces este aplicabil pentru toate familiile de curbe, singurele diferente fiind ca nu se mai interpoleaza doar dupa pozitie, adica operatia de interpolare este mai complicata (include tangente, directii, unghiuri, etc). 
  
 <​hidden>​ <​hidden>​
 +===Ce inseamnă, de fapt, din punct de vedere geometric, o curbă Bezier? ===
 +În imaginea alaturată putem observa cum toate segementele P0P1, P1P2, P2P3, A1A2, A2A3 si B1B2 sunt taiate la un t% predefinit. Acesta este t-ul din ecuatia de interpolare liniara. Astfel A1 este interpolarea liniara intre P0 si P1, A2 intre P1 si P2, B1 intre A2 si A1, samd. Punctul final C este rezultatul acestui sir de interpolari. Daca as avea N segmente de control, procesul de determinare al punctului de pe curba ar include N-1 + N-2 + N-3 + …. +2+ 1 interpolari. Acelasi proces este aplicabil pentru toate familiile de curbe, singurele diferente fiind ca nu se mai interpoleaza doar dupa pozitie, adica operatia de interpolare este mai complicata (include tangente, directii, unghiuri, etc).
 +
 +{{ :​spg:​laboratoare:​capture.png?​nolink&​800 |}}
 +
 ? ?
 {{ :​spg:​laboratoare:​bezier_explicatii.png?​nolink |}} {{ :​spg:​laboratoare:​bezier_explicatii.png?​nolink |}}
Line 95: Line 98:
  
  
-==== Cerinte ​laborator ====+===== Cerințe ​laborator ====
  
-  -Descarcati ​[[https://​github.com/​UPB-Graphics/​SPG-Framework/​archive/​master.zip|framework-ul de laborator]] +  - Descărcați ​[[https://​github.com/​UPB-Graphics/​gfx-framework|framework-ul de laborator]] 
-  * In laborator geometria suport pentru ​curba este deja definitaExista doua tipuri de instantieri+  * În laboratorgeometria suport pentru ​curbă ​este deja definităExistă două tipuri de instanțieri
-      * instantierea implicitafacuta ​cu comanda glDrawElementsInstanced,​ care este deja implementata si care genereaza ​geometria suport de N ori +      * Instanțierea implicităfacută ​cu comanda glDrawElementsInstanced,​ care este deja implementată și care generează ​geometria suport de N ori 
-      * instantierea explicita, care va fi implementata in geometry shader. +      * Instanțierea explicită, care va fi implementată în geometry shader. 
-      * Geometria suport ​trimisa catre shader este o linie, ce leaga primul ​si ultimul punct de control. Punctele de control sunt accesabile ​in geometry shader sub numele control_p1, control_p2, control_p3, control_p4.  +  * Geometria suport ​trimisă către ​shader este o linie, ce leagă ​primul ​și ultimul punct de control. Punctele de control sunt accesabile ​în geometry shader sub numele control_p1, control_p2, control_p3, control_p4.  
-  - Geometria suport va fi in primul ​rand folosita ​pentru a genera o curba de tip Bezier. Pentru acest lucru se vor genera de mana in geometry shader mai multe puncte (no_of_generated_points) pentru care se va evalua curba Bezier. +  - Trimiteți către shader numărul de puncte generate pe o curbă bezier (no_of_generated_points) și controlați de la tastatură atât acest număr (no_of_generated_points),​ cât și numărul de instanțe (no_of_instances)
-  - Se vor genera ​instante ​deplasate ale curbei bezier folosind ​translatii ​sau rotatii +  - Geometria suport va fi în primul ​rând folosită ​pentru a genera o curbă ​de tip Bezier. Pentru acest lucru se vor genera de mână în geometry shader mai multe puncte (no_of_generated_points) pentru care se va evalua curba Bezier. 
-  - Pentru ​doua curbe adiacente, se vor genera triunghiuri,​ ce vor lega geometria ​generata ​instantiei ​curente de geometria ​generata ​instantei urmatoare genrata ​prin translatie ​sau rotatie ​(practic se vor lega cate 2 triunghiuri pentru fiecare 2 puncte corespondente de pe 2 curbe - vedeti ​figura de mai jos). Astfel, ​plecand ​de la curbe Bezier se va crea o suprafata.+  - Se vor genera ​instanțe ​deplasate ale curbei bezier folosind ​translații ​sau rotații 
 +  - Pentru ​două curbe adiacente, se vor genera triunghiuri,​ ce vor lega geometria ​generată ​instanței ​curente de geometria ​generată ​instanței următoare, generată ​prin translație ​sau rotație ​(practic se vor lega cate 2 triunghiuri pentru fiecare 2 puncte corespondente de pe 2 curbe - vedeți ​figura de mai jos). Astfel, ​plecând ​de la curbe Bezierse va crea o suprafață. Modificați output-ul GeometryShader-ului astfel încât să trimita mai departe triangle_strip pentru a procesa corect triunghiurile.
  
 {{ :​spg:​laboratoare:​triunghiuri_curbe.png |}} {{ :​spg:​laboratoare:​triunghiuri_curbe.png |}}
  
spg/laboratoare/02.1602826744.txt.gz · Last modified: 2020/10/16 08:39 by alexandru.gradinaru
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