Stisporing er en gengivelsesteknik i computergrafik , der søger at simulere lysets fysiske opførsel så tæt på den virkelige ting som muligt. Stisporing er et avanceret specialtilfælde af traditionel strålesporing , hvis algoritme sporer stråler væk fra det virtuelle kamera gennem rummet; strålen "hopper" af genstande, indtil den er fuldstændig absorberet eller spredt. Kvaliteten af billeder produceret ved stisporingsmetoden er generelt bedre end kvaliteten af billeder produceret ved andre gengivelsesmetoder, men stisporing er meget mere beregningsintensiv.
Stisporing er den enkleste, mest fysisk nøjagtige og langsomste gengivelsesmetode. Stisporing gengiver naturligt mange optiske effekter, som er svære at opnå eller endda uopnåelige med andre gengivelsesteknikker : skyggelægning , dybdeskarphed , bevægelsessløring , kaustics , omgivende okklusion og indirekte belysning . Implementering af disse optiske effekter med stisporing er meget nemmere end med andre teknikker.
Baseret på dens nøjagtighed og fraværet af tilnærmelser og antagelser ( engelsk unbiased ), bruges stisporing til at generere billeder, som derefter bruges som sammenlignende prøver til at evaluere gengivelseskvaliteten af andre algoritmer. For at få billeder af høj kvalitet genereret af stisporing skal et meget stort antal stråler spores; ellers vil grafiske artefakter vises i form af støj .
Gengivelsesligningen og dens anvendelse på computergrafik blev introduceret af James Kajiya i 1986 [1] . Denne præsentation var den første beskrivelse af stisporingsalgoritmen. Senere på året foreslog Lafortune mange forbedringer af algoritmen, herunder gennem tovejssporing af sti [2] .
Metropolis light transport til at forstyrre tidligere fundne veje for at øge ydeevnen i komplekse scener, blev introduceret i 1997 af Eric Veach og Leonidas J. Guibas [ 3 ] .
Efter nogen tid nåede GPU'er et sådant udviklingsniveau, at de var i stand til at skabe interesse for dem med hensyn til at overføre stisporingsberegninger til dem. Tim Purcell var den første til at introducere en global belysningsalgoritme i 2002 , der kørte på en GPU [4] . I 2009 demonstrerede Vladimir Koilazov den første kommercielle implementering af stisporingsalgoritmen, der kører på en GPU [5] . Dette blev lettet af modningen af GPGPU -centrerede programmeringsværktøjer såsom CUDA og OpenCL .
I den virkelige verden udsendes mange små dele af lys af lyskilder og forplanter sig i lige linjer som stråler gennem mediet og fra objekt til objekt, og ændrer deres farve og intensitet. Denne "rejse" fortsætter, indtil strålerne absorberes af genstande, herunder genstande som det menneskelige øje eller et kamera. Denne stråleudbredelsesproces simuleres ved stisporing, bortset fra at strålerne spores omvendt, fra det virtuelle kamera (observatør) til lyskilden. Dette gøres på grund af det faktum, at kun en meget lille del af de stråler, der kommer fra lyskilden, rammer linsen på det virtuelle kamera, så beregningen af det overvejende flertal af strålerne påvirker ikke billedet modtaget af det virtuelle kamera. på nogen måde.
Denne adfærd er matematisk beskrevet i gengivelsesligningen . Denne ligning forsøger at løse stisporingsalgoritmer.
Stisporing er ikke simpel strålesporing med ubegrænsede strålereflektioner (dvs. rekursiv dybde). I traditionel strålesporing beregnes lys i det øjeblik, hvor strålen direkte skærer en diffus overflade. I stisporing genereres en ny stråle tilfældigt inde i objektets halvkugle og spores derefter, indtil den skærer en lyskilde, hvilket måske eller måske ikke sker. Med stisporing kan en stråles vej krydse mange diffuse overflader, før den skærer lyskilden.
Pseudokoden, der implementerer stisporing, kan se sådan ud:
Farvesporingssti ( strålestråle , tælledybde ) { _ _ _ if ( dybde >= MaxDepth ) { retur Sort ; // Bounced nok gange. } stråle . FindNærmesteObject (); if ( ray . hitSomething == falsk ) { retur Sort ; // Intet blev ramt. } Materiale materiale = stråle . thingHit -> materiale ; farveemittans = materiale . _ emission ; // Vælg en tilfældig retning herfra og fortsæt. Ray newRay ; nyRay . oprindelse = stråle . pointWhereObjWasHit ; // Dette er IKKE en cosinusvægtet distribution! nyRay . retning = RandomUnitVectorInHemisphereOf ( ray . normalWhereObjWasHit ); // Sandsynlighed for den nyeRay const float p = 1 / ( 2 * M_PI ); // Beregn BRDF for denne stråle (forudsat Lambertian refleksion) float cos_theta = DotProduct ( nyRay . retning , ray . normalWhereObjWasHit ); Farve BRDF = materiale . reflektans / M_PI ; // Spor rekursivt reflekterede lyskilder. Farve indkommende = TracePath ( newRay , dybde + 1 ); // Anvend gengivelsesligningen her. returemission + ( BRDF * indgående * cos_theta / p ) ; } void Render ( Image finalImage , count numSamples ) { foreach ( pixel i finalImage ) { foreach ( i i numSamples ) { Ray r = kamera . generereRay ( pixel ); pixel . farve += TracePath ( r , 0 ); } pixel . farve /= antalSampler ; //Gennemsnitlige prøver. } }I eksemplet ovenfor, hvis hver indelukket rumflade udstrålede og reflekterede (0.5,0.5,0.5), så ville hver pixel i billedet være hvid .
Du kan prøve integralet for et punkt ved hjælp af to uafhængige metoder:
Tovejs strålesporing kombinerer optagelse og indsamling i én algoritme, og dette resulterer i hurtigere billedkonvergens (hurtigere og mindre støj). Disse 2 stigenereringsmetoder spores uafhængigt af hinanden, og derefter forbindes begyndelsen af skydestien med halen af stigningsstien. Dæmpningen af lys ved hvert afkast af strålen tages i betragtning og lagres i billedpixel. Denne teknik virker ved første øjekast paradoksalt langsom, men det skyldes, at 2 stier betragtes på én gang. I praksis, tværtimod, kompenserer den ekstra konvergenshastighed af billedet for de opbremsninger, der opstår på grund af behovet for at frigive flere og flere nye stråler.
For at fremskynde konvergensen (konvergens, tilnærmelse) af billeder sporer tovejsalgoritmer stier i begge retninger. I fremadgående retning spores stråler fra lyskilden, indtil de er så svage, at de ikke kan ses, eller indtil de rammer linsen på et virtuelt kamera. I den modsatte retning, dvs. den konventionelle standardretning, spores strålerne fra det virtuelle kamera, indtil de kolliderer med lyskilden, eller indtil antallet af deres refleksioner overstiger en vis grænse. Denne tilgang resulterer normalt i et billede, der konvergerer meget hurtigere end kun at bruge én retning.
Veach og Guibas gav en mere præcis beskrivelse af bidirektionel stisporing [3] :
Disse metoder genererer to understier: den ene starter fra lyskilden, og den anden starter fra linsen på det virtuelle kamera. Derefter betragter de <metoder> alle stier, der opnås ved at sammenkæde hvert præfiks på en understi med hvert suffiks i en anden understi. Dette fører til en familie af forskellige vigtige prøvetagningsteknikker, som derefter kombineres for at minimere uoverensstemmelser.
Originaltekst (engelsk)[ Visskjule]Disse metoder genererer en undervej, der starter ved en lyskilde og en anden, der starter ved linsen, og overvej derefter alle de stier, der opnås ved at forbinde hvert præfiks i den ene undervej til hvert suffiks af den anden. Dette fører til en familie af forskellig betydning prøvetagningsteknikker for stier, som derefter kombineres for at minimere varians.
Stisporeren prøver konstant ( engelsk sampling - sampling ) pixels af billedet. Billedet kan kun skelnes, når der tages flere prøver pr. pixel, op til 100 prøver pr. pixel. For normale billeder og for at reducere digital støj til et acceptabelt niveau tages der som regel omkring 5000 prøver. Men for tilfælde antallet af prøver meget større Gengivelsesprocessen kan tage timer eller dage afhængigt af scenens kompleksitet og ydeevnen af hardware og software. Nuværende GPU- implementeringer lover mellem 1 og 10 Ms/s, hvilket gør det muligt at generere et relativt støjfrit billede af acceptabel kvalitet inden for sekunder eller minutter. Digital støj udgør et særligt problem for animation , hvilket skaber en generelt uønsket "kornet" effekt i et billede.
lystransportgruppe metoder ændrer en smule de tidligere vellykkede stier og producerer først de mere billedvigtige prøver. Dette kan resultere i reduceret billedstøj og færre prøver.
Det er ret svært at vurdere en renderers ydeevne. Den ene tilgang er at tælle prøver pr. sekund, den anden tæller antallet af stier, der kan spores og tilføjes til billedet pr. sekund. Resultaterne af disse metoder varierer betydeligt fra scene til scene og afhænger af "banedybde", det vil sige hvor mange gange strålen får lov til at hoppe af objektet, før den stoppes. Resultatmåleresultatet er også meget afhængigt af den anvendte hardware. Endelig kan en renderer producere mange prøver af lav kvalitet, mens en anden kan gengive det endelige billede hurtigere ved at bruge færre prøver af højere kvalitet.
Overfladernes reflektionsevne - mængden af reflekteret lys, dets retning og farve - modelleres ved hjælp af en tostrålereflektansfunktion . Ækvivalenten til det overførte lys (det lys, der er passeret gennem objektet) er funktionen af tovejs overfladereflektionsspredning ( eng. Bidirektional spredningsfordelingsfunktion ). Stisporeren kan drage fuld fordel af de komplekse, omhyggeligt modellerede eller beregnede distributionsfunktioner, der definerer udseendet ("materiale", "tekstur" og "skygge" i CG-termer) af et objekt.