.[ ČeskéHry.cz ].
Raytracer
Jdi na stránku 1, 2, 3  Další
 
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 31. leden 2009, 17:10:30    Předmět: Raytracer Odpovědět s citátem

Zdravím všechny!
Tak sem se zase jednou nudil a rozhodl jsem se, že si zkusím napsat jednoduchý raytracer. Po 2 dnech usilovného přemýšlení se dostavily první výsledky. No takže proč sem píšu? Mám hrozně špatnou představivost a optika mi nic neříká, proto se chci zeptat zda jsou odrazy na vyrenderovaném obrázku špatně či dobře? Díky za pomoc všem Very Happy
http://disk.jabbim.cz/matasx@njs.netlab.cz/rayreflection.png

(PS: já si myslím že je to špatně a že by v těch místech měl být odražen pozorovatel...)

EDIT: a ještě jeden dotaz. O raytracingu se toho dá vygooglit dost, ale nikde sem se nedočetl jaká by měla být vzdálenost mezi plochou, na kterou se promítá obraz, a virtuálním pozorovatelem pro dosažení té správné perspektivy. Viz. obrázek: http://disk.jabbim.cz/matasx@njs.netlab.cz/vzdalenost.png


Naposledy upravil Matasx dne 31. leden 2009, 17:15:56, celkově upraveno 1 krát
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Weny Sky



Založen: 28. 07. 2007
Příspěvky: 241

PříspěvekZaslal: 31. leden 2009, 17:14:53    Předmět: Odpovědět s citátem

http://www.math.tu-berlin.de/~sechel/pics/raytrace01.png
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Zobrazit autorovi WWW stránky
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 31. leden 2009, 17:20:31    Předmět: Odpovědět s citátem

Je na tom nieco divne Smile Aj tie tiene (shadows) je trochu divne, nie? Svetlo svieti priblizne zhora?

Povedal by som, ze bud blbo pocitas odrazene luce (rays) a/alebo neuvazujes front/back face (viz ta skosena gula v odraze na podlahe)...
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 31. leden 2009, 17:26:24    Předmět: Odpovědět s citátem

Ještě to nemám napsaný uplně ideálně, takže nemůžu pořádně menit pohled pozorovatele, proto sem to nechal vykreslit takhle "špatně", tohle by mělo být snad správně: http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer02.png

EDIT: pořád to vypadá divně, ale to je daný tou špatnou vzdáleností od plátna a virtuálního view pointu, která bohužel nevím jak má být velká. Sad
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 1. únor 2009, 12:36:52    Předmět: Odpovědět s citátem

Velmi špatně máš FOV (field-of-view), tedy pokud se snažíš o oko - úhel mezi středem plochy na kterou promítáš, kamerou a okrajem plochy, na kterou promítáš svou scénu - ta by se měla rovnat
vzdalenostPlochyProjekce = polovinaSirkyOkna / tan(Pi * (180.0f - (FieldOfView / 2.0f)) / 180.0f); - kdy field of view je uhel pohledu kamery (běžně se používá 45 - 60 stupňů, někdy dokonce až 90 stupňů).
Pokud chceš dynamicky v průběhu programu toto měnit - tak doporučuji používat co nejrychlejší výpočet vzdálenosti plochy projekce, mimo použití rychlé aproximace funkce tangent by rovnice měla vypadat:
vzdalenostPlochyProjekce = polovinaSirkyOkna / tan(Pi - 0.00872664625997164788461845384244f * FieldOfView)

A teď pár otázek ode mě - provádíš ray tracing na GPU nebo CPU? Co plánuješ dál přidávat - osvětlení, supersampling, filtrování textur (příp. jaké - SAT filter, Mipmap filter, ...)? Jak jsi na tom s ray-sphere kolizí - kolikrát ji provedeš za sekundu, jaký vykreslovací čas na tuto scénu + nějaké info, provádíš nějakou optimalizaci - příp. jakou (KD trees, BVH, BIH, QBVH, etc.)?
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 1. únor 2009, 15:07:56    Předmět: Odpovědět s citátem

Moc otázek najednou. Sem ve čtvrťáku na střední škole a chtěl jsem si prostě jen zkusit co zvládnu. Napsal jsem to za dva dny. Neumí to v podstatě nic. Žádné optimalizace implementované nejsou. Pužívám čistě CPU. Tato scéna (2xAA) se renderuje na Intel Pentium M (1700 MHz) cca. 37 vteřin. (Taky podotýkám že jsem tu kameru ještě neopravil, nebyl čas...) Rozhodně to ale nehodlám jen tak zabalit a hodlám v psaní pokračovat.

http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer04.png

+ díky moc za vysvětlení Smile
Mimochodem k pokusu o napsání raytraceru mě inspirovala právě tvoje/vaše knihovna. Smile

EDIT: verze s opravenou kamerou a texturou podlahy zde http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer05.png
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 2. únor 2009, 14:58:42    Předmět: Odpovědět s citátem

Prozatím poslední render zde http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer07.png a dál nevím jak na raytraceru pokračovat... kdyby se mi podařilo něco převratnýho, dám vám vědět Cool
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pcmaster



Založen: 28. 07. 2007
Příspěvky: 1827

PříspěvekZaslal: 2. únor 2009, 15:03:59    Předmět: Odpovědět s citátem

Plosne svetla, nepriame osvetlenie, refrakcia (ak ju tam uz nemas), dalsie primitiva (napriklad 3uholnik), texturovanie...

Mas to pekne, gratulujem!
_________________
Off-topic flame-war addict since the very beginning. Registered since Oct. 2003!
Interproductum fimi omne est.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 2. únor 2009, 18:48:14    Předmět: Odpovědět s citátem

A postupně bude přicházet to nejhorší - optimalizace kódu, ray acceleration structures, ray packets (ovšem ty nejsou nutné), SIMD SSE, atd. atd.

Také by mohlo být dobré zkusit texturové filtry - magnifikační filtr je stejný jako pro rasterizaci lineární filtr. U mipmapových filtrů je to trochu komplikovanější - musíš použít diferenciály polopřímek a poté až mipmapu. Anisotropní filtry jsou snad ještě náročnější - doporučuji použít na ně tzv. RIP mapping. Novinkou jsou také SAT filtry v reálném čase, ovšem ty nejsou tak jednoduché na napsání tak, aby byly efektivní.

Předpokládám také že na supersampling používáš metodu oversamplingu každého pixelu - zkus využít adaptivního supersamplingu (pokud strefíš hranu tak provedeš oversampling, nevím jak tomu je u koule, ale u trojúhelníku stejně vždy testuješ prvně hrany, tak tam je to jednoduché).
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 6. únor 2009, 21:59:40    Předmět: Odpovědět s citátem

Tak předem doufám, že nevadí když budu průběžně přispívat do tohoto threadu...
Vyskytl se mi další problém jménem float zaokrouhlování.
Takže o co jde?
Průnik přímky s objektem mi vrátí float t ... a když udělám start + t * direction, tak musím zákonitě dostat místo, kde se to protlo a to místo musí být na tom objektu, jenže když ten bod spočítám a nechám ho znova otestovat s tím objektem, tak to vrací true nebo false v poměru tak 1:1. Jde o to že tam vzniká chyba při zaokrouhlování floatu. Zkoušel jsem věci jako místo t > 0 psát t > 0.01f ... nicméně to funguje jen do nějaké vzdálenosti a čím je objekt dál, tím větší zaokrouhlovací chyba vznikne a tohle ošetření nefunguje. Napadá někoho jak to řešit nebo ví jak se to řeší?
Předem díky všem.
Tady ještě jeden snímek, kde je krásně vidět jak to ošetření funguje/nefunguje: http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracerbug.png
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 7. únor 2009, 13:32:27    Předmět: Odpovědět s citátem

Mno, narazil jsi na chybu, kterou lze řešit pouze použitím buď double místo float, nebo použít 64-bitové procesory a float, a pokud ti bude 64-bit float málo, tak double na 64-bitových CPU.
Jinými slovy tato chyba není tolik chybou, jako spíše přesností 32-floating point čísel (příp. 64-bit fp, anebo 128-bit fp - v případě double na 64-bit cpu). Toto by ti ovšem nemělo dělat problémy u většiny efektů - nějaké to může dělat u reflekcí/refrakcí, stínů a některých modelech globálního osvětlení - vše se řeší tak, že přičteš malou hodnotu k číslu, kdy hodnota je rovna normále na daném pixelu krát nějaké malé číslo (mělo by se vzdáleností růst, aby si zase nenarazil v dálce na float precision-issues).
Pokud chceš bod testovat znovu s objektem - tak musíš počítat s roustoucí chybou se vzdálenosti (nebude to růst lineárně, ale exponencionálně - jak přesně to si teď zrovna ale nevzpomenu).
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 7. únor 2009, 15:46:57    Předmět: Odpovědět s citátem

Díky za vysvětlení. Smile Ještě by mě zajímalo jak se řeší jak moc světlý / tmavý bude stín když světlo se v raytraceru neodráží?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 8. únor 2009, 11:16:17    Předmět: Odpovědět s citátem

Tak další problém na sebe nenechal dlouho čekat Sad
Snazím se aplikovat Lambertův zákon (Lambert's law). Našel jsem vzorec, kterej sice v určitých případech dělá přesně to co bych očekával, ale spíš z toho mám zamotanou hlavu a spoustu otázek okolo.
Takže co jsem našel:
I' = R.I.cos(x) + R(1 - I)

Což jsem upravil na (protože normálový i směrový vektor je normalizovaný):
float Il = R * I * Vector3.Dot(N, -direction) + R * (1 - I);

takže
R je jak moc je objekt reflexní <0;1> - přičemž 1 znamená, že je 100% odrazivý???
I je intenzita světla <0;1> - přičemž 1 znamená, že je maximálně intenzivní??? (Chová se to podivně a spíše opačně)
N je normála
direction je normalizovaný vektor směru pohledu - má tam být -direction nebo direction???

Výsledkem je zase nějaká intenzita Il <0;1> - tzn. v jakém poměru se bude výsledná barva kombinovat s černou???

Dokáže mi někdo odpovědět na tyhle otázky? Very Happy moc si to nedávám no, asi bych se na to měl vykašlat Confused problém je v tom, že mě to baví ... jenže když není dostatečná dokumentace tak jsem v koncích. Crying or Very sad

Tak předem díky za odpovědi Cool

EDIT: pokud to zjednoduším na: float Il = I * Vector3.Dot(N, -direction);
tak při maximální intenzitě světla (I = 1) vypadá výsledek takto: http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer10.png
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Vilem Otte



Založen: 18. 09. 2007
Příspěvky: 462
Bydliště: Znojmo - Sedlesovice, Kravi Hora

PříspěvekZaslal: 8. únor 2009, 13:38:00    Předmět: Odpovědět s citátem

Mno, základem osvětlení je (pro směrové světlo):
I = N.L
- tj. cosinus úhlu mezi normálou a vektorem od světla k danému bodu = Lamberts cosine law.

Pokud máš barevné světlo tak to je:
I = N.L * C
- tj. zase Lamberts cosine law, vynásobený barvou světla (3 složkový float) - výsledek je samozřejmě také 3 složkový float.

Pokud máš bodové světlo tak to je:
I = N.L * A * C
kde
A = 1 / (konstantniUtlum + d * linearniUtlum + d * d * kvadratickyUtlum)
- tj. To co při barevném světle vynásobené složkou útlumu

Tak teď se dostaneme k reflexím (Spot světla záměrně vynechávám, protože by se měly u raytraceru simulovat jako bodové v baterce - tj. bude vrhat stín všude až na směr). Reflekce můžeš přidávat několika způsoby - obvykle máš nějakou hodnotu rI která udává intenzitu reflekce na daném bodě (obvykle konstanta, může být ale i textura), pak vzorec vypadá takto:
I = rI * R + (1 - rI) * N.L * A * C
- základem je osvětlení pro bodové světlo, musíme ale uvažovat že reflexe je ODRAŽENÁ (ano simulujeme pouze spekulární reflexi, nikoliv tzv. diffuse reflection = dopadovou reflexi). Problém nastane ve chvíli, kdy chceme používat rekurzivní reflexe, pro ty to ale není složité upravit. Celý vzorec pro osvětlení ray tracingu při pouze primární reflekci a primární refrakci by měl vypadat takto:
I = reflI * Refl + refrI * Refr + (1 - reflI - refrI) * N.L * A * C + N.H^s * A * C
- kde prvně spočítáme reflekci, poté refrakci, následně dopadové světlo a phong specular highlight (N.H = normal dot halfvector, s = shinniness, reflI a refrI jsou intenzity reflekce a refrakce, Refl a Refr jsou barvy reflekce a refrakce na daném bodě).

Toto je základní Lambert diffusie Phong specular (Phong-Blinn specular při malé úpravě) lighting model. V případě že chceš použít dostupnost světla (ambient occlusion), color bleeding, příp. plné globální osvětlaní, tak se rovnice trošku změní. Časem můžeš zkusit i více fyzikálně založené osvětlovací modely např. Oren-Nayar diffuse, nebo Torrance Sparow specular, Cook Torrance specular, Ward anisotropic, nebo jiné. Naopak kaustika nebo disperze ji vůbec nezmění (kaustika je na výrobu pomocí fotonových map, nebo Metropolis light transport jednoduchá, disperzi se mi ještě ani zdaleka nepovedlo vyrobit - ten efekt má docela drsné nároky a není to nic lehkého).
_________________
Should array indices start at 0 or 1? My compromise of 0.5 was rejected without, I thought, proper consideration.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovi WWW stránky
Matasx



Založen: 17. 08. 2008
Příspěvky: 258

PříspěvekZaslal: 8. únor 2009, 14:32:18    Předmět: Odpovědět s citátem

Díky moc!!!
Takže poopraveno Smile http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer11.png

EDIT: stejně je to nějaké tmavé ... jdu to napsat pořádně.

EDIT2: nějak to nechápu, kde je tam barva objektu?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
odeslat nové téma   Odpovědět na téma    Obsah fóra České-Hry.cz -> 3D API / 3D Enginy Časy uváděny v GMT + 1 hodina
Jdi na stránku 1, 2, 3  Další
Strana 1 z 3

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra
Nemůžete odpovídat na témata v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete hlasovat v tomto fóru


Powered by phpBB © 2001, 2005 phpBB Group


Vzhled udelal powermac
Styl "vykraden" z phpBB stylu MonkiDream - upraveno by rezna