Trasarea traseului este o tehnică de randare în grafica computerizată care încearcă să simuleze comportamentul fizic al luminii cât mai aproape de lucrul real posibil. Urmărirea traseului este un caz special avansat de urmărire tradițională a razelor al cărui algoritm urmărește razele departe de camera virtuală prin spațiu; fasciculul „sare” de pe obiecte până când este complet absorbit sau împrăștiat. Calitatea imaginilor produse prin metoda de urmărire a căii este în general mai bună decât calitatea imaginilor produse prin alte metode de randare, dar trasarea căii este mult mai intensivă din punct de vedere al calculului.
Trasarea căilor este cea mai simplă, mai precisă din punct de vedere fizic și cea mai lentă metodă de randare. Trasarea traseului reproduce în mod natural multe efecte optice care sunt greu de realizat sau chiar de neatins cu alte tehnici de randare: umbrire , adâncime de câmp, estompare a mișcării , caustice , ocluzie ambientală și iluminare indirectă . Implementarea acestor efecte optice cu trasarea traseului este mult mai ușoară decât cu alte tehnici.
Pe baza acurateței sale și a absenței aproximărilor și ipotezelor ( în engleză imparțială ), trasarea căilor este utilizată pentru a genera imagini, care sunt apoi folosite ca mostre comparative pentru a evalua calitatea redării altor algoritmi. Pentru a obține imagini de înaltă calitate generate de trasarea traseului, trebuie urmărit un număr foarte mare de raze; în caz contrar, artefactele grafice vor apărea sub formă de zgomot .
Ecuația de randare și aplicarea ei în grafica computerizată a fost introdusă de James Kajiya în 1986 [1] . Această prezentare a fost prima descriere a algoritmului de urmărire a căii. Mai târziu în cursul anului, Lafortune a propus multe îmbunătățiri ale algoritmului, inclusiv prin trasarea căii bidirecționale [2] .
Transportul ușor Metropolis de perturbare a căilor găsite anterior pentru a crește performanța în scene complexe, a fost introdusă în 1997 de Eric Veach și Leonidas J. Guibas [ 3 ] .
După ceva timp, GPU -urile au atins un astfel de nivel de dezvoltare încât au putut să genereze interes pentru ele în ceea ce privește transferul calculelor de urmărire a căilor către ele. Tim Purcell a fost primul care a introdus un algoritm global de iluminare în 2002 care rula pe un GPU [4] . În 2009, Vladimir Koilazov a demonstrat prima implementare comercială a algoritmului de urmărire a căii care rulează pe un GPU [5] . Acest lucru a fost facilitat de maturizarea instrumentelor de programare centrate pe GPGPU , cum ar fi CUDA și OpenCL .
În lumea reală, multe porțiuni mici de lumină sunt emise de sursele de lumină și se propagă în linii drepte ca raze prin mediu și de la obiect la obiect, schimbându-și culoarea și intensitatea. Această „călătorie” continuă până când razele sunt absorbite de obiecte, inclusiv de obiecte precum ochiul uman sau o cameră. Acest proces de propagare a razelor este simulat prin trasarea traseului, cu excepția faptului că razele sunt urmărite invers, de la camera virtuală (observator) la sursa de lumină. Acest lucru se realizează datorită faptului că doar o foarte mică parte din acele raze care provin de la sursa de lumină lovesc lentila camerei virtuale, astfel încât calculul majorității predominante a razelor nu afectează imaginea primită de camera virtuală. in orice fel.
Acest comportament este descris matematic în ecuația de redare . Această ecuație încearcă să rezolve algoritmi de trasare a căii.
Trasarea traseului nu este o simplă urmărire a razelor cu reflexii nelimitate de rază (adică adâncime recursivă). În trasarea razelor tradiționale, lumina este calculată în momentul în care raza intersectează direct o suprafață difuză. În trasarea traseului, o nouă rază este generată aleatoriu în interiorul emisferei obiectului și apoi urmărită până când se intersectează cu o sursă de lumină, ceea ce se poate întâmpla sau nu. Cu trasarea traseului, calea unei raze se poate intersecta cu multe suprafețe difuze înainte de a se intersecta cu sursa de lumină.
Pseudocodul care implementează trasarea căilor ar putea arăta astfel:
Color TracePath ( rază de raze , adâncime de numărare ) { if ( adâncime >= MaxDepth ) { întoarce Negru ; // A sărit de destule ori. } raza . Find NearestObject (); if ( rază . hitSomething == false ) { întoarce Negru ; // Nu a fost lovit nimic. } Material material = raza . thingHit -> material ; emisie de culoare = material . emisie ; // Alegeți o direcție aleatorie de aici și continuați. Ray newRay ; nouRay . origine = rază . pointWhereObjWasHit ; // Aceasta NU este o distribuție ponderată în cosinus! nouRay . direction = RandomUnitVectorInHemisphereOf ( raza . normalWhereObjWasHit ); // Probabilitatea nouluiRay const float p = 1 / ( 2 * M_PI ); // Calculați BRDF pentru această rază (presupunând reflexia Lambertiană) float cos_theta = DotProduct ( newRay . direction , ray . normalWhereObjWasHit ); Culoare BRDF = material . reflectanță / M_PI ; // Urmează recursiv sursele de lumină reflectate. Culoare primită = TracePath ( newRay , adâncime + 1 ); // Aplicați ecuația de redare aici. returnare emitanță + ( BRDF * incoming * cos_theta / p ); } void Render ( Imagine finalImage , count numSamples ) { foreach ( pixel în finalImage ) { foreach ( i în numSamples ) { Raza r = aparat de fotografiat . generateRay ( pixel ); pixel . culoare += TracePath ( r , 0 ); } pixel . culoare /= numSamples ; //Probleme medii. } }În exemplul de mai sus, dacă fiecare suprafață a spațiului închis a radiat și reflectat (0,5, 0,5, 0,5), atunci fiecare pixel din imagine ar fi alb .
Puteți eșantiona integrala pentru un punct folosind două metode independente:
Urmărirea razei bidirecționale combină filmarea și colectarea într-un singur algoritm, ceea ce are ca rezultat o convergență mai rapidă a imaginii (mai rapidă și mai puțin zgomot). Aceste 2 metode de generare a căii sunt urmărite independent și apoi începutul căii de tragere este conectat la coada căii de câștig. Atenuarea luminii la fiecare respingere a fasciculului este luată în considerare și stocată în pixeli de imagine. Această tehnică pare la prima vedere paradoxal de lentă, dar acest lucru se datorează faptului că sunt luate în considerare 2 căi deodată. În practică, dimpotrivă, rata suplimentară de convergență a imaginii compensează încetinirile care apar din cauza necesității de a elibera tot mai multe raze noi.
Pentru a accelera convergența (convergența, apropierea) imaginilor, algoritmii bidirecționali trasează căi în ambele direcții. În direcția înainte, razele sunt urmărite de la sursa de lumină până când sunt atât de slabe încât nu pot fi văzute sau până când lovesc obiectivul unei camere virtuale. În direcția opusă, adică în direcția convențională standard, razele sunt urmărite de la camera virtuală până când se ciocnesc de sursa de lumină sau până când numărul reflexiilor lor depășește o anumită limită. Această abordare are ca rezultat, de obicei, o imagine care converge mult mai rapid decât folosind o singură direcție.
Veach și Guibas au oferit o descriere mai precisă a trasării căilor bidirecționale [3] :
Aceste metode generează două subcăi: una pornind de la sursa de lumină, iar cea de-a doua pornind de la obiectivul camerei virtuale. Apoi, ei <metode> iau în considerare toate căile care sunt obținute prin concatenarea fiecărui prefix al unei subcăi cu fiecare sufix al altei subcăi. Acest lucru conduce la o familie de diferite tehnici de eșantionare importante, care sunt apoi combinate pentru a minimiza discrepanțele.
Text original (engleză)[ arataascunde]Aceste metode generează o subcăi pornind de la o sursă de lumină și alta pornind de la lentilă, apoi iau în considerare toate căile obținute prin unirea fiecărui prefix al unei subcăi la fiecare sufix al celeilalte. Acest lucru conduce la o familie de tehnici de eșantionare de importanță diferită pentru căi, care sunt apoi combinate pentru a minimiza varianța.
Trasarea traseului prelevează în mod constant ( eșantionare în engleză - eșantionare ) pixeli ai imaginii. Imaginea devine distinsă numai atunci când sunt luate mai multe mostre per pixel, până la 100 de mostre per pixel. De regulă, pentru imagini normale și pentru a reduce zgomotul digital la un nivel acceptabil, se prelevează aproximativ 5000 de mostre. Cu toate acestea, pentru cazurile numărul de probe devine mult mai mare Procesul de randare poate dura ore sau zile, în funcție de complexitatea scenei și de performanța hardware-ului și software-ului. Implementările actuale de GPU promit între 1 și 10 Ms/s, făcând posibilă generarea unei imagini relativ fără zgomot de calitate acceptabilă în câteva secunde sau minute. Zgomotul digital pune o problemă specială pentru animație , creând un efect „granulos” în general nedorit într-o imagine.
metode transport ușor Metropolis modifică ușor căile de succes direcționate anterior și produc mai întâi mostrele mai importante pentru imagine. Acest lucru poate duce la zgomot redus al imaginii și mai puține mostre.
Este destul de dificil să evaluezi corect nivelul de performanță al unui dispozitiv de redare. O abordare este de a număra mostre pe secundă, cealaltă numără numărul de căi care pot fi urmărite și adăugate imaginii pe secundă. Rezultatele acestor metode variază considerabil de la scenă la scenă și depind de „adâncimea căii”, adică de câte ori i se permite fasciculului să sară de pe obiect înainte de a fi oprit. Rezultatul măsurării performanței este, de asemenea, foarte dependent de hardware-ul utilizat. În cele din urmă, un randament poate produce multe mostre de calitate scăzută, în timp ce altul poate reda imaginea finală mai rapid folosind mai puține mostre de calitate superioară.
Reflexivitatea suprafețelor - cantitatea de lumină reflectată, direcția și culoarea acesteia - este modelată folosind o funcție de reflectare cu două fascicule . Echivalentul luminii transferate (lumina care a trecut prin obiect) este funcția de împrăștiere a reflexiei de suprafață bidirecțională ( de exemplu, funcție de distribuție a împrăștierii bidirecționale ) . Trasatorul de traseu poate profita din plin de funcțiile de distribuție complexe, atent modelate sau calculate, care definesc aspectul („material”, „textură” și „umbrire” în termeni CG) al unui obiect.