You are on page 1of 26

Odreivanje take na Bzier-ovoj krivoj: De Casteljau-ov algoritam

Jednostavan nain reavanja problema odreivanja take C(u) na Bzier-ovoj krivoj za neko u je zamena u u jednaini krive, ali ovaj nain je numeriki nestabilan - dolazi do greke pri raunanju Bernstein-ovih polinoma. Oznaimo kontrolne take na sledei nain: P0 sa 00, P1 sa 01, ... , Pi sa 0i, ... , Pn sa 0n, gde prva cifra oznaava broj iteracije (ovde je 0, a kasnije e biti 1,2,3 itd.). Osnovna ideja de Casteljau-ovog algoritma je izbor take C na dui AB takve da C deli du AB u odnosu u:1-u. Kako se u kree od 0 do 1, taka C data sa A + u(B - A) = (1 - u)A + uB jeste taka dui AB koja je deli u traenom odnosu.

De Casteljau-ov algoritam:
Pretpostavimo da elimo da odredimo taku C(u), gde je u u intervalu [0,1]. Poinjemo od poligonalne linije 00-01-02-03-...-0n i koristei prethodnu formulu nalazimo taku 1i koja deli du odreenu takama 0i i 0(i+1) u odnosu u:1-u. Na ovaj nain dobijamo n taaka 10, 11, 12, ...., 1(n-1) koje definiu novu poligonalnu liniju sastavljenu od n - 1 dui. Primenjujui prethodni postupak na novu poligonalnu liniju dobijamo i drugu liniju od n - 1 taaka 20, 21, ... , 2(n-2) i n - 2 dui. Ponavljajui ovaj proces n puta, dobijamo jednu taku n0. De Casteljau je dokazao da je upravo to taka C(u) na krivoj koja odgovara u.

Primer: Na slici je predstavljena kriva 5. stepena. Odredimo za u=0.4 take 10 na dui 00-01, 11 na dui 01-02, ... , i 14 na 04-05, takve da dele odgovarajue dui u odnosu 0.4 : 0.6, tj. 2:3. Neka je 20 taka koja u zadatom odnosu deli du 10-11. Slino, izaberimo taku 21 na dui 11-12, 22 na dui 12-13 i 23 na 13-14. Tako smo dobili i treu poligonalnu liniju

odreenu takama 20, 21, 22 i 23. Ova linija ima 4 temena i 3 dui. Nastavljajui ovaj postupak dobiemo poligonalnu liniju sa tri temena 30, 31 i 32. Iz etvrte poligonalne linije dobijamo petu sa dve take 40 i 41. Poslednja iteracija daje teme 50 koje odgovara taki C(0.4) na krivoj.

Implementacija
Uzimajui u obzir prethodno izloenu interpretaciju de Casteljau-ovog algoritma, izraunavanje se vri po principu prikazanom na slici:

Prvo, sve kontrolne take rasporedimo u kolonu. Iz poetne kolone 0 izraunavamo kolonu 1; iz kolone 1 dobijamo kolonu 2 i tako dalje. Konano, nakon n iteracija dobijamo jednu taku n0 i to je traena taka krive. Naredni algoritam sumira prethodnu diskusiju. Kao ulazne podatke uzima niz P od n+1 kontrolne take i u izmeu 0 i 1, a vraa taku na Bzier-ovoj krivoj C(u). Ulaz: niz P[0:n] od n+1 taaka i realni broj u iz [0,1] Izlaz: taka na krivoj, C(u) Pomone promenljive: niz taaka Q[0:n]
for i := 0 to n do Q[i] := P[i]; // save input for k := 1 to n do for i := 0 to n - k do Q[i] := (1 - u)Q[i] + u Q[i + 1]; return Q[0];

Rekurzija
Prethodno izraunavanje moe se izvriti rekurzivno. Stavimo da P0,j budu kontrolne take Pj, za j = 0, 1, ..., n, tj. P0,j je j-ti lan u koloni 0. Na sledei nain raunamo j u koloni i:

Preciznije, vrednost Pi,j je zbir (1-u)Pi-1,j (gore levo) i uPi-1,j+1 (dole levo). Krajnji rezultat (i.e., taka na krivoj) je Pn,0. Koristei ovu ideju, formiramo rekurzivnu proceduru:
function deCasteljau(i,j) begin if i = 0 then return P0,j else return (1-u)*deCasteljau(i-1,j) + u*deCasteljau(i-1,j+1) end

Iako procedura deluje jednostavno i kratko, veoma je neefikasna. Da bi izraunali Pn,0, pozivamo funkciju deCasteljau(n,0), a ona se u else delu poziva jo dva puta. Problem je u tome to se skoro sve funkcije za raunanje Pi,j pozivaju vie od jednom.

Koliko je to loe? Sloenost ovog izraunavanja istovetna je sloenosti izraunavanja n-tog lana Fibonacci-jevog niza.
function Fibonacci(n) begin if n = 0 or n = 1 then return 1 else return Fibonacci(n-1) + Fibonacci(n-2) end

Broj poziva funkcije Fibonacci(n) eksponencijalno raste! Zbog toga, rekurzivna verzija Casteljau-ovog algoritma nije pogodna za direktnu implementaciju! konstrukcija krivih ... pomeranje kontrolnih taaka ... odreivanje take na krivoj ... podela krive na dva dela ... poveavanje stepena kriv

Konstrukcija Bzier-ovih krivih


Neka su P0,P1,P2, ...,Pn take u ravni. Bzier-ova krive stepena n definisana ovim kontrolnim takama Pi je

gde su koeficijenti Bn,i(u) Bernstein-ovi polinomi definisani sa:

Osnovna svojstva Bzier-ovih krivih: 1. Stepen Bzier-ove krive definisane sa n+1 kontrolnih taaka je n: U svakoj baznoj funkciji stepen od u je i + (n - i) = n. Stoga, stepen krive je n. 2. C(u) prolazi kroz take P0 i Pn: Jednostavnim raunom moe sa proveriti da kriva prolazi kroz prvu i poslednju kontrolnu taku.

3. Nenegativnost: Primetimo da se u nalazi u intervalu [0,1], pa su sve bazne funkcije nenegativne. 4. Svojstvo konveksnog omotaa: Bzier-ova kriva odreena sa datih n + 1 kontrolnih taaka lei unutar konveksnog omotaa tih taaka. Na slici je prikazana Bzier-ova kriva 10. stepena, a konveksni omota njenih 11 kontrolnih taaka oznaen je sivom

bojom. itava kriva lei unutar konveksnog omotaa, osim dve krajnje take koje su na rubu.

5. Svojstvo manje varijacije: Za krivu u ravni, ovo svojstvo znai da ni jedna prava ne preseca Bzier-ovu krivu vie puta nego to see kontrolnu poligonalnu liniju.

Na slici, uta linija preseca krivu 3 puta i poligonalnu liniju 7 puta; zelena linija see kkrivu 5, a poligonalnu liniju 7 puta; a plava linija ima po dve presene take i sa krivom i sa poligonalnom linijom. Ovo svojstvo nam govori da je kontrolna poligonalna linija kompleksnija od krive koju odreuje. Naime, poligonalna linija se ee uvre i skree, nego to je to sluaj sa Bzier-ovom krivom. 6. Afina invarijantnost: Rezultat primene afinih transformacija na Bzier-ovu krivu je kriva koja moe biti konstruisana na osnovu slika kontrolnih taaka pri zadatim transformacijama. Dakle, kada elimo da primenimo afine transformacije na Bzier-ovu krivu, jednostavno ih primenimo na kontrolne take (to je znatno lake), a traenu krivu formiramo na osnovu novih, izmenjenih kontrolnih taaka.

ta ako u nije definisano na [0,1]?


U sluaju da je domen Bzier-ove krive [a,b], potrebno je izvriti smenu promenljive u na sledei nain:

Nova promenljiva u definisana je na intervalu [0,1] i njenom zamenom u baznim funkcijama Bn,i(u) dobijamo:

Nove bazne funkcije definiu Bzier-ovu krivu na intervalu [a,b].

konstrukcija krivih ... pomeranje kontrolnih taaka ... odreivanje take na


krivoj ... podela krive na dva dela ... poveava

Pomeranje kontrolnih taaka


Kako promena pozicija kontrolnih taaka utie na promenu oblika njima definisane Bzier-ove krive? Pretpostavimo da je kontrolna taka Pk pomerena na novu poziciju Pk + v, gde vektor v odreuje i pravac i duinu pomeranja:

Poetna Bzier-ova kriva je oblika:

Kako je nova kriva odreena takama P0, P1,..., Pk+v,..., Pn, njena jednaina D(u) je:

Kako samo k-ti sabirak koristi razliitu kontrolnu taku Pk + v, posle sreivanja izraza, dobijamo da se nova kriva predstavlja kao zbir poetne krive i dodatnog lana Bn,k(u)v. Dakle: Taka u na novoj krivoj dobijena je translacijom odgovarajue take u na poetnoj krivoj u pravcu v na rastojanju |Bn,k(u)v| Preciznije, za dato u, imamo taku C(u) na poetnoj, taku D(u) na novoj krivoj i D(u) = C(u) + Bn,k(u)v. Kako v odreuje pravac pomeranja, D(u) je rezultat pomeranja take C(u) u tom istom pravcu. Duina pomeraja je, naravno, intenzitet vektora Bn,k(u)v, pa kada Bn,k(u) dostie maksimum, promena iz C(u) u D(u) je najvea. Na slici su date Bzier-ove krive 8. stepena definisane sa 9 kontrolnih taaka. Poetna kriva oznaena je crnom bojom. Ako pomerimo kontrolnu taku 3 na novu poziciju, crna kriva se menja u crvenu. Na svakoj krivoj oznaena je taka koja odgovara vrednosti parametra u=0.5. Pomeranje take C(0.5) u taku D(0.5) vri se u istom pravcu kao pomeranje kontrolne take na novu poziciju.

Kako je Bn,k(u) razliito od nule na otvorenom intervalu (0,1), Bn,k(u)v nije nula vektor na (0,1). Ovo znai da se, osim krajnjih taaka C(0) i C(1), sve take poetne krive pomeraju na nove pozicije. Promena pozicija kontrolnih taaka menja oblik Bzier-ove krive globalno. konstrukcija krivih ... pomeranje kontrolnih taaka ... odreivanje take na krivoj ... podela krive na dva dela ... poveavanje

Podela Bzier-ove krive


Smisao podele krive je da "iseemo" datu Bzier-ovu krivu u taki C(u), za neko u, na dva dela, od kojih je svaki i dalje Bzier-ova kriva. Rezultujue Bzier-ove krive moraju da imaju svoje kontrolne take, tako da se poetni skup kontrolnih taaka odbacuje. tavie, poto se poetna kriva stepena n deli na dve krive, od kojih je svaka podskup poetne n-dimenzione Bzier-ove krive, i rezultujue krive moraju biti n-tog stepena. Problem je sledei: Za dati skup n + 1 kontrolnih taaka P0, P1, P2,..., Pn i parametar u vrednosti izmeu 0 i 1, traimo dva skupa sa n+1 kontrolnih taaka Q0, Q1, Q2,..., Qn i R0, R1, R2,..., Rn takvih da Bzier-ova kriva definisana pomou Qi (odnosno Ri) je deo poetne Bzierove krive na [0,u] (odnosno [u,1]). Algoritam je krajnje jednostavan i zasniva se na de Casteljau-ovom algoritmu za izraunavanje take C(u) na krivoj. Na levoj slici predstavljen je de Casteljau-ov algoritam za izraunavanje C(u), a na desnoj podela krive u taki C(u) i njihove odgovarajue poligonalne linije.

Ako paljivo uporedimo ove dve slike, uoiemo da se leva poligonalna linija sastoji iz taaka P00 = P0, P10, P20, P30, P40, P50 i P60 = C(u), dok je desna poligonalna linija

odreena takama P60 = C(u), P51, P42, P33, P24, P15 i P06 = P6. Na narednim slikama prikazan je nain izbora ovih kontrolnih taaka.

Za dato u, potrebno je n iteracija da se izrauna C(u). U procesu raunanja, moemo pamtiti prvu i poslednju taku u svakoj koloni i na kraju skup prvih (odnosno poslednjih) taaka odreuje deo poetne krive definisan na [0,u] (odnosno [u,1]). Stoga, u sledeoj trougaonoj shemi gornja ivica u pravcu strelica i donja ivica u suprotnom pravcu odreuju kontrolne take prve i druge podeone krive respektivno.

Primetimo da je du odreena takama 50 i 51 tangenta na krivu u taki 60, pa je poslednja du poligonalne linije leve krive (npr. od take 50 do take 60) je tangenta na levu krivu, a du poligonalne linije desne krive (npr. izmeu taaka 60 i 51) je tangenta na desnu krivu.

Zbog ega je potrebna podela Bzier-ove krive?


Podela krive ima veliki broj primena. Na primer, moe se koristiti za odreivanje preseka dve Bzier-ove krive, renderovanje Bzier-ove krive, a olakava dizajn krivih. Pretpostavimo da smo formirali krivu koja nam ne odgovara sasvim. U tom sluaju, moemo je u odgovarajuoj taki podeliti na dva dela - zadovoljavajui i

nezadovoljavajui. Tada se moemo fokusirati na promenu samo neodgovarajueg dela. Krivu moemo deliti proizvoljan broj puta, ali treba imati na umu da, ako elimo da se podeoni segmenti krive glatko spajaju, granine take i njihove dve susedne take moraju biti kolinearne. konstrukcija krivih ... pomeranje kontrolnih taaka ... odreivanje take na krivoj ... podela krive na dva dela ... poveavanje step

Poveavanje stepena Bzier-ove krive


Mnoge aplikacije koje koriste dve i vie Bzier-ovih krivih zahtevaju da sve krive budu istog stepena. tavie, iako Bzier-ove krive vieg stepena zahtevaju vie vremena za obradu, one su pogodnije za dizajniranje razliitih oblika. Stoga bi bilo od velike pomoi da se povisi stepen Bzier-ovih krivih bez promene njihovog oblika. Primetimo da je "ne menjanje oblika krive" kljuni zahtev; u suprotnom, poveavanje stepena Bzier-ove krive ne bi imalo praktinog smisla. Pretpostavimo da imamo Bzier-ovu krivu stepena n odreenu sa n + 1 kontrolnih taaka P0, P1, P2,..., Pn i da elimo da povisimo njen stepen za 1 bez promene njenog oblika. Kako je Bzier-ova kriva (n + 1). stepena definisana sa n + 2 kontrolne take, potrebno je da naemo takav novi skup kontrolnih taaka. Oigledno, take P0 i Pn moraju pripadati novom skupu jer kriva prolazi kroz njih. Stoga, potrebno je izraunati samo n novih taaka. Neka je Q0, Q1, Q2,..., Qn+1 novi skup kontrolnih taaka. Tada je Q0 = P0 i Qn+1 = Pn, a ostale take se odreuju po sledeoj formuli:

Svaka du poetne poligonalne linije sadri tano jednu novu kontrolnu taku. Preciznije, du Pi-1Pi sadri novu kontrolnu taku Qi. Iz formule za raunanje novih kontrolnih taaka, vidimo da Qi deli du Pi-1Pi u odnosu 1 - i/(n+1):i/(n+1). Za razliku od de Casteljau-ovog algoritma, ovaj odnos nije konstantan, ve zavisi od vrednosti i. Ipak, raun je veoma slian onom iz de Casteljau-ovog algoritma. Kada dobijemo skup kontrolnih taaka, poetni skup moe biti odbaen. Kako svaka du poetne poligonalne linije sadri novu kontrolnu taku, proces zamene starog skupa novim moe se posmatrati kao odsecanje uglova u poetnim kontrolnim takama. Sledea slika ilustruje ovaj efekat odsecanja uglova. Na njoj je prikazana Bzier-ova kriva 4. stepena, ije su kontrolne take oznaene crvenim kvadratima, a

kontrolna poligonalna linija plavom isprekidanom linijom. U levoj tabeli prikazan je odnos na svakoj dui poetne poligonalne linije. i 1 - i/(n+1) 1 2 3 4 0.8 0.6 0.4 0.2

Primetimo da se stepen krive moe poveavati dok god to sistem dozvoljava, pri emu se sa poveanjem broja kontrolnih taaka poligonalna linija pribliava krivoj. Na sledeim slikama predstavljeno je poveanje stepena poetne krive 6. stepena sa 7 kontrolnih taaka na 7, 8, 10, 15 i 29. Kao to se moe primetiti sa slika, oblik krive ostaje nepromenjen sa poveanjem stepena, ali se poligonalna linija sve vie probliava krivoj.

konstrukcija krivih ... pomeranje kontrolnih taaka ... odreivanje take na krivoj ... podela krive na dva dela ... poveavanje stepena krive ... Bzier-ov

Programi za sjenanje geometrije


Model programa za sjenanje geometrije je prvi put predstavljen kao dio Unificiranog modela programa za sjenanje (engl. Unified Shader Model) u DirectX-u 10. Nvidia GeForce 8800 grafiki procesori su bili prvi koji su imali sklopovsku podrku za izvoenje ovih programa. U OpenGL standard su ukljueni od verzije 3.2, a iz prijanjih verzija im se moe pristupati pomoi EXT_geometry_shader4 ekstenzije. Za razliku od ostalih programa za sjenanje, programi za sjenanje geometrije su opcionalni. Izvravaju se poslije programa za sjenanje vrhova, a prije programa za sjenanje fragmenata. Zbog toga, ako postoji potreba da se radi na vrhovima koji nisu ve projekcijski transformirani, onda se i izraunavanje transformacija mora prebaciti u njih, i ukloniti iz programa za sjenanje vrhova.

Pojednostavljeni prikaz cjevovoda u unificiranom modelu programa za sjenanje.

Osnovna namjena programa za sjenanje geometrije je stvaranje novih grafikih primitiva ili uklanjanje ve postojeih. Standardne primitive koje moe primati su

toka, linija i trokut, uz mogunost i prosljeivanja informacija o neposrednom susjedstvu. Unificirani model programa za sjenanje, poznat i pod nazivom model 4.0, koristi dosljedan skup instrukcija za sve tipove programa. Takoer, svi tipovi programa imaju gotovo iste mogunosti: itanje iz tekstura, meuspremnika podataka i obavljanje istog skupa aritmetikih instrukcija. Meutim, skup instrukcija nije identian izmeu razliitih tipova. Na primjer, samo programi za sjenanje fragmenata mogu itati teksture s implicitnim koordinatama, samo programi za sjenanje geometrije mogu emitirati dodatne primitive itd. Raniji modeli 1.x su koristili potpuno razliite instrukcije za programe za sjenanje vrhova i fragmenata, dok se sa kasnijim verzijama (2.x i 3.0) razlika sve vie smanjivala, pribliavajui se tako sadanjem unificiranom modelu. Kada grafiko sklopovlje podrava unificirani model, onda je obino dizajnirano tako da procesorske jedinice za izvravanje programa za sjenanje mogu izvoditi bilo koji tip programa. Takva arhitektura se naziva unificirana arhitektura (engl. Unified Shader Architecture), te ima veliku prednost u brzini izvoenja nad sklopovljem koje ne implementira unificiranu arhitekturu. Prednost dolazi od mogunosti dinamikog organiziranja i balansiranja optereenja izmeu procesorskih jedinica. Na primjer, ako imamo nekoliko prolaza koji koriste samo programe za sjenanje vrhova i fragmenata, tada moemo svim procesorskim jedinicama dodijeliti odreene zadae, iskoritavajui tako sve dostupne resurse, dok bi u sluaju zasebnih arhitektura dio procesorskih jedinica za izvoenje programa za sjenanje geometrije ostao besposlen. Dobar primjer su takoer scene koje su iznimno zahtjevne za jednu vrstu programa, dok su ostali trivijalni, pa se u skladu tome rasporeuje broj jedinica koje rade na kojim vrstama programa. Unato tome, sklopovlje ne mora nuno implementirati unificiranu arhitekturu da bi moglo podravati unificirani model programa za sjenanje i obrnuto.

Ogranienja i mogunosti programa za sjenanje geometrije


Prvo i najznaajnije ogranienje programa za sjenanje geometrije je relativno nizak broj primitiva koje se mogu generirati. U prvim generacijama grafikih kartica koje su to podravale, taj broj je, ovisno o tipu izlaznih primitiva, bio vrlo nizak, ponegdje ak i ispod 64. No napretkom sklopovlja koritenog u grafikim karticama, danas oni iznose nekoliko tisua. Na primjer, grafika kartica GeForce 9400M na kojoj je izraen ovaj rad, ima mogunost generiranja do maksimalno 1024 izlazna trokuta za svaki ulazni trokut. Ta vrijednost za druge primitive moe rasti ili padati u ovisnosti o tipu primitiva. Ako je izlazna primitiva tipa traka trokuta (engl. triangle strip), njihov maksimalan broj opada na 128, dok za toku maksimalan broj raste na 4096. Uzrok tome je ograniena koliina memorije u meuspremniku koja se moe proslijediti dalje, te zbog toga broj maksimalnih primitiva ovisi o tome koliko memorije koji tip primitive zauzima. Sljedei problem je nedostupnost informacija o ostatku modela te o netom generiranoj geometriji. Naime, predvieni nain prosljeivanja informacija o susjedima za bilo

koji tip primitive je ogranien samo na neposredne susjede, a i tada mi moramo u programu generirati i proslijediti tu informaciju. Tako neto esto zahtjeva ili mijenjanje naina uitavanja i prikazivanja modela u memoriji, ili dinamiko generiranje informacija o susjednim vrhovima, to moe usporiti program, a i stavlja vie optereenja na procesor. Takoer, do informacija o novonastaloj geometriji ne moemo doi do idueg prolaza. Zbog ovih gore navedenih razloga, implementacija metode koju predlae Fleischer u svom radu (Fleischer et al, 1995) bi bila prekompleksna i neefikasna. Prvenstveno zbog potrebe da stanica ima informacije o svim svojim susjednim stanicama i njihovom trenutanom stupnju i nainu razvoja, a potom i zbog kompleksnosti novonastale geometrije. Iako su se unato ovim problemima programi za sjenanje geometrije uz neke pomone i zaobilazne metode koristili za vrlo irok raspon problema, uvoenje novih vrsta programa za sjenanje i teselaciju u DirectX-u 11 eliminira potrebu koritenja programa za sjenanje geometrije kao programa ija je primarna namjena generiranje nove geometrije. Ovime se problem generiranja nove geometrije prebacuje na programe za sjenanje ljuske (engl. hull shaders), programe za sjenanje podruja (engl. domain shaders) i programe za teselaciju (engl. tesselator). U tom sluaju najei tip uporabe programa za sjenanje geometrije nee biti generiranje, ve uklanjanje geometrije za npr. mijenjanje razine detalja prikaza. Generiranje geometrije u programima za sjenanje geometrije e biti ogranieno na specifine primjene za koje nisu potrebne dodatne informacije, poput generiranja tokastih sliica (engl. point sprite).

Konceptualni prikaz Direct3D 11 cjevovoda.

Primjena programa za sjenanje geometrije


Zbog generikog skupa instrukcija koji je dio unificiranog modela, nain moguih primjena programa za sjenanje geometrije je vrlo raznolik i protee se u rangu od osnovnih problema poput razine detalja prikaza do egzotinih primjena koje nemaju nuno veze sa samom grafikom poput modeliranja ponaanja nekih likova unutar igre. Dobar primjer je demo koji je napravio ATI za HD 4800 seriju kartica, naziva Froblins, u kojem ogromnim brojem froblina koji kopaju kamen, nose ga i spremaju, jedu kada nau gljive i na kraju kad se umore odlaze na spavanje, upravljaju programi za sjenanje geometrije. No mi emo ovdje ukratko opisati samo najbitnije primjene programa za sjenanje geometrije.

Razina detalja prikaza


U raunalnoj grafici, ovaj pojam podrazumijeva mijenjanje kompleksnosti prikaza trodimenzionalnih objekata u ovisnosti o udaljenosti od toke gledita, vanosti objekta, brzini ili o nekom drugom parametru. Koristi se da pobolja performanse prikaza smanjujui optereenje grafikog sklopovlja, ponajprije onog zaduenog za transformaciju vrhova. Smanjena kvaliteta modela se esto ne primjeuje zbog puno manjeg utjecaja objekta na izgled scene kad je udaljen ili se brzo kree. Iako se u veini sluajeva primjenjuje samo na geometriju, ova tehnika se moe generalizirati. Nedavno su se poele implementirati i tehnike za upravljanje programima za sjenanje fragmenata kontrolirajui kompleksnost prikaza.

Odbacivanje po projekcijskom volumenu


Odbacivanje po projekcijskom volumenu (engl. frustum-culling) koristi injenicu da su svi poligoni izvan projekcionog volumena nevidljivi, tj. ono to kamera trenutno ne gleda, nije potrebno iscrtavati, te se ti poligoni odbace u programu za sjenanje geometrije, stvarajui tako manje posla za programe za sjenanje fragmenata. esto se zna dogoditi da neki objekt lei na granici volumena. Takvi objekti se podijele na dijelove du te granice, te se tada odbacuju samo oni dijelovi koji su van granica.

Preslikavanje s kocke u jednom prolazu


Osnovna ideja prilikom preslikavanja s kocke u jednom prolazu je da programu za sjenanje geometrije proslijedimo est matrica projekcije, i za svaku primitivu modela koji prikazujemo, generiramo est drugih primitiva koje su projicirane svaka na svoju stranu kocke.

Ovim nainom izbjegli smo potrebu esterostrukog prolaza kroz scenu, koji je dosad bio uobiajeni nain preslikavanja s kocke, a samim time i smanjili broj poziva API funkcija est puta. Postoje optimizacije gore navedenog algoritma, koje ga jo dodatno ubrzavaju koristei instanciranje geometrije, no postupak u osnovi ostaje isti.

Implementacija
Kao demonstraciju navedenih tehnika i mogunosti primjene programa za sjenanje geometrije, za potrebe ovog rada implementirana su dva programa. Kao osnovno polazite su izabrane metode koje predlae Fleischer u svom radu (Fleischer et al, 1995), uz modifikacije koje su uzimale u obzir ogranienja programa za sjenanje geometrije, te potrebu da se program izvodi u realnom vremenu. Za razliku od predloenih metoda, koje samo za generiranje potrebne geometrije trebaju od od nekoliko sekundi pa do nekoliko sati, ovisno o tipu stanica, metode razvijene za potrebu ovog rada moraju generirati i izraunati projekciju cijele scene unutar 40100ms. Zbog toga je kompleksnost nove stanine geometrije koja se generira za zadani model smanjena na razinu koja omoguava izvoenje u realnom vremenu na dananjem grafikom sklopovlju.

Generiranje bodlji
Originalna ideja je vrlo jednostavna, izabrati sluajne nakupine trokuta na povrini modela kojima susjedi nemaju ve generirane bodlje, te za svaku od njih izvriti program koji simulira rast bodlji sa odreenim parametrima. Prva bitnija promjena koja je napravljena s obzirom na originalnu zamisao je da se ne izabiru pojedine primitive za koje se program izvrava, ve se izvrava za sve primitive. Razlog tomu je da dohvaanje informacije o susjedima i ve generiranoj geometriji u tom prolazu kroz scenu zahtjeva znaajnije promjene u samom uitavanju i prikazu modela u memoriji, te implementaciju programa za sjenanje geometrije koja podrava povratnu vezu transformacija (engl. transform feedback) to nadilazi okvire ovog rada. Druga znaajna promjena je u generiranju teksture za novu geometriju. Dok se u originalnoj metodi boja pojedinih vrhova generira ovisno o parametrima i proteklom vremenu simulacije ponaanja stanica, ovdje se uzima modifikacija Worleyeve metode generiranja staninih tekstura. Dakle, na generiranu Worleyevu teksturu, dodajemo ili oduzimamo dodatni intenzitet koji ovisi o udaljenosti ostalih vrhova poetnog poligona od vrha bodlje. Da bi se naglasila razlika, izabiremo boju koja je razliita od boje koritene za prvobitno generiranu teksturu.

Originalni model iscrtan bez dodatnih programa za sjenanje geometrije. Kugla je teksturirana obinom Worleyevom teksturom:

Isti model sa ukljuenim programima za sjenanje geometrije:

Generiranje dlake
Originalni Fleischerov prijedlog postupka pomou kojeg se generira dlaka se razlikuje od ostalih postupaka samo u programima koji se koriste za simulaciju rasta stanica. Razlika je ponovno u tome da se rast novih stanica ne simulira izvodei programe koji oponaaju ponaanje stanice, ve da se cijela stanica generira u jednom prolazu. Poto je u ovom sluaju stanica oblika linije, kao zamjenu sam izabrao Bezierove krivulje. Bezierove krivulje su odabrane jer iako nisu raunski prezahtjevne, jo uvijek omoguavaju prilino fleksibilno modeliranje krivulje, to nam pomae u postizanju prirodnog izgleda zakrivljene dlake.

Bezierove krivulje

Bezierove krivulje su parametarske krivulje koje se esto koriste u raunalnoj grafici i ostalim srodnim poljima raunalnih znanosti. Generalizacija Bezierovih krivulja na vie dimenzije su Bezierove povrine. U vektorskoj grafici, Bezierove krivulje se koriste za modeliranje glatkih krivulja kojima moemo proizvoljno mijenjati veliinu. esto se koriste i u vremenskoj domeni, naroito za animacije i dizajniranje suelja. Na primjer, Bezierova krivulja se moe koristiti da odredi brzinu objekta u razliitim trenucima u vremenu, to kao posljedicu ima rezultat prirodnijeg gibanja pri micanju objekta s jednog mjesta na drugo, nego da samo postavimo brzinu na fiksni iznos. Popularizirao ih je 1962. francuski ininjer Pierre Bezier, koji ih je koristio za dizajniranje automobila. Razvijene su 1959. kada je Paul de Casteljau pronaao Casteljauov algoritam koji je rekurzivnom metodom izraunavao vrijednosti polinoma u Bernsteinovom obliku. Iako je algoritam sporiji nego izravni pristup, numeriki je stabilniji.

Kubina Bezierova krivulja


Za potrebe ovog programa, izabrana je kubina Bezierova krivulja. etiri kontrolne toke P0, P1, P2 i P3 u ravnini ili trodimenzionalnom prostoru definiraju kubinu Bezierovu krivulju. Krivulja poinje iz toke P0 ide prema toki P1 i dospijeva do P3 iz smjera P2. Obino, ne prolazi kroz toke P1 i P2; ove toke su jedino za odreivanje smjera. Udaljenost izmeu P0 i P1 odreuje koliko dugo se krivulja kree prema toki P2 prije nego skrene prema toki P3.

Implementacija u GLSL-u
Funkcije za izraunavanje krivulje implementirane su kao dio programa za sjenanja geometrije, jer za svaku ulaznu primitivu moramo generirati jednu ili vie Bezierovih krivulja. Postupak je podijeljen u tri logike cjeline. Prva je implementirana u funkciji evaluateBezierPosition koja kao parametre prima etverodimenzionalni vektor koordinata kontrolnih toaka v i vrijeme t, a vraa koordinate izraunate toke. Sama implementacija funkcije je sljedea: Druga funkcija koju smo implementirali je funkcija za raunanje tangente u odreenoj toci Bezierove krivulje. Naziv funkcije je evaluateBezierTangent, prima iste parametre kao evaluateBezierPosition, a vraa vektor tangente. Raunanje vektora smjera tangente je jednostavno raunanje prve derivacije: Zadnja funkcija je emit_bezier koja dijeli krivulju na eljeni broj segmenata, u ovom sluaju 8, i potom alje segmente funkciji za transformaciju koja ih proslijeuje programu za sjenanje fragmenata. Parametri koje prima su kontrolne toke. Na sljedeim slikama moemo vidjeti usporedbu rezultata sa samo pokrenutim programom koji uitava i iscrtava model, i identinog programa sa ukljuenim programima za sjenanje.

Glavni program
Zbog odreenih zahtjeva ovog dijela rada u odnosu na dio koji se bavio samo programima za sjenanje vrhova i fragmenata, za ovaj dio je napravljen zaseban i puno kompleksniji glavni program. Takoer, implementirana je mogunost uitavanja Milkshape3D modela. Kako ovaj program sadri mnogo veu koliinu koda, nastala je potreba da ga se napravi u duhu objektno orijentiranog programiranja zbog lakeg snalaenja. Druga bitnija razlika je da je ovaj program implementiran koristei samo Win32 API i nativne OpenGL 3.2 funkcije, dakle uklonili smo potrebu za zastarjelim GLUT i GLEW bibliotekama, te ARB ekstenzijama. Dijagram razreda projekta:

Razred Model implementiran je kao apstraktni razred, to nam olakava posao ako budemo imali potrebu dodavati uitavanje razliitih tipova modela. Ako elimo napraviti nekoliko prolazaka kroz scenu sa razliitim programima za sjenanje, samo trebamo napraviti eljeni broj instanci razreda Shader i svakoj doznaiti eljene programe. Isto tako, razred Shader se lako moe nadograditi da prihvaa nove tipove programa za sjenanje, poput programa za sjenanje ljuske i povrine koji su dio novog modela 5.0. Jedine potekoe su bile rezultat toga da je OpenGL suelje zamrznuto na verziju 1.1 na svim verzijama Windowsa, i standardne .h i .lib datoteke koje dolaze sa Microsoftovim prevoditeljima nisu aurirane od 1995. Rjeenje je koritenje novih glext.h, wglext.h i gl3.h zaglavnih datoteka koje se mogu nai na slubenoj stranici OpenGL-a, a definiraju sve nove simbole i funkcije. Potom da bi

pristupili novim OpenGL funkcijama, moramo deklarirati pokazivae na te funkcije na sljedei nain:
#include <GL/gl.h> #include <GL/glext.h> #include <GL/wglext.h> extern PFNGLACTIVETEXTUREPROC glActiveTexture; PFNGLACTIVETEXTUREPROC glActiveTexture;

Te potom dohvatiti pokazivae na funkcije pomou wglGetProcAddress funkcije:


glActiveTexture = (PFNGLACTIVETEXTUREPROC) wglGetProcAddress("glActiveTexture");

2010. Josip Marievi | Design by andreasviklund.com

Pixel "na tri naina"


Pixel je rije iz informatikog rjenika i jedna od najprisutnijih u svakodnevnom govoru, a moe se koristiti u razliitim kontekstima.

to je zapravo pixell?
Pixel (picture element) je najmanji dio prikaza slike na ekranu s kojim se moe manipulirati. Svaki je pixel oznaen svojom adresom - koja zapravo predstavlja njegov toni poloaj u reetki pixela koja ini prikaz na vaem ekranu. Ukoliko se govori o pixelu u kontekstu ispisa ili fotografije - tada je on najmanji gradivni element svakog ispisa. Finoa detalja to ih neki ureaj ili fotografija moe prikazati naziva se razluivou.

Iako in nije u meunarodnom sustavu (SI) jedinica, u nastavku e se koristiti in kao referentna mjerna jedinica duljine i to zato jer se u svim uputama za koritenje i specifikacijama elektronikih ureaja moemo susresti upravo s ovom mjernom jedinicom. (Jedan in=2,54 cm).

Pixel i monitor
Razluivost monitora (tj. finoa detalja to ih on moe prikazati) iskazuje se u ukupnom broju pixela to ih je on u stanju prikazati u liniji koja je debela samo jedan pixel. Izbroje li se pixeli u toj liniji, i to za jednu takvu horizontalnu liniju i jednu vertikalnu moe se generirati sljedei izraz: broj pixela u horizontali x broj pixela u vertikali. Kad se to zapie brojem, za neki monitor e se dobiti npr. izraz: 1024x768. Ovaj izraz znai da imamo monitor koji neku sliku moe prikazati sa ukupno 1024 pixela horizontalno i 768 pixela vertikalno. to su ovi brojevi vei (naravno za istu veliinu monitora) to je detaljnost prikaza (razluivost) monitora vea. Problem sa ovakvim iskazivanjem razluivosti pojavi se kad se uzme u obzir da postoje monitori razliitih veliina. Jasno je da nikako nije isto prikazati sliku u razluivosti 1024X768 pixela na monitoru irine npr. 1 metar i monitoru irine 10 centimetara. Naime, ako 1024 toaka morate nanizati jednu do druge u jednu liniju, a istovremeno vam je njezina duljina tono odreena (odreuju ju fizike dimenzije monitora) tada e se te toke morati smanjiti ili poveati da bi se mogla popuniti linija. Ako je linija horizontale ekrana duga 10 cm morat e se smanjiti dimenzija toaka ako ih se npr. u tu liniju eli smjestiti 1024. Ukoliko pak duljina horizontale iznosi 1m, tada e se morati poveati dimenzija toakaako ih u tu duljinu mora stati npr. tono 1024. (ista stvar vrijedi i za popunjavanje vertikalne duljine monitora). Poveanje toaka zapravo e naruiti razluivost monitora. Prethodno reeno zapravo znai da iskazivanje razluivosti na nain ukupnog broja toaka (pixela) nije najpouzdanije, jer sa istom rezluivou moe poveavanjem monitora dobiti loija slika. Zato je puno pouzdaniji nain izraavanja razluivosti onaj preko gustoe pixela. Ako npr. monitor ima razluivost od 85 PPI (pixels per inch), tada je podatak puno upotrebljiviji od onog 1024X768. Podatak o gustoi pixela potpuno je neovisan o veliini monitora na kojem e se prikazivati slika. Koliko god monitor imao ina, podatak od 85 PPI jasno govori da e on po jednom svom inu (priblino 2, 54 cm) prikazati 85 pixela. Razluivost dananjih monitora, izraena u gustoi pixela, kree se od 67-130 PPI, i naravno raste.

Pixel i printer

Kvaliteta printera esto se izraava prikazujui koliko toaka (pixela) printer moe isprintati na jednom inchu. Zamislite da pixele niete poput perli na konac, jedan do drugogUkoliko bi ovaj posao umjesto vas radio printer koji bi umjesto nizanja perli na konac, nizao toke na papir, eljeli biste da na jedan inch u jednoj liniju uspije stisnuti to vie toaka (pixela). Zato? Zato jer bi to znailo da e u tom jednom inu moi prikazati vie detalja. Dobar laserski printer moi e na jedan inu stisnuti i do 1200 toaka (razluivost 1200 DPI) - to znai i da bi se na ispisu neeg to ste gledali na monitoru mogli pronai detalji koji se tamo nisu vidjeli. Ukoliko je naime razluivost monitora 85 DPI, a gledate fotografiju vrlo visoke kvalitete, koju zatim isprintate na printeru koji printa do razluivosti od ak 1200 DPI - printer e prikazati detalje koje monitor nije mogao (jer njegova razluivost viestruko nadilazi onu monitora).

Pixel i fotografija
Pria sa pixelima u fotografiji vrlo je slina onoj o monitorima. U fotografiji pixel ponovno oznaava razluivost, ali se zna i koristiti kao mjera veliine neke fotografije. Ukoliko oznaava razluivost, tada se pixelima slino kao i kod monitora pokazuje kvaliteta fotografije Naprimjer, 12 megapixelna fotografija je fotografija visoke razluivosti, do veliine od 12 megapiksela dolo se mnoenjem broja pixela u horizontali i veritkali (npr .4000 pixela x 3000 pixela, u standardnom 4x3 formatu). I u ovoj prii se susreemo sa problemom poveanja. Naime ukoliko bi fotografiju razvili na format jumbo plakata, tada bi se ponovno morala poveati veliina toaka, u odnosu na fotografiju dimenzija npr. 9x13 cm, jer se i u jednu i u drugu horizontalnu dimenziju smjeta tono 4000 toaka. Ovo poveanje pixela oitovalo bi se kao "zrnatost" na plakatu. Zbog toga se pri printanju fotografija koristi gustoa pixela od 300 DPI - jer ona predstavlja zadovoljavajuu kvalitetu ispisa. Ovime je na neki nain u vezu dovedena kvaliteta i veliina fotografija. Naime, ukoliko se eli isprintati neka fotografija na format papira veliine A4, u rezoluciji 300 DPI, fotografija mora imati razluivost od 6 mega pixela. Ovakvi razmjeri postoje za sve dimenzije fotografija. Jednostavan nain za odreivanje koju fotografiju moete razviti do koje maksimalne veliine je da njezine dimenzije izraene u pixelima podijelite sa 300. Na ovaj e se nain dobiti njezina maksimalna veliina u inima (npr., ako obje dimenzije fotografije u razluivosti 1504x1000 podijelimo sa 300, zakljuit emo da ju moemo razviti do dimenzije: 5x3,3 ina tj. 12,7x8,3 cm).

You might also like