You are on page 1of 2

INSIDER MICROSOFTOV DirectX

DirectX

Particles (partikli)
Jeste li se ikada vozili svemirskim brodom? Jeste li taj svemirski brod slupali u bezbroj malenih komadia sudarivi se s kiom meteora? E, taj krajnji rezultat sudara nazivamo particles (partiklima)
pie: Ivica Hoko

efinicija partikla na prvi pogled izgleda jednostavno, no u stvarnosti ima puno filozofiranja oko njih. Partikli nam predstavljaju sitne estice koje nalazimo u prirodi - praina, estice dima, estice vode, ahure od metaka i sline prirodne pojave. U raunalnoj se grafici koriste za sve objekte koji su dovoljno maleni ili dovoljno uestali da ih se moe iscrtavati na odreeni nain. S obzirom na to da su partikli prilino apstraktan pojam, postoji nekoliko trikova koji su nam od velike koristi kod crtanja partikla u realnomu vremenu. Prvo i osnovno svojstvo jest da u veini sluajeva moemo rabiti jednostavne poligone koji su uvijek orijentirani prema kameri. Kao, recimo, kulise koje se uvijek okreu tako da budu orijentirane prema vama. Dakle, uzmu se dva poligona, spoje se u pravokutnik, nalijepi se tekstura i samo se rotira ovisno o kameri; princip koji se koristio, recimo, u starim igrama za crtanje vegetacije (ako se sjeate starih simulacija vonje automobila u kojima je svako drvo zapravo bilo "kartonsko", bez volumena).

Razliiti modeli partikla: Mogunosti partikla su ogromne i ograniene iskljuivo vaom matom. odnosno pravokutnike sastavljene od dva trokuta. Nakon toga eka vas malo ''spolnih odnoaja'' s matricama, vektorima i matematikom openito (kako biste postigli da se poligoni dobro orijentiraju prema vama, skaliraju itd.), no kad tu sitnicu prebrodite, na konju ste. Dakle, s obzirom na to da je rije o poligonima koje sami radite, moete sami i kontrolirati teksturne koordinate, odnosno moete si uzeti hrpu malenih tekstura i zalijepiti ih na jednu veliku, to recimo kod point spriteova nema puno smisla. Znai, moete crtati partikle s razliitim teksturama u istom naletu, samo pratite teksturne koordinate kako se mijenjaju. I sada kree veselje: moete si animirati neki efekt i samo posloiti sliice jednu iza druge te na taj nain dobiti fluidne animacije gotovo bilo ega. Jednako tako, moete cijelu stvar strpati na volumnu teksturu pa kombinirati izmeu raznih slojeva volumne kako biste dobili fluidniju animaciju. Moete isto tako rabiti vie tekstura koje se preklapaju i u kombinaciji daju brutalne efekte primjerice jednu "obinu" teksturu i jednu koja e vam posluiti samo da biste pomaknuli piksele s prve teksture u nekoj eljenoj pseudosluajnoj maniri. Takoer, moete samo ''pucati'' partikle na neku sekundarnu povrinu te ih iskoristiti naknadno kako biste savinuli piksele s izvornog ekrana i dobili efekt koji podsjea na vrui zrak. Moete i... OK, kod teksturiranja imamo dva osnovna principa i jako puno podvarijanti. No, kako dobiti uope same partikle? Dakle, svaki partikl ima svoja nekakva svojstva, recimo trenutanu poziciju, brzinu, smjer, vrijeme nastanka i vrijeme ivota. U praksi se

Point sprite i quadovi


Kod lijepljenja teksture razlikujemo pak dvije najee koritene metode. Prvu predstavlja point sprite, metoda koju DirectX podrava ve godinama kao opciju za partikle. U principu postavite D3D-u eljenu veliinu partikla koji se crtaju, postavite teksturu koju elite i samo poaljete toke u prostoru na koje elite nalijepiti partikle. Ono to se dogaa nakon toga, moe se protumaiti ovako: D3D uzme poloaje koje ste mu poslali u 3D prostoru te na svaku toku jednostavno zalijepi cijelu teksturu, samo to je smanji na veliinu koju ste mu oznaili. Dakle, nemate posla s poligonima, rotacijama, ''iama'', ve samo rukujete s tokama. Prilino jednostavno i prilino ogranieno. Druga metoda je da runo napravite quadove,

Svjetlosni efekti u svemiru:


Upotrebom partikla mogu se postii fenomenalni efekti koji e igri dati neopisivu ivost. Najea upotreba partikla je za raznorazne eksplozije i zvjezdana polja. No to je tek dio moi partikla. Na slici se mogu vidjeti i efekti koritenja oruja te plamenovi iz motora svemirskih brodova.

Point sprite metoda


m_pd3dDevice->SetRenderState(D3DRS_POINTSPRITEENABLE, true); // ukljuimo point spriteove m_pd3dDevice->SetRenderState(D3DRS_POINTSCALEENABLE, true); // ukljuimo njihovo skaliranje

156

VIDI br. 128 / 2006

WWW.VIDI.HR

MICROSOFTOV DirectX INSIDER


ova svojstva grupiraju pomou klasa ili struktura te predstavljaju jedan partikl. Jednako tako, u praksi partikli rijetko kada ive sami - odnosno postoje njihovi tzv. emiteri, rodilita za nove partikle. Primjerice, zakaite emiter za ventilator svojega procesora i samo mu definirate da generira nove partikle bijelog dima; dodijeli im smjer, brzinu (i to vam je ve bitno) te ih poalje u ivot. Na ovaj nain napravljena struktura uvelike e vam olakati ivot. Kontrola je bitna jer nakon to poaljete partikl u ivot, on postaje samostalan i uvjetno reeno nevezan za emiter; dakle ako pomaknete procesor, to nee uzrokovati da se pomakne i dim koji je tamo ve bio. No uvjetovat e nastajanje novog dima na novoj lokaciji. Dakle, morate kontrolirati svaki partikl zasebno te, k tome, jo i njihova roditelja. Procesor vas odjednom gleda ispod oka i ima srednji prst spreman za akciju. Uzmimo u obzir i da mi generiramo nove poligone za svaki novi partikl te da moramo na neki nain postojeim poligonima mijenjati poziciju u prostoru i teksturne koordinate. Generiranje hrpe poligona i konstantno slanje te hrpe grafikoj kartici moglo bi se pokazati kao problem. Osim to poligone u pravilu kreira procesor, on ih isto tako i osvjeava novim informacijama. Dakle, mogu je problem oko konstantnog prebacivanja podataka u grafiku memoriju; ovaj dio elite optimu te zatim niz pozicija (ili ega god ve) u drugome. Grafika kartica zatim uzme model iz prvog niza i koristi konstantno jedan te isti model. Rezultat: puno iscrtanih modela sa samo jednim drawprimitive pozivom, dakle u jednom naletu samo jedan model u grafikoj memoriji proiren s neto sitno dodatnih vrijednosti koje aljete. Simpatino je i to da po specifikacijama DX-a vaa grafika mora podravati shadere 3.0 kako bi mogla instancirati objekte, no to nije istina.

Problemi sa z-bufferom
Maleni problem bi vam mogao predstavljati i z-buffer. Dakle, imamo hrpu poligona koji se rotiraju i to na relativno malenoj povrini; vjerojatnost da e se njihovi poloaji preklapati je znaajna. Nadalje, partikli se mahom koriste i alfom kako bi se postigli bolji Kao na filmskom platnu: Partikli su puno pripomogli u stvaranju realnih efekata u igrama. efekti. Ako nacrtamo poligon u z-buffer, on automatski skrije sve poligone koji se nalaze ponaanja partikla i njihovom interakcijom ili ete iza njega. Ukoliko je na poligon poluproziran ili zaglibiti s poveim shaderom i hrpom parametara proziran, imamo problem. Ukoliko iskljuimo z- kojima ga morate hraniti. Ali i ovom se metodom buffer, partikli e nam kao poligoni prolaziti kroz mogu dobiti krajnje impresivni rezultati te ona sve na to naiu i nee izgledati lijepo Moemo definitivno predstavlja opciju koju treba razmotriti. Partikli dolaze u cijeloj paleti razliitih ''okusa'': dodue iskljuiti pisanje u z-buffer kod crtanja partikla, a ostaviti testiranje naspram z-buffera, no u kao maleni modeli, kao poligoni koji su orijentirani ovom sluaju se moe dogoditi da nam se poligoni prema vama, kao poligoni koji nisu orijentirani koji se inae nalaze dalje od oka iscrtavaju ispred prema vama, kao obine toke u prostoru - oni ovih bliih - zato to jednostavno nemaju informa- mogu biti u interakciji s okolinom, no i ne moraju cije o dubini na kojoj se nalaze ''kolege''. Ovo se moe rijeiti ili dobro dizajniranim sustavom partikla ili sortiranjem partikla prema udaljenosti od oka. U svakom sluaju vam ne gine malo eksperimentiranja i testiranja Bilo je i pokuaja da se partikli naprave u potpunosti preko shadera. Dakle, da shaderi preuzmu ulogu procesora to se tie pomicanja i osvjeavanja partikla. Osim to su shaderi brutalno sposobniji za takve kalkulacije, sve skupa se nalazi u grafikoj Vatromet: Efekt sastavljen od niza malih partikla-zvjezdica. memoriji te nema prebacivanja podataka lijevodesno, kreiranja buffera u realnom vremenu i mogu posluiti i samo kao ukras, ali mogu imati i slinih stvari. Maleni problem je fleksibilnost cijele bitne funkcije. Obzirom da se s partiklima moe stvari: ili ete zaglibiti s rudimentarnim modelom doista puno, posvetit emo i sljedei broj DX Insidera istoj temi, ali u poneto detaljnijem izdanju.

Eksplozivni cvijet: Partiklima dima i vatre stvorena eksplozija.

mizirati koliko je god to mogue. Jedna od metoda jest skucati sve partikle u jedan jedini vertex buffer (ukoliko je to mogue) te taj buffer oznaiti kao dinamiki i, recimo, samo za pisanje (D3DUSAGE_DYNAMIC; D3DUSAGE_WRITEONLY) kako biste objasnili grafikoj kartici da se ne zamara puno validacijom memorije, kopiranjem sadraja u sistemsku memoriju, internim validacijama i ''iama'', nego da jednostavno pretpostavi kako e taj komadiak memorije biti brutalno ''silovan'' u skoroj budunosti. Ukoliko ste sloili dobar format za vertekse ne bi trebalo biti problema; verteksi su redovito maleni po veliini (recimo 10.000 partikla predstavlja 10.000 x 6 verteksa po partiklu x 32 bytea po vertexu = 1.8 MB, dakle gotovo veliina prosjene teksture). Druga bi pak metoda bila da imate ve napravljen niz poligona koji sjedi u grafikoj kartici a vi samo proslijedite niz pozicija te u vertex shaderu samo pomiete svaki poligon na mjesto koje ste odredili. Ovome slina metoda jest i instanciranje. Princip instanciranja je da grafikoj kartici poaljete model koji elite iscrtati u jednom strea- Velika eksplozija: Prekrasan efekt eksplozije s partiklima i za komade svemirskog broda.
WWW.VIDILAB.COM

DirectX serijal
Grafika za sve - Vidi 117

Direct X files - Vidi 118


Materijali i teksture - Vidi 119 Povratak tekstura... - Vidi 120

Textures strike back! - Vidi 121 Shaderi - Vidi 122


Elementi igara 1 - Vidi 123 U poetku Bog stvori zemlju i... - Vidi 124 Satavilo se nebo sa zemljom - Vidi 125/126 O nebu, horizontu, magli i svemiru - Vidi 127

VIDI br. 128 / 2006

157

You might also like