RAYTRACING Ondra Karlík (Keymaster)
O MNĚ • Ondra Karlík (Keymaster) • Čerstvě Bc. na FEL ČVUT v Praze ;) • Bakalářská práce: Využití generického programování v raytracingu • Vlastní renderer: K-Ray (pracovní název)
• Kontakt • ICQ: 125-171-564 • web: http://keymaster.cz • Maxarea: nick Keymaster
O PŘEDNÁŠCE • Motto: “Co se stane, když stisknete F9” • Obsah: 1. 2. 3. 4.
Princip raytracingu, konkurenční metody Jednoduchý raytracer Metoda Monte Carlo Složitější efekty - stíny, area lights, HDRI, reflexe, refrakce, glossy efekty, ...
+ Optimalizace
GENEROVÁNÍ OBRAZU • Úkol: ze scény (soubor objektů, světel, materiálů) vyrenderovat obrázek • Různé přístupy • Nejvíce používané: • Přímá rasterizace (rychlé, nekvalitní - hry - GPU) • Raytracing (pomalé, kvalitní - VFX - CPU)
PŘÍMÁ RASTERIZACE • OpenGL, Direct3D - hry, realtime aplikace • Postupně se každý trojúhelník transformuje (promítne) z 3D světa do 2D obrazu • Zobrazí se vždy nejbližší objekt ke kameře • Nerespektuje fyzikální principy reálného světa • Jednoduché materiály zobrazí stejně kvalitně jako raytracing (viz Furry ball ;)) • Neumí: reflexe, refrakce, ostré stíny, area lights, DOF, ...
RAYTRACING • Pomalejší (ale lépe zvládá mnoho polygonů) • Napodobuje reálný svět možno simulovat spoustu realistických efektů • Využíván v GI rendererech (V-Ray, Mental Ray, FinalRender, Maxwell, ...), ne ve Scanline
VIDĚNÍ V REÁLNÉM SVĚTĚ 1. Fotony (částice světla) jsou emitovány ze světel 2. Pak cestují po scéně, odrážejí se, jsou pohlcovány, ... 3. Nakonec některé dopadnou do senzoru (oko, CCD, ...) vytvoří obraz • Každý foton má barvu • Více fotonů = větší intenzita světla
SIMULACE RAYTRACINGEM • Simulujeme reálné světlo v počítači • Foton extrémně malý, jsou jich miliardy miliard místo fotonů paprsky • Paprsek • Idealizovaný tenký svazek fotonů • Může mít přiřazenou libovolnou energii stačí řádově méně
• Jen zlomek paprsků ze světel zasáhne snímač obrátíme směr chodu paprsků (fyzikálně korektní) generování v kameře
SCÉNA • Připraví se před samotným raytracingem • Data potřebná k vytvoření obrazu • • • • • •
Primitiva Materiály Textury Světla Environment Pozice kamery
OBJEKT - PRIMITIVE • Cokoliv, pro co umíme najít průsečík s paprskem • Data - pozice, rozměry, materiál, ... + algoritmus (postup) nalezení průsečíku • Trojúhelník, koule, plocha, kvádr, instance, ... • Typicky: 3D studio rozbije celou scénu na trojúhelníky po meshsmoothu bez struktury (bez objektů, skupin, ...) - “triangle soup”
PRINCIP RAYTRACINGU 1. Vystřelí se paprsky z kamery 2. Zjistí se kam dopadnou 3. Pro místo dopadu se vypočítá barva
CAMERA OBSCURA • Nejjednodušší možný fotoaparát • Malým otvorem prochází světlo, které vytvoří na stínítku ostrý obraz • Díky jednoduchosti se nejčastěji simuluje v CG
TVORBA PAPRSKŮ • Nejjednodušší případ: simulace Camera obscura • Z parametrů kamery se určí počátek a image plane • Paprsek jde z počátku skrz pixelem v image plane • Pro každý pixel: 1 paprsek skrz jeho střed
SLEDOVÁNÍ PAPRSKU • Hledání nejbližšího průsečíku • Naivní algoritmus: 1. otestovat všechny objekty 2. vybrat nejbližší nalezený průsečík
• Hledání nejde zastavit po nalezení prvního průsečíku:
• Obrovská časová složitost, jde řešit lépe
VÝPOČET BARVY (SHADING) • Konverze průsečík paprsku barva • Mnoho různých možností: • • • • •
Stínování podle normály Stínování podle hloubky Phongův model Realistické materiály ...
STÍNOVÁNÍ PODLE NORMÁLY • Odstín šedé přímo úměrný úhlu mezi normálou povrchu a dopadlým paprskem • Nebere vůbec v úvahu světla, materiál povrchu, ...
NORMÁLY • Normála = kolmice na povrch v daném bodě • Polygony na zakřivených plochách: interpolace z normál vrcholů
STÍNOVÁNÍ PODLE HLOUBKY • Odstín šedé přímo úměrný vzdálenosti od kamery • V rendererech typicky jako render element (z-depth)
PHONGŮV MODEL • 1973 - Bui Tuong Phong • Široce rozšířený • Hry - OpenGL • 3ds MAX - Scanline renderer (Standard material)
• Uvažuje světla, normálu povrchu, vlastnosti materiálu • Rychlý, nerealistický
PHONGŮV MODEL • Osvětlení rozložené do tří složek
• Difůzní a spekulární složka: pro každé světlo zvlášť, výsledky se sečtou
REKAPITULACE 1. Kamera vytvoří 1 paprsek na pixel 2. Najde se nejbližší průsečík hrubou silou 3. Vypočítá se osvětlení pomocí Phongova modelu podle světel ve scéně
Výsledek:
AKCELERAČNÍ STRUKTURY • Problém: hledání průsečíku je pomalé • • • •
1 obrázek: ~ 100 000 000 paprsků 1 paprsek hrubou silou: ~ 1 000 000 testů primitiv Celkem tedy ~ 100 000 000 000 000 testů Stovky hodin i pro jednoduché scény
• Pro nalezení průsečíku není třeba testovat všechny objekty • Řešení: akcelerační struktura • Uniform grid • Bounding volume hierarchy • KD-Tree (nejrychlejší, nejpoužívanější)
UNIFORM GRID • Scéna se rozdělí na rovnoměrné buňky tvořící 3D mřížku • Každý objekt se zařadí do buňky, kam patří • Paprsek putuje skrz buňky, protíná se jen s geometrií dané buňky
UNIFORM GRID
UNIFORM GRID
UNIFORM GRID
UNIFORM GRID
UNIFORM GRID
UNIFORM GRID
UNIFORM GRID
UNIFORM GRID
BOUNDING VOLUME HIERARCHY • Scéna tvořena hierarchií do sebe vnořených obálek bounding boxů • Uvnitř obálky: 2 další obálky, nebo několik primitiv • Když paprsek neprotne bounding box netřeba testovat cokoliv uvnitř • Složitost nalezení průsečíku je logaritmicky úměrná počtu polygonů
KDYŽ SE ŘEKNE “LOGARITMICKÁ”... • Logaritmická funkce: opak exponenciální • Exponenciální (geometrická řada) roste extrémně rychle logaritmická roste extrémně pomalu • 2× více objektů = pouze 1 krok navíc 10 poly ..........................4 kroky 100 poly ........................7 kroků 1 000 poly ....................10 kroků 1 000 000 poly ............ 30 kroků 4 000 000 poly ............ 32 kroků 10 000 000 poly ......... 34 kroků
AKCELERAČNÍ STRUKTURA • Před renderingem se staví (může trvat dlouho) • V-Ray: hláška “Building static raycast accelerator”
• Kvalitně postavená struktura limitem pro polycount je RAM, ne CPU • Srovnání v K-Ray: • • • • •
scéna: A-10 1M poly 1024×1024px, 3×AA bez struktury: ~200 hodin s BVH: 9 vteřin
STÍNY • Problém: chybějící stíny vytvářejí nerealistický obraz
• Řešení: než započítáme příspěvek světla, oveříme viditelnost - netriviální úloha
STÍNY • Ověření viditelnosti: opět hledání průsečíku • Shadow ray vystřelen z povrchu ke každému světlu • Jakýkoliv průsečík mezi povrchem a světlem stín • Toto prodlužuje render (problém: hodně světel)
REFLEXE A REFRAKCE • Jak udělat zrcadlové odrazy? • Řešení: podle reálného světa - simulace dokonalého odrazu paprsků
REFLEXE V PRAXI • Z povrchu se vystřelí 1 dodatečný paprsek • Ten se vystínuje stejně, jako kdyby šel z kamery • Toto se může víckrát opakovat, omezeno hloubkou zanoření (např. Max Depth ve V-Ray)
REFLEXE V PRAXI • Z povrchu se vystřelí 1 dodatečný paprsek • Ten se vystínuje stejně, jako kdyby šel z kamery • Toto se může víckrát opakovat, omezeno hloubkou zanoření (např. Max Depth ve V-Ray)
REFLEXE V PRAXI • Z povrchu se vystřelí 1 dodatečný paprsek • Ten se vystínuje stejně, jako kdyby šel z kamery • Toto se může víckrát opakovat, omezeno hloubkou zanoření (např. Max Depth ve V-Ray)
HÁDANKA • Chci vypočítat obsah kruhu • Neznám π, daný vzorec, integrální počet, ani Google ;)
NÁPADY?
HÁDANKA • Chci vypočítat obsah kruhu • Neznám π, daný vzorec, integrální počet, ani Google ;)
Řešení: Monte Carlo!
OBSAH KRUHU • Nakreslím kruh na zem, opíšu mu čtverec
OBSAH KRUHU • Nakreslím kruh na zem, opíšu mu čtverec • Do čtverce náhodně naházím kamínky • Procento kamínků uvnitř kruhu = procento obsahu čtverce, který vyplnil kruh
METODA MONTE CARLO • Matematická metoda • Umožňuje odhadnout to, co umíme spočítat jen lokálně, ne globálně • Místo výpočtu přesné hodnoty veličiny vypočítám několik vzorků, ze kterých odhadnu výsledek • Široké využití v renderingu: • • • • •
Antialiasing, DOF, Motion blur Area lights Glossy efekty GI Všechno, co produkuje šum
MONTE CARLO • Sample = bod, pro který počítáme veličinu • V raytracingu typicky 1 sample = 1 paprsek • Příklad: ambient occlusion • Přesný globální výpočet míry zastínění neumíme • Umíme vypočítat lokální zastínění v jednom směru (vyšleme shadow ray) • Vyšleme několik paprsků do různých směrů
MONTE CARLO - SAMPLOVÁNÍ • Monte Carlo je nepřesné • Průměrná odchylka se snižuje s počtem samplů • zhruba: 4× více samplů 2× menší odchylka
• Rozmístění samplů ovlivňuje odchylku • Pravidelné samply způsobují artefakty • Náhodné samply způsobují šum • Nejlepší: kombinace - pseudonáhodné samply
ANTI-ALIASING • Problém: • barva paprsku se počítá jen pro bod (nekonečně malá plocha) • barva pixelu musí odrážet průměr barvy na celé jeho ploše
• 1 paprsek na pixel artefakty (aliasing)
ANTI-ALIASING • Řešení: Monte Carlo: více paprsků skrz 1 pixel, výsledek zprůměrovat
• Pravidelné samply nejsou vhodné, nejlepší jsou pseudonáhodné
ROZOSTŘENÉ REFLEXE • V reálném světě: nedokonalé, rozostřené reflexe • Simulace: vystřelíme více paprsků, zprůměrujeme • Střílí se primární paprsky, ty jsou složité pomalé
MOTION BLUR • Příčina vzniku: po dobu otevření závěrky není scéna statická, objekty se pohybují • Simulace: vystřelíme více paprsků v náhodném čase, zprůměrujeme
DEPTH OF FIELD • Simulace složitější kamery: thin lens camera • Vystřelí se opět více paprsků • Počátek: ne 1 bod, ale náhodná pozice na kruhovém disku • Směr: paprsky ze všech míst na disku se protnou v místě fokusu
AREA LIGHTS • Bodová světla v reálném světě neexistují • Plošné světelné zdroje: větší realismus • Výpočet zastínění: • Bodové světlo: jen 2 stavy - světlo/stín • Plošné světlo: podíl zastínění
AREA LIGHTS • Analytický výpočet stínů: extrémně komplikovaný • Výpočet metodou Monte Carlo: ke světlu se vystřelí více paprsků (samplů) - delší výpočet
AREA LIGHTS SAMPLING • Osvětlení přes několik samplů = defacto náhrada area light za několik point light • Důležitost náhodného samplování: Fixní náhrada
Pokaždé jiné náhodné vzorky
• Více samplů kvalitnější stíny, delší výpočetní čas • Větší plocha světla větší šum
HDRI ENVIRONMENT • Stejný princip jako u area lights • HDR mapa se nahradí pokaždé jinými náhodnými bodovými světly • Světla mají barvu a intenzitu mapy v daném místě • Více světel se nageneruje ve světlých místech
MULTIDIMENSIONAL SAMPLING • Příklad: chceme Area lights, AA, DOF - všechno po 10 samplech • Naivní přístup: Máme 10 samplů na pixel, pro každý 10 paprsků kvůli DOF. A pro každý průsečík potřebujeme 10 shadow rayů. Celkem ~1000 paprsků • Lepší přístup: Máme 10 samplů na pixel, pro každý z nich zvolíme náhodný počátek paprsku (DOF). Pro každý průsečík vystřelíme jen 1 náhodný shadow ray. Celkem 10 paprsků • Obě metody konvergují zhruba stejně rychle
CO SE NESTIHLO :( • Global Illumination • Princip • Monte Carlo - pathtracing • Předpočítané data - IRR, Photon mapping
• Instancování • SSS, Volumetrie, Subdivision displacement • Rozbor paměťové náročnosti • Zase někdy příště ;)