Hur fungerar ray tracing?

När det kommer till att använda ray tracing finns två huvudtyper, där avgörande är utgångspunkten för ljusstrålarna. Dessa heter forward ray tracing och backward ray tracing, namn som är rätt självförklarande och lätt att göra skillnad på.

Forward ray tracing

Forward ray tracing är när ljuskällorna i scenen är bas för utsända strålar, vilket är analogt med hur processen fungerar i verkliga livet – ljus från solen, lampor, ljus och dylikt, träffar ytor. Fördelen med denna variant är att i princip alla ljusfenomen trillar ut automatiskt.

Nackdelen är dock så stor att metoden knappt används i praktiken. Majoriteten av alla strålar som utgår från ljuskällorna kommer inte bidra till det som visas på skärmen, varför metoden har väldigt låg beräkningseffektivitet. Med andra ord är den prestandakrävande.

Backward ray tracing

Den andra varianten kallas backward ray tracing och här är processen just bakvänd. Strålarna utgår ifrån ögat eller kameran och genom det plan som utgör pixlarna på skärmen. Det finns vissa ljusfenomen som kräver specialhantering för rätt effekt, men en beskrivning av detta är långt utanför vad en sådan här artikel kan täcka in.

Stora fördelen med backward ray tracing är att bara strålar som påverkar vad som visas på skärmen beräknas. Det är fortfarande en metod som kräver väldigt mycket prestanda, men inte alls till samma grad som forward ray tracing.

Denna artikel förutsätter konsekvent backward ray tracing. Det är den metod som används i renderingsprogram, är också det enda realistiska alternativet för spel. Även med backward ray tracing är mängden beräkningar som måste utföras på en extremt utmanande nivå om det ska utföras i realtid.

Huvudstråle

En tilltalade egenskap hos ray tracing är att grundalgoritmen är riktigt simpel:

primary_ray.PNG

Skicka en stråle från "ögat" genom varje pixel på skärmen vidare in i scenen. För varje stråle bestäms vilken yta strålen först träffar.

Primärstråle (eng. primary ray), en typ av stråle som också kallas för kamera- eller ögon-stråle (eng. camera ray, eye ray). Färgen på ytan avgörs av dess absorption av RGB-komponenterna (röd, grön, blå), något som rent praktiskt bestäms av till exempel en textur.

Tyvärr räcker inte primärstrålar. Om bara primärstrålar används blir resultatet det samma som rastrering innan shaders för ljussättning applicerats. Det vill säga en rätt platt bild där färgen på objekt enbart utgörs av ytans färg och textur.

Alla stråltyper som beskrivs nedan har samma utgångspunkt. De startar från den punkt där primärstrålen träffade en yta.

Skuggor

Nvidias VD, Jensen Huang, lade mycket energi på att prata om halvskuggor (eng. penumbra) när han tillkännagav Geforce RTX-serien. Att realistiska skuggor mer eller mindre faller ut av sig själva är en av flera trevliga egenskaper hos ray tracing.

penumbra_cycles.png

Cylindern belyses här av en stor klotformad ljuskälla, som är befinner sig nära- Skuggan blir därför riktigt mjuk

För att avgöra om ett objekt befinner sig i skugga eller inte, skickas en skuggstråle (eng. shadow ray) ut i riktning mot varje ljuskälla i scenen. Redan här går det kanske ana problematiken med mängden beräkningar – antalet primärstrålar multipliceras med antalet ljuskällor i detta steg.

Om skuggstrålen träffar ett annat objekt på vägen mot ljuskällan befinner sig ytan i skugga.

non_shadow.png

Om träffpunkten "ser" till ljuskälla är den punkten inte i skugga ...

in_shadow.png

... men om något är i vägen faller en skugga där.

half_shadow.png

Halvskugga uppstår om ljuskällan har stor utbredning så vissa områden bara delvis skyms av andra objekt, flera skuggstrålar måste skickas ut om ljuskällan har en area.

Ljuskällor som befinner sig på väldigt stor avstånd, till exempel en tilltänkt sol, samt ljuskällor som är en enda punkt, ingen area, är de billigaste att hantera. Dessa ger upphov till skarpa skuggor.

Halvskuggor orsakas av ljuskällor som har area och som befinner sig relativt nära punkten där skuggan kastas.

glass_monkey.png

Exempel på brusig halvskugga då det krävs extremt många skuggstrålar för att få det bra direkt.

glass_monkey_denoise.png

I praktiken hanteras brus i exempelvis halvskuggor med hjälp av post-processing-filter.

Tyvärr är effekten från en sådana ljuskälla dyrare att beräkna då det krävs flera skuggstrålar från samma startpunkt riktade mot olika delar av ljuskällans area. Halvskuggor orsakas av att vissa strålar når ljuskällan medan andra skyms av mellanliggande objekt.

Reflektion

Blanka metallytor är lite av ett signum för tekniken. Orsaken ligger föga oväntat i att perfekt blanka ytor är väsentligt beräkningsmässigt billigare att hantera jämfört med matta ytor. Ett problem med med ray tracing är scener lätt uppfattas som onaturligt rena och välpolerade.

reflection.png

I skolfysiken lärde man sig att infallsvinkel är lika med utfallsvinkel, vilket är precis mekanismen bakom reflektion av blanka ytor.

Inkommande primärstråle studsar på ytan och fortsätter som en reflekterad stråle.

Ytans absorptionsegenskaper påverkar naturligtvis färgen på de reflekterade strålarna. Ray tracing ger därför automatiskt effekten där till exempel en stark rödfärgat objekt ger ett rött lyster till vita omgivande väggar.

metal_monkey.png

Lika blank som Arnolds nemesis i Terminator 2, perfekt blanka ytor är de billigaste att hantera

Ytor som inte är perfekt blanka ger en diffus reflektion. På algoritmnivå måste man modellera detta med att en inkommande stråle ger upphov till många reflektionsstrålar, vars utfallsvinklar slumpmässigt avviker från vad en blank yta ger. Återigen något som är beräkningsmässigt dyrt då den likt mjuka skuggor leder till en multiplikatoreffekt av antalet strålar som måste hanteras.

Refraktion

Det här är den effekt som får botten av en sjö att se närmare ut än vad som är fallet och som leder till att saker bakom en glasbehållare böjer sig. Refraktion är något man kan ha kommit i kontakt med i skolfysiken, utgångsvinkeln in i ett tätare material, till exempel från luft till glas, är mindre än ingångsvinkeln.

sphere_refraction.png

Sfärer kan få bilden att vända på sig, likt hur våra ögon fungerar.

square_refraction.png

En glaskub kan förskjuta bilden i sidled.

Glasblock ger en parallellförskjutning av strålarna. Glaskulor ger riktigt märkliga förskjutningar av strålarna, som att bilden hamnar upp-och-ned eller blir förvanskad på andra sätt.

refraction.png

Raka linjer (strålar) böjer sig i kanterna av glascylindern

Effekterna från refraktion trillar ut helt automatiskt med ray tracing, medan det är riktigt utmanande att simulera det i traditionell rastrering.

Fullständig process för ray tracing

Slutresultatet blir en algoritm som inte är riktigt så enkel som beskrivningen för primärstråle. Men jämfört med att nå liknande resultat med rastrering är det trots allt en väldigt enkelt metod.

  • Skicka en stråle från "ögat" genom varje pixel på skärmen vidare in i scenen. För varje stråle bestäms vilken yta strålen först träffar.

  • När närmaste träff är hittad, skicka ut skuggstrålar mot ljuskällor och reflektions samt refraktionstrålar beroende på aktuell egenskap hos den träffade ytan.

Där är egentligen hela beskrivningen av en modern ray tracer, oavsett om målet är filmrendering eller ray-tracing i realtid för spel. I denna artikel görs inte någon distinktion mellan ray casting, ray tracing och path tracing. De är alla baserade på samma grundalgoritm.

Ray casting är fallet när bara primärstrålar används medan man med path tracing refererar till fallet där massor med skugg- eller reflektions-strålar genereras för att ge effekter som halvskuggor och diffusa reflektioner.