Path tracing är en renderingsteknik i datorgrafik som försöker simulera ljusets fysiska beteende så nära den verkliga varan som möjligt. Path tracing är ett avancerat specialfall av traditionell ray tracing , vars algoritm spårar strålar från en virtuell kamera genom rymden; strålen "studsar" av föremål tills den är helt absorberad eller spridd. Kvaliteten på bilder som produceras med vägspårningsmetoden är i allmänhet bättre än kvaliteten på bilder som produceras med andra renderingsmetoder, men vägspårning är mycket mer beräkningsintensivt.
Banspårning är den enklaste, mest fysiskt exakta och långsammaste renderingsmetoden. Banspårning återger naturligt många optiska effekter som är svåra att uppnå eller till och med ouppnåeliga med andra renderingstekniker : skuggning , skärpedjup , rörelseoskärpa , kaustik , omgivande ocklusion och indirekt belysning . Att implementera dessa optiska effekter med banspårning är mycket lättare än med andra tekniker.
Baserat på dess noggrannhet och frånvaron av approximationer och antaganden ( engelska unbiased ), används sökvägsspårning för att generera bilder, som sedan används som jämförande prov för att utvärdera renderingskvaliteten hos andra algoritmer. För att få högkvalitativa bilder som genereras av banspårning måste ett mycket stort antal strålar spåras; annars kommer grafiska artefakter att dyka upp i form av brus .
Återgivningsekvationen och dess tillämpning på datorgrafik introducerades av James Kajiya 1986 [1] . Denna presentation var den första beskrivningen av sökvägspårningsalgoritmen. Senare under året föreslog Lafortune många förbättringar av algoritmen, inklusive genom dubbelriktad spårning av vägar [2] .
Metropolis light transport för att störa tidigare hittade vägar för att öka prestanda i komplexa scener, introducerades 1997 av Eric Veach och Leonidas J. Guibas [ 3 ] .
Efter en tid nådde GPU:er en sådan utvecklingsnivå att de kunde skapa intresse för dem när det gäller att överföra sökvägsberäkningar till dem. Tim Purcell var den första som introducerade en global belysningsalgoritm 2002 som kördes på en GPU [4] . 2009 demonstrerade Vladimir Koilazov den första kommersiella implementeringen av sökvägspårningsalgoritmen som körs på en GPU [5] . Detta underlättades av mognaden av GPGPU -centrerade programmeringsverktyg som CUDA och OpenCL .
I den verkliga världen sänds många små delar av ljus ut av ljuskällor och fortplantar sig i raka linjer som strålar genom mediet och från föremål till föremål, och ändrar deras färg och intensitet. Denna "resa" fortsätter tills strålarna absorberas av föremål, inklusive föremål som det mänskliga ögat eller en kamera. Denna strålutbredningsprocess simuleras genom banspårning, förutom att strålarna spåras omvänt, från den virtuella kameran (observatören) till ljuskällan. Detta görs på grund av det faktum att endast en mycket liten del av de strålar som kommer från ljuskällan träffar linsen på den virtuella kameran, så beräkningen av den övervägande majoriteten av strålarna påverkar inte bilden som tas emot av den virtuella kameran på något sätt.
Detta beteende beskrivs matematiskt i renderingsekvationen . Denna ekvation försöker lösa vägspårningsalgoritmer.
Banspårning är inte enkel strålspårning med obegränsade strålreflektioner (dvs. rekursivt djup). I traditionell strålspårning beräknas ljus i det ögonblick som strålen direkt skär en diffus yta. Vid banspårning genereras en ny stråle slumpmässigt inuti objektets halvklot och spåras sedan tills den skär en ljuskälla, vilket kan hända eller inte. Med banspårning kan en stråles väg korsa många diffusa ytor innan den skär ljuskällan.
Pseudokoden som implementerar sökvägsspårning kan se ut så här:
Färgspårväg ( Strålstråle , räknedjup ) { _ _ _ if ( djup >= MaxDepth ) { returnera Svart ; // Studsade tillräckligt många gånger. } ray . FindNearestObject (); if ( ray . hitSomething == false ) { returnera Svart ; // Inget träffades. } Material material = stråle . thingHit -> material ; färgemittans = material . _ utsläpp ; // Välj en slumpmässig riktning härifrån och fortsätt. Ray newRay ; newRay . ursprung = stråle . pointWhereObjWasHit ; // Detta är INTE en cosinusvägd distribution! newRay . direction = RandomUnitVectorInHemisphereOf ( ray . normalWhereObjWasHit ); // Sannolikhet för newRay const float p = 1 / ( 2 * M_PI ); // Beräkna BRDF för denna stråle (om vi antar Lambertsreflektion) float cos_theta = DotProduct ( newRay . direction , ray . normalWhereObjWasHit ); Färg BRDF = material . reflektans / M_PI ; // Spåra rekursivt reflekterade ljuskällor. Färg inkommande = TracePath ( newRay , djup + 1 ); // Använd renderingsekvationen här. returemittans + ( BRDF * inkommande * cos_theta / p ) ; } void Render ( Image finalImage , count numSamples ) { foreach ( pixel i finalImage ) { foreach ( i in numSamples ) { Ray r = kamera . genereraRay ( pixel ); pixel . färg += Spårväg ( r , 0 ); } pixel . färg /= numSamples ; //Genomsnittliga prover. } }I exemplet ovan, om varje inneslutet utrymmesyta strålade ut och reflekterades (0.5,0.5,0.5), skulle varje pixel i bilden vara vit .
Du kan prova integralen för en punkt med två oberoende metoder:
Dubbelriktad strålspårning kombinerar fotografering och insamling i en algoritm och detta resulterar i snabbare bildkonvergens (snabbare och mindre brus). Dessa 2 väggenereringsmetoder spåras oberoende och sedan ansluts början av skjutbanan till svansen av vinstbanan. Ljusdämpningen vid varje studs av strålen tas med i beräkningen och lagras i bildpixlar. Denna teknik verkar vid första anblicken paradoxalt långsam, men detta beror på det faktum att 2 vägar övervägs samtidigt. I praktiken, tvärtom, kompenserar bildens ytterligare konvergenshastighet för de nedgångar som uppstår på grund av behovet av att släppa ut fler och fler nya strålar.
För att påskynda konvergensen (konvergens, närmande) av bilder spårar dubbelriktade algoritmer vägar i båda riktningarna. I riktning framåt spåras strålar från ljuskällan tills de är så svaga att de inte kan ses, eller tills de träffar linsen på en virtuell kamera. I motsatt riktning, dvs den vanliga konventionella riktningen, spåras strålarna från den virtuella kameran tills de kolliderar med ljuskällan, eller tills antalet reflektioner överstiger en viss gräns. Detta tillvägagångssätt resulterar vanligtvis i en bild som konvergerar mycket snabbare än att använda endast en riktning.
Veach och Guibas gav en mer exakt beskrivning av dubbelriktad vägspårning [3] :
Dessa metoder genererar två undervägar: en som börjar från ljuskällan och den andra börjar från den virtuella kamerans lins. Sedan överväger de <metoder> alla sökvägar som erhålls genom att sammanfoga varje prefix för en underväg med varje suffix i en annan underväg. Detta leder till en familj av olika viktiga provtagningstekniker, som sedan kombineras för att minimera avvikelser.
Originaltext (engelska)[ visaDölj]Dessa metoder genererar en delväg som börjar vid en ljuskälla och en annan som börjar vid linsen, överväg sedan alla vägar som erhålls genom att förena varje prefix i en delväg till varje suffix i den andra. Detta leder till en familj av olika viktiga samplingstekniker för banor, som sedan kombineras för att minimera variansen.
Banspåraren samplar ständigt ( engelska sampling - sampling ) pixlar av bilden. Bilden blir urskiljbar först när flera sampel per pixel tas, upp till 100 sampel per pixel. För normala bilder och för att reducera digitalt brus till en acceptabel nivå tas som regel cirka 5000 prover. Men för fall antalet prover mycket större Återgivningsprocessen kan ta timmar eller dagar beroende på scenens komplexitet och prestanda hos hårdvaran och mjukvaran. Nuvarande GPU- implementationer lovar mellan 1 och 10 Ms/s, vilket gör det möjligt att generera en relativt brusfri bild av acceptabel kvalitet inom några sekunder eller minuter. Digitalt brus utgör ett särskilt problem för animering , vilket skapar en allmänt oönskad "kornig" effekt i en bild.
-ljustransportgruppen metoder modifierar de tidigare framgångsrika vägarna något och producerar de mer bildviktiga proverna först. Detta kan resultera i minskat bildbrus och färre sampel.
Det är ganska svårt att rättvist utvärdera prestandanivån för en renderare. Ett tillvägagångssätt är att räkna prover per sekund, det andra räknar antalet vägar som kan spåras och läggas till bilden per sekund. Resultaten av dessa metoder varierar avsevärt från scen till scen och beror på "vägdjup", det vill säga hur många gånger strålen tillåts studsa av föremålet innan den stoppas. Prestandamätningsresultatet är också starkt beroende av vilken hårdvara som används. Slutligen kan en renderare producera många sampel av låg kvalitet, medan en annan kan rendera den slutliga bilden snabbare med färre sampel av högre kvalitet.
Ytornas reflektionsförmåga – mängden reflekterat ljus, dess riktning och färg – modelleras med hjälp av en tvåstrålereflektansfunktion . Motsvarigheten till det överförda ljuset (ljuset som har passerat genom objektet) är funktionen av dubbelriktad ytreflektionsspridning ( eng. Bidirektional spridningsfördelningsfunktion ). Banspåraren kan dra full nytta av de komplexa, noggrant modellerade eller beräknade distributionsfunktionerna som definierar ett objekts utseende ("material", "textur" och "skuggning" i CG-termer).