Fejlettebb raycasting
- Fejlettebb raycasting
Rekurzív sugárkövetés
Minden pixelre egymástól függetlenül határozzuk meg azok színét, oldjuk meg az árnylási és takarási feladatokat.
Fénykomponensek
A fény útját kétféle komponensre bontjuk:
- Koherens komponens:
- Az optikának megfelelő ideális visszaverődés és törés
- Továbbkövetjük a fény útját
- Inkoherens komponens:
- Minden egyéb
- Ezek közül mi csak az absztrakt fényforrás direkt megvilágítását vesszük figyelembe.
Jelölés
Két vektor skalár szorzatát az egyszerűség kedvéért most -vel fogjuk jelölni.
Az irányok jelölésére stb. betűket használjuk, de ezek továbbra is egységhosszú vektorok, azaz
Egyszerűsített illuminációs egyenlet
Sugárkövetés
Az felületi pontból az irányban kibocsátott radiancia
- A szempozícióból sugarakat indítunk minden pixelen keresztül
- A sugarak irányát -val jelöljük
- A sugár és a színtér objektumainak szemhez legközelebbi metszéspontja adja meg -et.
Emisszió
Ez a tag a felület saját sugárzását írja le az felületi pontból az irányába.
Ambiens fény
a felület, a környezet ambiens együtthatója. Az egyenlet ambiens tagja közelíti azt a fénymennyiséget, ami általánosan jelen van, minden felületet ér, azok helyzetétől és az absztrakt fényforrásoktól függetlenül. Célja a közelítések miatt elhagyott fénymennyiség pótlása.
Fényforrások
A figyelembe vett inkoherens visszaverődéseket foglalja össze a szummás tag.
Csak a fényforrások direkt hatását vesszük figyelembe, és csak akkor, ha az az felületi pontból látszik.
- a fényforrásból a felületi pontba mutató egységvektor.
- most csak a diffúz és spekuláris visszaverődést jellemző BRDF.
- a felületi normális és a fényforrás felé mutató vektor
által bezárt szög koszinusza egységnyi idő alatt -ből mennyi foton esik rá a felületre. - Ha az fényforrás teljesítménye felénk és pozíciója akkor
- láthatósági függvény: Mi van / van-e valami és a fényforrás között?
- , ha a fényforrás nem látható -ből
- , ha igen,
- , ha áttetsző objektumok vannak a kettő között.
- kiszámításához úgynevezett árnyéksugarakat indítunk -ből -felé, és az objektumokkal való metszését nézzük.
Négyzetes elhalás
Miért a metszéspont és a fényforrás távolságának négyzetével osztunk?
Tekintsünk egy pontszerű fényforrást, ami minden irányban egyenletesen sugároz radianciát.
Egyre távolodva tőle, a pontszerű fényforrás köré írt gömbön négyzetcentiméterenként mennyi fényt mérnénk? Radiancia osztva a távolsághoz tartozó gömb felületével, azaz
Tehát két különböző távolságban mért fénymennyiség aránya
Tükröződés
A tükörirányból érkező fényt arányban vesszük figyelembe.
az ideális tüköriránynak megfelelő beeső vektor.
Az az -ből induló, irányvektorú sugár legközelebbi metszéspontja színtérbeli elemmel.
kiszámítása azonos kiszámításával: rekurzió!
Új sugár: szempozíció helyett -ből indul, irány
Fénytörés
A törési-irányból érkező fényt arányban vesszük figyelembe.
a törésiránynak megfelelő beeső vektor.
Az az -ből induló, irányvektorú sugár legközelebbi metszőpontja színtérbeli elemmel.
kiszámítása megint azonos kiszámításával: rekurzió!
Új sugár: szempozíció helyett -ből indul, az iránya pedig
Színek
A képletek csak fénymennyiséggel számolnak, így valójában egyetlen hullámhosszon számítottuk ki a kamerába érkező fényt.
A hullámhossztól függ majdnem minden:
- A felület és a fényforrások által kibocsátott fény:
- A felület fényvisszaverő tulajdonsága (BDRF, közelítő és koherens együtthatók):
- ideális törésirány:
Tehát el kell végeznünk a számítást a látható fénytartomány minden hullámhosszára.
Ehelyett rendszerint csak néhány hullámhosszon.
Gyakorlatban sokszor csak RGB színhármasnak megfelelően.
Önárnyékolás
A numerikus pontatlanságok miatt előfordulhat, hogy a metszéspont valójában kissé a testen belül van.
Ilyenkor a fényforrások felé lőtt sugarak beleütközhetnek a kiindulási felületbe!
Vagy hagyjuk ki a metszésszámításokból a legutóbb metszett objektumot (ahonnan indulunk), vagy toljuk el a sugár kezdőpontját a felületi normális irányába.
Figyeljünk arra is, hogy mi is kell pontosan: a metszéspont helye vagy elég-e maga a metszés ténye?
Aliasing
Egyenközű pontonkénti mintavételezést csinálunk lényegében a mintavételezési frekvenciánál gyorsabb változások alias-olnak, azaz nem létező, alacsonyabb frekvenciás jelkomponensekként regisztráljuk őket.
Mintavételezés
Eddig csak pixelenként egyetlen sugarat indítottunk.
Ha többet indítunk, akkor a Nyquist-frekvencia nő.
Pixelenként egy szín kell csak a sugarak által behozott különböző színeket összegezni kell valahogy (pl. átlagolni)
De a több sugár eredményét is többféleképpen összegezhetjük (vagyis: szűrhetjük)
Egyenletes mintavételezéssel az alias nem szüntethető meg (csak ha a bejövő jel garantáltan nem tartalmaz túl magas frekvenciás komponenseket)
Azonban ha nem egyenletes a mintavételezés, hanem megfelelő eloszlás szerint történik, akkor az alias helyett véletlenszerő, nagyfrekvenciás zaj lesz a képen.
Ehhez a szemünk már alkalmazkodott!
Vegyük észre: a fényt fent végig részecskeként kezeltük.
Emiatt a fény hullám természetéből adódó jelenségeket (interferencia, diffrakció ) nem tusjuk visszaadni.
Mikor számítanak ezek?
- Az interferencia miatt látjuk olyan színben a páva tollait, vagy a szappanbuborék felszínét amilyenben látjuk.
- A diffrakció pedig a finom árnyjelenségek egy részében játszik szerepet.
Sugárkövetés gyorsítása
Metszésvizsgálat gyorsítása
Az algoritmus sebessége leginkább a metszésvizsgálat sebességétől függ.
Hogyan gyorsíthatnánk ezt?
Ne vizsgáljuk a metszést olyan objektumokra, amiket biztosan nem metsz a sugár!
Ne vizsgáljunk metszést olyan objektumokra, amik biztosan távolabbi metszéspontot adnak, mint a már megtalált!
Befoglaló keretek
Minden objektumot vegyünk körbe valamilyen kerettel amivel gyorsan lehet metszést számolni.
Ha egy sugár metszi az objektumot, akkor biztosan metszi a keretet is!
Fordítva is legyen minél nagyobb a valószínűsége! (Minél jobban közeltse a befoglaló test az igazit.)
Befoglaló gömb: másodfokú egyenlet megoldás.
Befoglaló doboz: élei a tengelyekkel párhuzamosak, Cohen-Sutherland szakaszvágó algoritmussal gyorsan számítható.
Konvex poliéderek
Egy -oldalú konvex poliéder felírható féltér metszeteként (féltér: )
Azaz az oldallapok síkjait kifelé mutató normálisokkal felírhatjuk alakban.
A korábban látott sugár-AAB metszés könnyen általánosítható erre az esetre!
Legyen a sugár
Legyen
Minden oldallapra:
Legyen a lap , egyenlete olyan, hogy az
lapnormális a poliéderből kifelé mutat.
- Számítsuk ki a sugár és az oldallap síkjának metszéspontját
- Ha , akkor
- Különben
Ha , akkor nincs metszéspont.
Különben a sugár egyenese -nél lép be és -nál hagyja el a konvex poliédert (azaz metszi a sugár a konvex poliédert, ha )
Hierarchikus befoglaló keretek
Kisebb kereteket nagyobb keretekbe fogjuk össze.
Fa struktúrát kapunk.
Egy részfát csak akkor kell kiértékelni, ha a gyökérrel van metszés.
Térfelosztó eljárások
Szabájos felosztás
Egy szabályos 3D ráccsal lefedjük az egészet színteret.
Előfeldolgozás: minden cellához feljegyezzük a beletartozó objektumokat.
Használat: csak azokkal az objektumokkal végzünk sugár metszést, amiknek a celláján a sugár áthalad.
Előnye: a vizsgálandó cellák gyorsan számíthatók szakaszrajzoló algoritmussal! (lsd.: raszterizáció)
Hátránya: feleslegesen sok cella, nagy részük üres teret fed le.
Oktális fá
Fa gyökere: a teljes színteret magában foglaló tengelyekkel párhuzamos élű befoglaló doboz (AABB)
Vágjuk ezt nyolc egyenlő részre!
Minden új dobozra: ha elég sok objektum van benne, akkor tovább osztjuk, különben megállunk.
Előny: az üres részeket nem osztjuk tovább feleslegesen.
Hátrány
- Bonyolultabb bejárás
- A fa mélysége elszállhat a gyakorlatban egy előírt mélység is adott, amit elérve már nem osztjuk tovább a cellákat.
Quadtree
Az oktális fa síkbeli változata
Az aktuális cellát mindig négy egyenlő részre osztjuk, a tengelyekkel párhuzamosan.
Kd fa
Probléma az oktális fával: mindig középen és mindig sík mentén vág, nem veszi figyelembe az objektumokat.
Oktális fa: keresési idő a fa magassága. De, az oktális fa kiegyensúlyozatlan.
kd-fa: minden lépésben egyetlen síkkal vágunk, ami egy tengelyre merőleges.
Sorrend:
Felező sík elhelyezése:
- térbeli középvonal módszer
- test középvonal módszer
- költség modell alapú módszer
Sugárkövetés hardverben
DXR
2018 óta NVIDIA GPU-kban hardveresen gyorsított raytracing érhető el.
Ez a DX 12 szabvány része lett.
Compute shaders fallback-kel kibővített támogatás van Pascal architektúráig lefelé.
De valódi hardveres raytracing csak Volta, Turing és Ampere és újabb architektúrákon van.
DXR 1.0
5 új shader típus:
- Raygeneration shader: sugarak előállítását végző shader
- Intersection shader: procedurális geometriákra; van beépített hardveres sugár-háromszög metszés, nem kell feltétlen megírni.
- Colsest hot shader: lényegében a fragment shader megfelelője; a legközelebbi metszéspontra egyszer lefutó shader.
- Anyhit shader: átlátszósági tesztek eldöntésére meghívódó shader bejárás közben; a meghívások sorrendjére nincs semmilyen garancia.
- Miss shader: ha nem volt metszett geometria, akkor ez hívódik meg. (Itt számíthatunk például égbolt színt, stb.)
DXR 1.1
Ami igazán érdekes, hogy innentől bármilyen shader-ben lehet hívni TraceRay parancsot (nem csak grafikus szerelőszalagbeliből, hanem compute shader-ből is!).
Illetve DispatchIndirect is van, ami rengeteg új lehetőséget ad.