PDA

Pogledaj cijelu verziju : TerraRend



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?

SHIFT
22-06-2009, 20:57
Konstruktivni prijedlog: izgradi karijeru na ovome :shock: ovo još nisam vidio :pray: ovo rula :bravo:

Burek_fr0m_SPACE
22-06-2009, 22:27
Hvala, SHIFT. Nije da ne bih volio karijeru u tome, ali za to treba još dosta poraditi na ovome i sličnim stvarima. I treba početi čitati šta su pametni ljudi napisali.

cerberi
23-06-2009, 09:02
čovječe, ma ovo je super. svaka čast burek, svaka čast

Burek_fr0m_SPACE
23-06-2009, 13:19
Hvala, hvala :D I, da, ako nekome treba bejkovati lightmapu za heightmapu, može se javiti =)

Grim
23-06-2009, 13:33
Burek ovo je fakat odlicno :pray: , svaka ti dala

Luka
23-06-2009, 16:30
Lijepo, isto nisam pola skužio, ali da izgleda vrlo kul - izgleda :)

btw, gui je odličan i sad, dobro je imati sve na dohvat ruke

Macolla
23-06-2009, 16:50
Bureče ne znas koliko mi je drago sto sam vidio jos nekog da koristi ovaj program. Ja se ovim bavim kao hobijem vec godinu dana i to ne slucajno. Naime, poceo sam ovaj program koristiti kako su mi dolazili requestovi za heightmape koje su bile importane u Sandbox2 i bile koristene u mnogim modovima. Ja sam ih najvise koristio da pravim neke super scene a ponosim se mojom scenom vulkana i aviona kako prolazi kroz dim (super realisticno je ispala slika koristeci Terragen za teren, Sadnbox2 za postavljanje scene i osvjetljenje, neke custom modele,...) koji je nestao sa zadnjim formatom. Potaknuo si me da opet napravim nesto novo pa se odmah bacam na posao i predlazem da ova tema bude showroom za radove iz terrain renderinga...

Burek_fr0m_SPACE
23-06-2009, 17:07
Bureče ne znas koliko mi je drago sto sam vidio jos nekog da koristi ovaj program.
"Ovaj program"? Nisam siguran na šta misliš. Na programe ovog tipa uopšte? Pošto sam ja programirao ovaj i prije postanja na forumu ga je vidjelo 3-4 ljudi, pa sumnjam da je do tebe stigao :D

@Luka (a potencijalno i svi ostali) - šta nije jasno? Samo pitajte.

cerberi
23-06-2009, 17:27
a gle stvarno postoji već neki terragen
malo se zbunio čovjek medju svim tim silnim programima. burek, da promijeniš ime možda sad kad vidiš da je već zauzeto? :)

Burek_fr0m_SPACE
23-06-2009, 17:53
Postoji TerraGen, ovo je TerraRend. Guglao sam za "TerraRend" i koliko vidim, nema ništa relevantno. Šta da kažem, ime je opisno. Ako neko ima neki kreativan prikladan naziv, slušam.

cerberi
23-06-2009, 17:56
ha joj, krivo sam vidio, sry

Macolla
23-06-2009, 20:14
Oh my bad mislio sam da radis na Terragen-u...

Opa, bravo znaci ti si sam napravio svoj program, pa to je ogroman uspjeh svaka cast majstore. Ako trebas neke ideje ili nesto vezano za taj program javi ili bar salji PM kada dovrsis svoj terrain da ga vidim...
:pray:

cerberi
23-06-2009, 20:21
e ma šta ne napraviš neki 3d engine? nemora biti super, ono AAA i to...
ak se ne varam imao si nešto prije, tako? neki 2d/3d kombinacija, tile engine, tak nešt...

Macolla
23-06-2009, 21:10
Sto kazete na ovo? Urađeno za 10min i planiram stavit jos malo boje u planine...
http://img87.imageshack.us/img87/442/renderh.jpg

Luka
23-06-2009, 21:45
@Burek, neke tehničke stvari, npr. što je raymarching?

Burek_fr0m_SPACE
23-06-2009, 23:50
Ok, pokušaću objasniti. Prvo, raytracing je generalno "praćenje zraka", kao što se može zaključiti iz naziva. U kontekstu renderovanja, to znači da se za svaki pixel slike ispaljuje zraka iz tačke kamere pod prikladnim uglom, te se prati u šta ona udara, tj. šta se ustvari nalazi na tom pixelu i on se ispunjava bojom koju je zraka upratila. Dakle, "naopako" od onoga kako svjetlost funkcioniše (ide iz izvora, odbija se i stiže do oka/kamere) - ovdje se od oka/kamere kreće i gleda se da li će se stići do izvora svjetla. Vjerovatno da si taj dio znao, ali neka bude rečeno. Raymarching je način da se raytraceuje. Kako mu ime kaže, radi se postepeno koračanje iliti "marširanje", kao što bi to radio s nekim projektilom u igri, recimo. "Provjeri ima li šta na trenutnoj poziciji, ako ima, vrati boju, ako nema, pomjeri se dalje, ponovi" - otprilike. Alternativa je da se strogo matematički preko jednačina pravih i površina nađu tačke presjeka, što dobro radi za većinu "čvrste" geometrije, ali za volumetrijske efekte je ovo najefikasnije rješenje jer se u ovom koračanju može prilično lako usput mjeriti koliko se dugo prolazilo kroz neki dim ili tako nešto, sampleujući njegovu gustinu na svakoj tački na kojoj se stalo. Osim toga, ovako je algoritam jednostavniji, a nisam se baš previše htio zamarati matematikom, iako je i ovdje svakako ima.

Konkretno, u mom rendereru, odbijanja samo ima kada je voda u pitanju, inače se sve dobije iz prvog raya jer se i lightmapa i mapa volumetrije bake-uju prethodno. Naravno, to znači da se za promjenu ugla sunca mape moraju ispeći ponovo. Za teren se onda sampleuju svi slojevi tekstura i rezultat se množi sampleom lightmape s te pozicije. U pitanju je trilinearno filterovanje, o čemu sam pisao ovdje nekada davno. Ako je voda u pitanju, trenutna zraka nastavlja put do dna, ali sa pojačanom maglom, jer je voda, jelte, gušća. Ako su refleksije uključene, onda se proizvoljan broj zraka refletkuje od površine sa malim varijacijama u uglu, a ako nisu, samo se nađe boja neba pod reflektovanim uglom. Ove reflektovane zrake se prate identično kao i one početne. Kada se ona uprate, nađe im se prosjek i to je boja refleksije. Zatim se zavisno od ugla između prvobitne zrake i površine vode u adekvatnom omjeru blenduje boja refleksije i boja "produžene" zrake, te se potom još sve pomnoži lightmapom za vodu. Posljednji korak za ray i kod vode i kod tla je blendovanje magle, linearno zavisno od dužine puta zrake. I, naravno, ako zraka promaši cijeli teren, poprima boju neba na tom uglu.

Ok, nemam pojma da li je ovo i koliko razumljivo, molio bih feedback :D Mogao bih eventualno još koju reći o volumetriji i nekim optimizacijama, ako me neko prati.

Luka
24-06-2009, 00:14
Razumljivo, thx :)

Kako točno provjeravaš je li nešto na nekom pixelu (matematički bi došao sa jednadžbama, ali kako ovako skužiš)?

Burek_fr0m_SPACE
24-06-2009, 00:26
Kako točno provjeravaš je li nešto na nekom pixelu (matematički bi došao sa jednadžbama, ali kako ovako skužiš)?
Vrlo jednostavno, služim se činjenicom da je teren "2,5D", tj. heightmapa. Dok marširam zrakom, ako provjeravam X,Y,Z tačku (X,Y je ravan terena, Z je visina), onda jednostavno pročitam visinu terena na X,Y koordinatama i vidim da li je Z koordinata "ispod" toga - ako jeste, zraka je penetrirala teren. Tada se u mom rendereru zraka vraća nazad u sve manjim i manjim koracima par puta sa ponovnim provjerama, kako bi se što preciznije odredila presječna tačka, ali to je već minorna stvar, prva rečenica sadrži suštinu :D

Luka
24-06-2009, 00:30
Ah da, heigthmap, smetnuh s uma :D

Znam da idem malo u offtopic, ali da je puni 3D, bi li to također mogao nekako izvesti?

Burek_fr0m_SPACE
24-06-2009, 00:37
Ne baš tako jednostavno, ali dalo bi se. Tj. zavisi šta koristim za modele, vidio sam neke stvari po imenu "distance fields", koje nisam baš do kraja svario iako mislim da okvirno shvatam o čemu se radi. U principu, raymarching je method-of-choice kada je lakše provjeriti da li je XYZ koordinata "zauzeta", nego računati presječnu tačku s nekom površinom. Za šta god možeš vršiti onakvu provjeru - to se da narendati raymarchovanjem.

Gamer++
09-07-2009, 10:29
Burek ovo je super! :wink: :shock:
Istina da se nimalo ne razumijem u ovo :oops: ali ovo djeluje u neku ruku "više" nego stvarno!
Imam samo jednu riječ za ovo: :bravo: samo tako naprijed :thumbs2:

Može jedno pitanjce? U kojem je to programu sklepano? C++ windows form? C# windows form, vb ili pak c++ or C# u nkom grafičkom API-u (ako je to onda koji DX, OpenGL ili XNA iako sumnjam da je grafički API) još jednom bravo

Luka
27-07-2009, 19:45
C#

softverski je renderirano...

Gamer++
28-07-2009, 05:22
nisam baš za te grafičk izraze renderirati, i to mislim da renderrirati znači iscrtati nacrtati, može li netko malo pojasniti

Luka
28-07-2009, 08:50
da, iscrtati

Filozof
17-08-2009, 13:46
Oopa Burek :bravo: !
Svaka cast covjece samo tako nastavi ove slike su predobre !
Biduj Carrer na ovom coece ima ovaj pravo!
:bravo: :bravo: :bravo: