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

1 2 3
4 5 6

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.

Források