This shows you the differences between two versions of the page.
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ție, translaț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 rotatie, translatie 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 generata. Dupa 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 grafica. Aceasta 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 scena, daca 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 translatie, rotatie si/sau interpolare vom folosi instantiere. Totusi, 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ție, rotație și/sau interpolare, vom folosi instanțiere. Totuș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 proces, atunci 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 ===== |
- | O 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. | + | O 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 ===== |
- | O 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. | + | O 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 suprafata. Exista mai multe tipuri de curbe de control: Hermite, Bezier, etc. Daca folosim cate o 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 control, care apoi sunt legate prin topologie pentru a crea suprafața. Există mai multe tipuri de curbe de control: Hermite, Bezier, etc. Dacă folosim câte o 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 control, este: |
{{ :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 generat, iar 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 control, iar 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 particular, dar 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 definita. Exista doua tipuri de instantieri: | + | * În laborator, geometria suport pentru curbă este deja definită. Există două tipuri de instanțieri: |
- | * instantierea implicita, facuta 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 a instantiei curente de geometria generata a 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ă a instanței curente de geometria generată a 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 Bezier, se 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 |}} | ||