Ray Tracing Jan Dupej, johny74656@gmail.com
úvod ide o prevod nejakej 3D reprezentácie scény do 2D bitmapy ray tracing je len jednou z metód prevodu Q: na čo? A: zobrazovanie priebehov funkcií niekoľkých premenných, zobrazovanie modelov v architektúre a medicíne, hry,...
metódy prevodu 3d(+) scény scanline algoritmy polygóny v scéne sa vypĺňajú scanline algoritmom, s ohľadom na viditeľnosť (+) veľmi rýchle (-) zle sa pracuje s CSG finite-element (radiosity) zo zdrojov svetla sa strieľajú fotony (+) simuluje caustics a nepriame osvetlenie (-) VEĽMI POMALÉ, obrázky sú často zašumené
metódy prevodu 3d(+) scény ray tracing (ray-casting, ray tracing, Monte Carlo metódy) svetlo sa sleduje od pozorovateľa (+) vhodné pre CSG, relatívne rýchle (-) nevie caustics a nepriame osvetlenie + hybridy, photon mapping,...
ray casting vrhanie lúča, Arthur Appel, 1968 Wolfenstein 3D Duke Nukem staršie hry používali ray casting na vykresľovanie
ray casting :: jednoduchý algoritmus algoritmus bez tieňovania v pseudokóde struct RAY { float4 v_source, v_direction; }; COLOR ray_cast(ray ray) { if(no_collision(ray)) return background; COLOR ret; ret = get_diffuse(get_closest_collision(ray)); return ret; } ray.source = camera; for each pixel in projection_plane ray.direction = pixel camera; pixel.color = ray_cast(ray);
ray casting konštrukcia lúča v = P P0 ray : P = P0 + t v; t > 0
ray casting :: tieňovanie COLOR shade(vector4 impact, vector4 reflected) { COLOR ret = RGB(0,0,0); RAY shade_ray; for each light in scene shade_ray={impact, light.position-impact}; if(no_collision(shade_ray)) ret+=dot(reflected, shade_ray.direction) * light.color; return ret; } rendering powered by JaGrLib
ray tracing sledovanie lúča, Turner Whitted, 1979 lúč sa generuje tak isto ako v ray castingu, ale: po každom náraze na prvok scény dôjde k odrazu/lomu, ak lúč nesmeruje von zo scény a počet odrazov nedosiahol definovanú hodnotu pri každom náraze sa sleduje pre každý zdroj svetla shade ray, ktorý určí, ako je daný bod osvetlený
ray tracing COLOR trace(ray ray) { vector4 impact = get_closest_collision(ray); vector4 normal = get_normal_at_collision(ray); return shade(impact, normal); } COLOR shade(vector4 impact, vector4 normal) { COLOR ret = RGB(0,0,0); for each light in scene RAY shade_ray={impact, light.position impact}; if(no_collision(shade_ray)) ret+= direct_illumination(shade_ray, light); if(specular()) ret += trace(reflected); if(do_refractions) ret += trace(refracted); return ret; }
ray tracing ray tracing ray casting s tieňovaním ray casting bez tieňovania rendering powered by JaGrLib
ray tracing počet sledovaných lúčov rastie exponenciálne, je potrebné obmedzenie, čo môže spôsobiť stratu detailov hĺbka rekurzie = 1 hĺbka rekurzie = 2 typicky je rozumným kompromisom hĺbka 10 až 15 rendering powered by JaGrLib
ray tracing a Monte Carlo svetelný tok cez 1 pix sa dá vyjadriť: Φ = L( x, ω )(ω n)d ω dx PΩ Φ svetelný tok cez 1 px P plocha ktorú px vymedzuje Ω hemisféra vektorov L(x, ω ) prichádzajúce svetlo do bodu x v smere ω n normálový vektor zobrazovacej roviny ALE, my tok v 1 pix aproximujeme JEDINÝM lúčom, čo tým stratíme?
ray tracing a Monte Carlo 1 lúč / pix 4 lúče / pix multisampling
ray tracing a Monte Carlo je zjavné, že čím viac vzorkov na pixel, tým presnejšia je naša aproximácia Monte Carlo aproximácia integrálu: Aproximujeme integrál : b I0 = f ( x)dx a Náhodne vyberieme χ 1, χ 2,... tak že χ i (a, b). Nech I n = n i= 1 f (χ i ) n Dá sa dokázať : lim I 0 I n = 0 n je teda pravda, že čím viac vzorkov použijeme na pixel, tým presnejší obrázok dostaneme
ray tracing a Monte Carlo pravidelné vzorkovanie môže spôsobovať moiré, tento problém sa obchádza vzorkovaním v nepravidelných rozostupoch 25 vzorkov / pix pravidelné 25 vzorkov / pix náhodné 25 vzorkov / pix jittering rendering by Steffen A. Mork
ray tracing toto dostaneme použitím Ray-Tracingu s jitteringom: Q: čo tomu obrázku chýba k realite? A: okrem iného mäkké tiene (zdroj svetla nie je bodový) rendering by Henrik Wann Jensen
ray tracing :: mäkké tiene mäkký tieň získame, keď pošleme viackrát shade ray do toho istého zdroja svetla, ale do iných miest na ňom to samozrejme, predlžuje čas vykresľovania
ray tracing :: ďalšie rozšírenia rendering s mäkkými tieňmi: Q: čo mu ešte chýba? A: sklenená guľa vľavo má zaostriť svetlo pod sebou (caustic) od podlahy sa má odraziť svetlo na strop (nepriame osvetlenie) rendering by Henrik Wann Jensen
ray tracing :: ďalšie rozšírenia chýbajúce prvky v obrázku vedia doplniť niektoré vykresľovacie metódy: path tracing (James Kajiya, 198x) z každého pix sa sleduje veľa lúčov v rôznych smeroch. pri náraze na matnú plochu sa lúč nerozdeľuje, stále sa sleduje jediný lúč. ak je nárazová plocha priesvitná aj odrazová, použije sa ruská ruleta. photon mapping (Henrik Wann Jensen, 1995) algoritmus pracuje v dvoch prechodoch. v prvom sa scéna ožiari fotonmi zo zdrojov svetla a zaznamenajú sa nárazy. v druhom sa vykoná ray-tracing s tým, že pri každom náraze sa k zistenej farbe pripočítajú aj farby fotonov, ktoré narazili v okolí.
ray tracing :: ďalšie rozšírenia Cornell box vykreslený path-tracingom sa už blíži k realite color bleeding nepriame osvetlenie caustic mäkký tieň rendering by Henrik Wann Jensen
použitá literatúra Henrik Wann Jensen: Realistic Image Synthesis Using Photon Mapping AK Peters, 2001, ISBN 1-56881-147-0 Steffen A. Mork: http://ls7-www.cs.uni-dortmund.de/~mork/ Greg Humphreys: Ray Casting http://www.cs.virginia.edu/~gfx/courses/2004/intro.fall.04/handouts/05-raycast.pdf
Ďakujem za pozornosť.