Burek_fr0m_SPACE
22-06-2009, 20:36
Prije par sedmica sam naišao na neki članak o renderovanju terena baziranog na voxelima i odlučio sam se baciti na posao. Nisam bio sasvim siguran da li ću ga ciljati za neku real-time upotrebu ili offline renderovanje, ali sam počeo vodeći se nekim principima iz članka i sklepao sam nešto što je radilo relativno zadovoljavajuće, čak je moglo i proći kao real-time. Međutim, filtriranje me ubijalo - nisam pronašao neki dobar način da ugladim kocke blizu kamere koje su parale oči. Neke detail-teksture i bilo kakvi iole napredniji efekti nisu ni dolazili u obzir, bar ne bez potpunog re-writea. U svakom slučaju, nefleksibilnost tog rješenja me podstakla da se po prvi put okušam u raytracovanju/raymarchingu. I tako je nastala druga iteracija ovog programa na kojoj još po malo radim. Ideja je bila da isprobam sve moguće ideje za renderovanje koje su mi se već mjesecima motale po glavi, bez previše ganjanja performansi. Ovo je ujedno i jedan veliki disklejmer za ovaj projekat - sve sam radio po sopstvenom nahođenju, nisam imao nikakve reference. To je vjerovatno na kraju greška, jer će dalje poboljšavanje prikaza biti mnogo bolnije tako, ali eto, htio sam i da vidim koliko toga mogu sam zaključiti. Pa ću vas malo provesti kroz (vrlo neravnomjernu) istoriju projekta i neke njegove featurese :
http://www.imagesforme.com/out.php/i555237_pic1.jpg
Ovo je jedna od prvih slika koje sam narendao. Kod za to sam sklepao u par sati, pa me uspješno renderovanje za mene "škakljivom" metodom raymarchinga ohrabrilo da nastavim dalje s ovim. Ovdje još nije bilo ni filtriranja heightmape, pa su se izbliza takođe vidjele kockice, ali sam bar znao da se to da lako ispraviti. Osvjetljenje je bilo "zalijepljeno" na teksturu. Osnovna linearna magla i nebo.
http://www.imagesforme.com/out.php/i555258_pic2.jpg
Prva "kul" stvar koju sam uradio - refleksivna poluprovidna voda sa aproksimiranim Fresnel efektom (zavisnost odnosa refleksije i providnosti od ugla gledanja). 2 samplea po pixelu vode, ako se ne varam. Ovdje negdje sam uveo i prvi anti-aliasing. Bio je "pametan" i vršio se samo na rubnim pixelima, tj. gdje je postojao diskontinuitet u dubini scene. A radio se tako što su se castovala još 4 raya u rotated-grid rasporedu, te se blendali sa originalnim pixelom (da se ne baci), tako da je to bio neki "5xAA".
http://www.imagesforme.com/out.php/i555288_pic3.jpg
Ova slika je ustvari posljedica lošeg učitavanja lightmape, koja je zbog toga ispala pretamna, a tada sam nešto i nebo čačkao, zbog čega se to tako igrom slučaja uklopilo u prilično kul sliku koju sam odlučio zadržati :)
http://www.imagesforme.com/out.php/i555304_pic4.jpg
Tu sam negdje prešao na floating-point fame-buffer koji se kasnije mapirao na 8-bitni RGB iliti famozni HDR. Ekspozicija je, naravno, bila podesiva, a sklepao sam i neki auto-exposure. Tu sam negdje po prvi put dodao i sunce. Vrijeme renderovanja je stalno raslo, pa je postajalo sve napornije raditi na ovome. Nešto prije HDRa sam se okušao u animaciji. Neslavno je prošlo, jer sam tek u pokretu vidio koliko je stvar neprecizna - mnogo trepreranja, preskakanja, itd. Teren je još uvijek mutan, jer ga je pokrivala samo jedna tekstura. Kasnije će dobiti više proizvoljnih slojeva što je osjetno popravilo izgled.
http://www.imagesforme.com/out.php/i555325_pic5.jpg
To sunce sam onda htio nekuda i pomjeriti, tako da sam došao do onoga što sam dugo odgađao - bejkovanje sopstvenih lightmapa (do tada sam koristio gotovu). Ovo je jedna od prvih koje su nastale u mom programu. Zbog načina na koji to radi, implicitno sam imao soft sjene i ambient-occlusion. Koristio sam prilično "realne" metode, pa sam i dobijao prilično realne rezultate. Na ovoj slici i nije baš mnogo očito, jer koristi samo 4 samplea u rotated-gridu, poput AA rješenja. Kasnije sam dodao mogućnost unosa proizvoljnog broja sampleova koji su zatim bili nasumično raspoređeni, što je davalo mnogo bolje rezultate. 20 random sampleova + malo blura po Gaussu = odlična lightmapa. Nekada za to vrijeme se pojavio i blooming - kada već imam HDR, da ga upotrijebim. Pokušao sam simulirati neku difuziju svjetla po senzoru/filmu, što je davalo prilično ubjedljive rezultate, ali je bilo (i još jeste) odvratno sporo. Već na 640x480 bloom može trajati duže od renderovanja prvobitne slike. Nešto bih trebao s time uraditi, svakako.
http://www.imagesforme.com/out.php/i555354_pic6.jpg
I tako sam se dohvatio nečega što sam još od samog početka nekako potajno najviše priželjkivao - volumetrija. Ideja koju sam imao za to je iznenađujuće lako upalila, te sam dobio neke slike na koje sam u tim trenucima bio izuzetno ponosan. Jedna od tih je ova iznad. Na toj slici sam uvidio i da mi opako nedostaju sjene na vodi, što sam dodao u narednih 15-ak minuta. Vrijeme renderovanja je opet naraslo. Ne zbog same volumetrije, ona je praktično bila besplatna, već zato što sam morao povećati preciznost marchinga (smanjiti dužinu koraka), kako bi se preciznije premjerile putanje zrake kroz osvijetljeni i neosvijetljeni dio magle, inače bi se vidio vrlo ružan banding. Takođe, voda je dobila normal-mapu za talase. Na ovoj slici izgleda ok, ali je sve samo ne korektna.
http://www.imagesforme.com/out.php/i555374_pic7.jpgS http://www.imagesforme.com/out.php/i555375_pic8.jpg
Približismo se kraju, ovo su neke od posljednjih narenderovanih slika. Bejkovanje lightmapa je poboljšano, blooming je poboljšan (ali ne i ubrzan, nažalost). Dosta sam eksperimentisao sa različitim algoritmima za ekspoziciju i mapiranje u R8G8B8, ali nisam se još skrasio, tako da će to vidjeti još promjena. I magla je malo popravljena. Promjene postaju sve manje, dok neke fundamentalne stvari ostaju neriješene, zbog čega još uvijek neću objaviti ni binaryje, ni source. Hvala na razumijevanju.
http://www.imagesforme.com/out.php/i555389_pic9.jpg
I, da, evo ovako je program izgledao kada sam ga ja posljednji put vidio. Estetici su možda posvećene cijele tri sekunde. Većinom sam samo slagao nove dugmiće i polja za nove stvari koje sam implementirao, tako da sada sve više liči na Blender. Daleko manje funkcionalan i dosljedan, naravno. Svakako će doživiti reviziju interfesja prije bilo kakvog puštanja u javnost.
Sve u svemu, pisanje ovoga je bilo prilično uzbudljivo iskustvo i preporučujem isto svakome ko je vičan programiranju i voli grafiku. Nadam se da sam bar neke zainteresovao i potakao na razmišljanje. Dakle, šta mislite? Ima li ko sličnih iskustava? Konstruktivnih prijedloga?
http://www.imagesforme.com/out.php/i555237_pic1.jpg
Ovo je jedna od prvih slika koje sam narendao. Kod za to sam sklepao u par sati, pa me uspješno renderovanje za mene "škakljivom" metodom raymarchinga ohrabrilo da nastavim dalje s ovim. Ovdje još nije bilo ni filtriranja heightmape, pa su se izbliza takođe vidjele kockice, ali sam bar znao da se to da lako ispraviti. Osvjetljenje je bilo "zalijepljeno" na teksturu. Osnovna linearna magla i nebo.
http://www.imagesforme.com/out.php/i555258_pic2.jpg
Prva "kul" stvar koju sam uradio - refleksivna poluprovidna voda sa aproksimiranim Fresnel efektom (zavisnost odnosa refleksije i providnosti od ugla gledanja). 2 samplea po pixelu vode, ako se ne varam. Ovdje negdje sam uveo i prvi anti-aliasing. Bio je "pametan" i vršio se samo na rubnim pixelima, tj. gdje je postojao diskontinuitet u dubini scene. A radio se tako što su se castovala još 4 raya u rotated-grid rasporedu, te se blendali sa originalnim pixelom (da se ne baci), tako da je to bio neki "5xAA".
http://www.imagesforme.com/out.php/i555288_pic3.jpg
Ova slika je ustvari posljedica lošeg učitavanja lightmape, koja je zbog toga ispala pretamna, a tada sam nešto i nebo čačkao, zbog čega se to tako igrom slučaja uklopilo u prilično kul sliku koju sam odlučio zadržati :)
http://www.imagesforme.com/out.php/i555304_pic4.jpg
Tu sam negdje prešao na floating-point fame-buffer koji se kasnije mapirao na 8-bitni RGB iliti famozni HDR. Ekspozicija je, naravno, bila podesiva, a sklepao sam i neki auto-exposure. Tu sam negdje po prvi put dodao i sunce. Vrijeme renderovanja je stalno raslo, pa je postajalo sve napornije raditi na ovome. Nešto prije HDRa sam se okušao u animaciji. Neslavno je prošlo, jer sam tek u pokretu vidio koliko je stvar neprecizna - mnogo trepreranja, preskakanja, itd. Teren je još uvijek mutan, jer ga je pokrivala samo jedna tekstura. Kasnije će dobiti više proizvoljnih slojeva što je osjetno popravilo izgled.
http://www.imagesforme.com/out.php/i555325_pic5.jpg
To sunce sam onda htio nekuda i pomjeriti, tako da sam došao do onoga što sam dugo odgađao - bejkovanje sopstvenih lightmapa (do tada sam koristio gotovu). Ovo je jedna od prvih koje su nastale u mom programu. Zbog načina na koji to radi, implicitno sam imao soft sjene i ambient-occlusion. Koristio sam prilično "realne" metode, pa sam i dobijao prilično realne rezultate. Na ovoj slici i nije baš mnogo očito, jer koristi samo 4 samplea u rotated-gridu, poput AA rješenja. Kasnije sam dodao mogućnost unosa proizvoljnog broja sampleova koji su zatim bili nasumično raspoređeni, što je davalo mnogo bolje rezultate. 20 random sampleova + malo blura po Gaussu = odlična lightmapa. Nekada za to vrijeme se pojavio i blooming - kada već imam HDR, da ga upotrijebim. Pokušao sam simulirati neku difuziju svjetla po senzoru/filmu, što je davalo prilično ubjedljive rezultate, ali je bilo (i još jeste) odvratno sporo. Već na 640x480 bloom može trajati duže od renderovanja prvobitne slike. Nešto bih trebao s time uraditi, svakako.
http://www.imagesforme.com/out.php/i555354_pic6.jpg
I tako sam se dohvatio nečega što sam još od samog početka nekako potajno najviše priželjkivao - volumetrija. Ideja koju sam imao za to je iznenađujuće lako upalila, te sam dobio neke slike na koje sam u tim trenucima bio izuzetno ponosan. Jedna od tih je ova iznad. Na toj slici sam uvidio i da mi opako nedostaju sjene na vodi, što sam dodao u narednih 15-ak minuta. Vrijeme renderovanja je opet naraslo. Ne zbog same volumetrije, ona je praktično bila besplatna, već zato što sam morao povećati preciznost marchinga (smanjiti dužinu koraka), kako bi se preciznije premjerile putanje zrake kroz osvijetljeni i neosvijetljeni dio magle, inače bi se vidio vrlo ružan banding. Takođe, voda je dobila normal-mapu za talase. Na ovoj slici izgleda ok, ali je sve samo ne korektna.
http://www.imagesforme.com/out.php/i555374_pic7.jpgS http://www.imagesforme.com/out.php/i555375_pic8.jpg
Približismo se kraju, ovo su neke od posljednjih narenderovanih slika. Bejkovanje lightmapa je poboljšano, blooming je poboljšan (ali ne i ubrzan, nažalost). Dosta sam eksperimentisao sa različitim algoritmima za ekspoziciju i mapiranje u R8G8B8, ali nisam se još skrasio, tako da će to vidjeti još promjena. I magla je malo popravljena. Promjene postaju sve manje, dok neke fundamentalne stvari ostaju neriješene, zbog čega još uvijek neću objaviti ni binaryje, ni source. Hvala na razumijevanju.
http://www.imagesforme.com/out.php/i555389_pic9.jpg
I, da, evo ovako je program izgledao kada sam ga ja posljednji put vidio. Estetici su možda posvećene cijele tri sekunde. Većinom sam samo slagao nove dugmiće i polja za nove stvari koje sam implementirao, tako da sada sve više liči na Blender. Daleko manje funkcionalan i dosljedan, naravno. Svakako će doživiti reviziju interfesja prije bilo kakvog puštanja u javnost.
Sve u svemu, pisanje ovoga je bilo prilično uzbudljivo iskustvo i preporučujem isto svakome ko je vičan programiranju i voli grafiku. Nadam se da sam bar neke zainteresovao i potakao na razmišljanje. Dakle, šta mislite? Ima li ko sličnih iskustava? Konstruktivnih prijedloga?