[ Reljam @ 21.10.2003. 08:14 ] @
Da bi malo pokrenuo diskusiju na forumu, napravio sam jedan mali primer. Radi se o high dynamic range osvetljenju, znaci specijalnim efektima vezanim za zasicenje prilikom velikog osvetljenja. Da ne bih suvise objasnjavao, evo par slika - mada ovo izgleda mnogo bolje uzivo.

Za pocetak, najobicniji cajnik, sa obicnim diffuse + specular osvetljenjem. Intenzitet stvetla je 1.0:


http://reljam.no-ip.com/files/teapotA.jpg

Medjutim, sta se desava ako pojacamo to svetlo? Sa standardnim modelom osvetljenja, rezultat bi bio samo malo vise belih trouglova. Medjutim, ovako dobijamo sledece (ovo je sa intenzitetom od 2.13):


http://reljam.no-ip.com/files/teapotB.jpg

Ovde ima jos jedan efekat, a to je afterimage koji se desava kada se vrlo jako svetlo "uprzi" na kameru. Ovaj screen shot ne izgleda toliko impresivno ovde, ali zato je afterimage efekat mnogo ocigledniji kada se startuje program. Da bih lakse uhvatio afterimage u jednom staticnom kadru, podigao sam inteniztet svetla na 3.65, sto je prilicno velika vrednost:


http://reljam.no-ip.com/files/teapotC.jpg

Ideja je u startu bila da se napise modul koji bi bio sto jednostavniji za koriscenje. Evo kako mozete da ugradite ovaj efekat u vas postojaci program:

Code:
... u render loopu ...

Bloom.PreRender();

// Ovde iscrtate sve sto bi ste inace iscrtali

Bloom.PostRender();

// i to je to!


Ovaj kod zahteva hardver koji podrzava PS 2.0 - to je trenutno ATI 9000 serija i GeForce FX. Ja sam ovo probao na mom Radeonu 9700, i radi kako treba, ali nazalost nemam FX pri ruci. Ako neko ima, bilo bi lepo da proba i da mi kaze da li radi.

Nemam vremena da veceras zakacim exe, ali cu zato to uraditi sutra, i to sa kompletnim sorsom.
[ Mrav @ 21.10.2003. 12:34 ] @
Da li si koristio rad Paul Debevec-a (po kojem postoji fin demo na ATI sajtu), opiĊĦi nam malo konkretnije kako si ovo izveo, koje tehnike su u pitanju i sl.
[ Reljam @ 21.10.2003. 18:15 ] @
Postoji nekoliko primera HDRLa, ali ono sto me je nerviralo kod svih njih je to sto HDRL u stvari moze da se ubaci u bilo koj 3D program skoro bez izmena, a ni jedan primer to ne omogucava. Znaci hocu nesto sto bi radilo kao plugin, a ovo radi bas tako.

Sama ideja je, kao skoro i sve ostalo u 3Du, vrlo jednostavna: izrenderejes celu scenu u 64-bitnu floating point teksturu (A16R16G16B16F), primenis high pass filter koji odstranjuje piksele koji nisu dovoljno svetli, zatim taj rezultat malo blurujes, i onda to nacrtas preko originalne scene sa blend modom SRC_ONE DEST_ONE. Opcionalno mozes i da tu blurovanu teksturu zapamtis, i da u sledecem frejmu novu teskturu lerpujes ka staroj, i time se dobija efekat razmazivanja i przenja. Jedini mali trik je izabrati kolicinu lerpovanja, ja sam izabrao
Code:
min (duzinaPrethodnogFrejmaUSekundama * 2, 1)

u praksi to znaci da afterimage ostaje vidljiv pola sekunde nakon sto se svetlo pomeri - a i naravno radi nezavisno od broja frejmova u sekundi.

Znaci, grubo gledano, u originalnoj sceni (cajnik + ambient + diffuse + specular) postoje dve vrste piksela: obicni pikseli, i pikseli koji prouzrokuju sjaj (glow). U drugom passu se renderuje sam sjaj. E sad, prvo sam hteo da pikseli koji imaju intenzitet boje veci od 2.0f prave sjaj, ali problem sa tim je to sto bi onda morao da "odvrnem" svetlo suvise jako, i razultat nije bio toliko lep. Hteo sam neki drugi nacin da oznacim sjajne piksele a da to ne utice na njihovu boju. Izabrao sam da koristim alpha kanal, koji ionako nicemu ne sluzi na obicnom render targetu. Tako da je pravilo sledece: svi pikseli koji imaju alfu od 0 do 1 ne sijaju, a oni koji su preko 1 sijaju sa intenzitetom (alpha - 1). Time se dobija efekat da ukoliko korisnik izrenda postojacu scenu, nece dobiti sjaj preko celog ekrana, vec moze selektivno da oznacava koji pikseli / trouglovi / objekti treba da svetle.

U stvari, cela stvar se koristi vrlo slicno glow efektu u 3D Studio-u: izrendas postojace objekte sa viskom alfom (ili u slucaju 3DSa, sa odredjenim IDem), i dobijes glow u post processingu.

Obecanje i dalje vazi, cim dodjem kuci zakacicu sors + exe.
[ Reljam @ 22.10.2003. 08:06 ] @
Exe: http://reljam.no-ip.com/Files/Bloom/BloomExe.zip
Evo i sorsa: http://reljam.no-ip.com/Files/Bloom/BloomSource.zip

Program zahteva PS2.0, i ne trudi se preterano da lepo radi ukoliko hardverski zahtevi nisu zadovoljeni. Nazalost, nemam vremena to da sredjujem, ali zato sam bloom plugin lepo radi. Jedno malo poboljsanje bi da ga prebacim da koristi SetTechnique(D3DXHANDLE), ali to sada i nije toliko bitno.