Zobrazit předchozí téma :: Zobrazit následující téma |
Autor |
Zpráva |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 31. leden 2009, 17:10:30 Předmět: Raytracer |
|
|
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
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 |
|
 |
Weny Sky

Založen: 28. 07. 2007 Příspěvky: 241
|
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 31. leden 2009, 17:20:31 Předmět: |
|
|
Je na tom nieco divne 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 |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 31. leden 2009, 17:26:24 Předmět: |
|
|
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á.  |
|
Návrat nahoru |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 1. únor 2009, 12:36:52 Předmět: |
|
|
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 |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 1. únor 2009, 15:07:56 Předmět: |
|
|
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í
Mimochodem k pokusu o napsání raytraceru mě inspirovala právě tvoje/vaše knihovna.
EDIT: verze s opravenou kamerou a texturou podlahy zde http://disk.jabbim.cz/matasx@njs.netlab.cz/raytracer05.png |
|
Návrat nahoru |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
|
Návrat nahoru |
|
 |
pcmaster

Založen: 28. 07. 2007 Příspěvky: 1827
|
Zaslal: 2. únor 2009, 15:03:59 Předmět: |
|
|
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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 2. únor 2009, 18:48:14 Předmět: |
|
|
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 |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 6. únor 2009, 21:59:40 Předmět: |
|
|
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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 7. únor 2009, 13:32:27 Předmět: |
|
|
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 |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 7. únor 2009, 15:46:57 Předmět: |
|
|
Díky za vysvětlení. 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 |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
Zaslal: 8. únor 2009, 11:16:17 Předmět: |
|
|
Tak další problém na sebe nenechal dlouho čekat
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? moc si to nedávám no, asi bych se na to měl vykašlat problém je v tom, že mě to baví ... jenže když není dostatečná dokumentace tak jsem v koncích.
Tak předem díky za odpovědi
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 |
|
 |
Vilem Otte

Založen: 18. 09. 2007 Příspěvky: 462 Bydliště: Znojmo - Sedlesovice, Kravi Hora
|
Zaslal: 8. únor 2009, 13:38:00 Předmět: |
|
|
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 |
|
 |
Matasx
Založen: 17. 08. 2008 Příspěvky: 258
|
|
Návrat nahoru |
|
 |
|