Az útvonalkövetés egy olyan megjelenítési technika a számítógépes grafikában , amely a fény fizikai viselkedését igyekszik a valósághoz a lehető legközelebb szimulálni. A Path Tracing a hagyományos sugárkövetés fejlett speciális esete , amelynek algoritmusa egy virtuális kamera sugarait követi nyomon a téren keresztül; a sugár addig "visszapattan" a tárgyakról, amíg teljesen fel nem szívódik vagy szétszóródik. Az útvonalkövetési módszerrel előállított képek minősége általában jobb, mint a más renderelési módszerekkel előállított képek minősége, de az útvonalkövetés sokkal számításigényesebb.
Az útvonalkövetés a legegyszerűbb, fizikailag legpontosabb és leglassabb megjelenítési módszer. Az útvonalkövetés természetesen számos olyan optikai hatást reprodukál, amelyek más renderelési technikákkal nehezen érhetők el, vagy akár elérhetetlenek: árnyékolás , mélységélesség , elmosódás a mozgásból , maró hatás , környezeti elzáródás és közvetett megvilágítás . Ezeknek az optikai effektusoknak az útkövetéssel való megvalósítása sokkal egyszerűbb, mint más technikákkal.
Pontossága, valamint a közelítések és feltételezések hiánya ( angolul unbiased ) alapján az útvonalkövetést képek generálására használják, amelyeket aztán összehasonlító mintaként használnak fel más algoritmusok renderelési minőségének értékelésére. Ahhoz, hogy az útkövetéssel előállított jó minőségű képeket kapjunk, nagyon sok sugarat kell nyomon követni; ellenkező esetben a grafikai műtermékek zaj formájában jelennek meg .
A leképezési egyenletet és annak számítógépes grafikára való alkalmazását James Kajiya vezette be 1986-ban [1] . Ez a bemutató volt az útvonalkövető algoritmus első leírása. Az év későbbi szakaszában Lafortune számos fejlesztést javasolt az algoritmushoz, beleértve a kétirányú útvonalkövetést [2] .
Eric Veach és Leonidas J. [ 3 ] 1997-ben vezette be a Metropolis könnyű szállításátzavarása a teljesítmény növelése érdekében összetett jelenetekben .
Egy idő után a GPU -k olyan fejlettségi szintet értek el, hogy érdeklődést keltettek irántuk az útvonalkövetési számítások átvitele tekintetében. Tim Purcell volt az első, aki 2002-ben egy globális megvilágítási algoritmust vezetett be, amely GPU-n futott [4] . 2009-ben Vladimir Koilazov bemutatta a GPU-n futó útvonalkövető algoritmus első kereskedelmi megvalósítását [5] . Ezt elősegítette a GPGPU -központú programozási eszközök, például a CUDA és az OpenCL kifejlődése .
A való világban a fény sok kis részét bocsátják ki a fényforrások, és egyenes vonalakban, sugarakként terjednek a közegen keresztül és tárgyról tárgyra, megváltoztatva színüket és intenzitását. Ez az „út” addig folytatódik, amíg a sugarakat tárgyak elnyelik, beleértve az olyan tárgyakat, mint az emberi szem vagy a kamera. Ezt a sugárterjedési folyamatot útkövetéssel szimulálják, azzal a különbséggel, hogy a sugarakat fordított irányban, a virtuális kamerától (megfigyelőtől) a fényforrásig követik. Ennek oka az a tény, hogy a fényforrásból érkező sugaraknak csak nagyon kis része éri a virtuális kamera lencséjét, így a sugarak túlnyomó többségének kiszámítása nem befolyásolja a virtuális kamera által kapott képet. bármilyen módon.
Ezt a viselkedést matematikailag leírja a megjelenítési egyenlet . Ez az egyenlet megpróbálja megoldani az útvonalkövetési algoritmusokat.
Az útvonalkövetés nem egyszerű sugárkövetés korlátlan sugárvisszaverődéssel (azaz rekurzív mélységgel). A hagyományos sugárkövetésben a fényt abban a pillanatban számítják ki, amikor a sugár közvetlenül metszi a diffúz felületet. Az útkövetés során véletlenszerűen egy új sugarat generálnak az objektum féltekén belül, majd nyomon követik, amíg az nem metszi egy fényforrást, ami megtörténhet, de előfordulhat, hogy nem. Útkövetés esetén a sugár útja sok diffúz felülettel metszheti egymást, mielőtt metszi a fényforrást.
Az útvonalkövetést megvalósító pszeudokód így nézhet ki:
Color TracePath ( sugár , számlálási mélység ) { _ if ( mélység >= MaxMélység ) { vissza Fekete ; // Eleget ugrált. } sugár . FindNearestObject (); if ( ray . hitSomething == false ) { vissza Fekete ; // Semmit sem találtak el. } Anyag anyag = sugár . thingHit -> anyag ; színkibocsátás = anyag . _ kibocsátás ; // Válasszon egy véletlenszerű irányt innen, és folytassa. Ray newRay ; newRay . eredet = sugár . pointWhereObjWasHit ; // Ez NEM koszinusz-súlyozott eloszlás! newRay . irány = RandomUnitVectorInHemisphereOf ( ray . normalWhereObjWasHit ); // A newRay valószínűsége const float p = 1 / ( 2 * M_PI ); // Számítsa ki ennek a sugárnak a BRDF értékét (Lamberti reflexiót feltételezve) float cos_theta = DotProduct ( newRay . direction , ray . normalWhereObjWasHit ); Szín BRDF = anyag . reflektancia / M_PI ; // Visszavert fényforrások rekurzív követése. Színes bejövő = TracePath ( newRay , mélység + 1 ); // Alkalmazza itt a megjelenítési egyenletet. visszatérési kibocsátás + ( BRDF * bejövő * cos_theta / p ); } void Render ( Image finalImage , count numSamples ) { foreach ( pixel a finalImage - ben ) { foreach ( i in numSamples ) { Ray r = kamera . generRay ( pixel ); pixel . szín += TracePath ( r , 0 ); } pixel . szín /= számMinták ; //Átlagos minták. } }A fenti példában, ha minden zárt térfelület kisugárzik és visszaverődik (0,5, 0,5, 0,5), akkor a kép minden pixele fehér lenne .
Két független módszerrel mintát vehet egy pont integráljából:
A kétirányú sugárkövetés egyetlen algoritmusban egyesíti a fényképezést és a gyűjtést , és ez gyorsabb képkonvergenciát eredményez (gyorsabb és kevesebb zaj). Ezt a 2 útvonalgenerálási módszert egymástól függetlenül nyomon követjük, majd a lőút elejét a nyerőút végéhez kapcsoljuk. A fény csillapítását a sugár minden egyes visszaverődésénél figyelembe veszi és képpontokban tárolja. Ez a technika első pillantásra paradox módon lassúnak tűnik, de ez annak a ténynek köszönhető, hogy egyszerre 2 utat vesz figyelembe. A gyakorlatban éppen ellenkezőleg, a kép további konvergenciája kompenzálja azokat a lassulásokat, amelyek az újabb és újabb sugarak kibocsátásának szükségessége miatt keletkeznek.
A képek konvergenciájának (konvergenciájának, közeledésének) felgyorsítása érdekében a kétirányú algoritmusok mindkét irányban nyomon követik az utakat. Előrefelé a sugarakat a fényforrásból addig követik, amíg olyan gyengék nem lesznek, hogy nem láthatók, vagy amíg el nem érik egy virtuális kamera lencséjét. A virtuális kamerából az ellenkező irányban, azaz a szokásos hagyományos irányban a sugarakat addig követjük, amíg a fényforrással ütköznek, vagy amíg visszaverődésük száma meg nem halad egy bizonyos határt. Ez a megközelítés általában olyan képet eredményez, amely sokkal gyorsabban konvergál, mintha csak egy irányt használnánk.
Veach és Guibas pontosabb leírást adtak a kétirányú útkövetésről [3] :
Ezek a módszerek két részútvonalat generálnak: az egyik a fényforrástól, a másik pedig a virtuális kamera lencséjétől indul. Ezután a <metódusok> figyelembe veszik az összes olyan útvonalat, amelyet úgy kapnak meg, hogy egy részútvonal minden előtagját összefűzik egy másik részútvonal minden utótagjával. Ez különböző fontos mintavételi technikák családjához vezet, amelyeket azután kombinálnak az eltérések minimalizálása érdekében.
Eredeti szöveg (angol)[ showelrejt]Ezek a módszerek előállítanak egy részútvonalat a fényforrástól, egy másikat pedig a lencsétől, majd figyelembe veszik az összes olyan utat, amelyet az egyik részút minden előtagjának a másik utótagjával való összekapcsolásával kapunk. Ez az útvonalak különböző fontosságú mintavételi technikáihoz vezet, amelyeket aztán kombinálnak a variancia minimalizálása érdekében.
Az útvonalkövető folyamatosan mintát vesz ( angolul mintavétel - mintavétel ) a kép képpontjaiból. A kép csak akkor válik megkülönböztethetővé, ha pixelenként több mintát vesz, legfeljebb 100 mintát pixelenként. A normál képekhez és a digitális zaj elfogadható szintre csökkentéséhez általában körülbelül 5000 mintát vesznek. A esetekben a minták száma sokkal nagyobb lesz A renderelési folyamat órákig vagy napokig tarthat a jelenet összetettségétől, valamint a hardver és szoftver teljesítményétől függően. A jelenlegi GPU -megvalósítások 1 és 10 Ms/s közötti sebességet ígérnek, ami lehetővé teszi egy viszonylag zajtalan, elfogadható minőségű kép létrehozását másodpercek vagy percek alatt. A digitális zaj különös problémát jelent az animáció számára , mivel általában nemkívánatos "szemcsés" hatást kelt a képen.
Metropolis könnyűtranszport kismértékben módosítja a korábban bevezetett sikeres utakat, és először a fontosabb mintákat állítja elő. Ez csökkentheti a képzajt és kevesebb mintát.
Meglehetősen nehéz igazságosan értékelni egy renderelő teljesítményszintjét. Az egyik megközelítés a minták másodpercenkénti számlálása, a másik pedig a nyomon követhető és a képhez hozzáadható utak számát másodpercenként. Ezeknek a módszereknek az eredménye jelenetenként jelentősen eltér, és az „útmélységtől” függ, vagyis attól, hogy a sugár hányszor verődik vissza az objektumról, mielőtt leállítaná. A teljesítménymérés eredménye nagymértékben függ a használt hardvertől is. Végül az egyik megjelenítő sok rossz minőségű mintát állíthat elő, míg egy másik gyorsabban rendereli a végső képet kevesebb jobb minőségű minta használatával.
A felületek visszaverő képességét – a visszavert fény mennyiségét, irányát és színét – kétsugaras reflexiós függvény segítségével modellezzük . Az átvitt fény (az objektumon áthaladó fény) megfelelője a kétirányú felületi reflexiós szórás függvénye ( eng. Bidirectional scattering elosztó függvény ). Az útvonalkövető teljes mértékben ki tudja használni az összetett, gondosan modellezett vagy kiszámított eloszlási függvényeket, amelyek meghatározzák egy objektum megjelenését ("anyag", "textúra" és "árnyékolás" CG-ben).