This is an old revision of the document!


Laboratorul 02

Suprafete generate

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:

  • un generator, adica o geometrie explicit definita pe baza careia are loc procesul de generare
  • 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.

Diferite tipuri de instantiere

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:

Suprafete de translatie

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

Suprafete de rotatie

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.

Curbe si suprafete de forma libera

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:

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).

Cerinte laborator

  • In laborator geometria suport pentru curba este deja definita. Exista doua tipuri de instantieri:
    • instantierea implicita, facuta cu comanda glDrawElementsInstanced, care este deja implementata si care genereaza geometria suport de N ori
    • instantierea explicita, care va fi implementata in 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.
  1. 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.
  2. Se vor genera instante deplasate ale curbei bezier folosind translatii sau rotatii
  3. Pentru doua curbe adiacente, se vor genera triunghiuri, ce va 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). Astfel, plecand de la curbe Bezier se va crea o suprafata.
spg/laboratoare/02.1602826086.txt.gz · Last modified: 2020/10/16 08:28 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