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 suprafata generata are:
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.
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).
Pentru a instantia implict geometrie exista comanda:
glDrawElementsInstanced(topologie, nr_indecsi, tip_data, offset, instante).
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:
glDrawElementsInstanced(GL_TRIANGLES, 99, GL_UNSIGNED_INT,0,1540);
Instantierea explicita se face in shader, generand geometrie noua prin comenzi glsl, in acest caz prin comenzi de geometry shader:
gl_Position = P*V *M* vec4(p1, 1); EmitVertex(); gl_Position = P*V *M* vec4(p2, 1); EmitVertex(); gl_Position = P*V *M* vec4(p3, 1); EmitVertex(); EndPrimitive();
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.
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.
Din figura se observa clar cum avem mai multe tipuri de obiecte: - obiectul generator (prima linie neagra din stanga) - obiectul nou generat(2 instante ale generatorului si topologie de legatura intre linii) - suprafata finala generata
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:
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.
Un exemplu de suprafata translatata este
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.
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.
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:
Unde B(t) este noul punct generat iar t reprezinta distanta parametrica intre primul punct de control si ultimul punct de control.
In cazul comun in care N = 4, ecuatia devine:
O reprezentare vizuala a procesului de generare de puncte pe baza punctelor de control:
unde punctele albe sunt punctele de control iar punctele rosii 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 (4×4) acesta poate arata astfel:
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).