# Raytracing

Ray tracing of raytracing is een methode waarmee een digitale scène met virtuele driedimensionale objecten "gefotografeerd" wordt, met als doel een (tweedimensionale) afbeelding te verkrijgen. Daarbij kunnen aan alle afzonderlijke objecten specifieke eigenschappen toegekend worden, zoals kleur, textuur, mate van spiegeling (van mat tot glanzend) en doorschijnendheid (transparantie). Afhankelijk van het gebruikte programma kan zonlicht en/of kunstlicht gesimuleerd worden bij het genereren van de gewenste afbeelding, al dan niet in combinatie met weersomstandigheden zoals mist. Daarnaast kan de virtuele camera ingesteld worden. Bij een aantal programma‘s lijken deze instellingen veel op die van digitale camera’s.
Bij een digitale camera valt in de echte wereld het licht vanuit de lichtbron op de camerasensor en wordt dan geregistreerd. Bij raytracing gebeurt het omgekeerde: kleur, intensiteit en dergelijke worden voor iedere pixel bepaald door de (licht)straal vanaf het virtuele brandpunt te volgen tot aan de oorspronkelijke lichtbron (dit proces heet tracing). Onderweg kan de straal weerkaatst worden door een of meerdere objecten, met een effect op de intensiteit en de kleur van de betreffende pixel. De uiteindelijke afbeelding wordt opgebouwd uit een groot aantal van dit soort pixels.
Klassieke raytracing wordt vanwege de tekortkomingen sinds ongeveer 2010 minder gebruikt, in plaats daarvan wordt pathtracing gebruikt.

## Klassieke raytracing

Raytracing als rendermethode bestaat al sinds het begin van het Computergraphics-onderzoek. Om het concept van raytracing goed te begrijpen moet er gedacht worden vanuit de resulterende afbeelding, niet vanuit de scène. De resulterende afbeelding is een letterlijke optelsom van alles wat effect heeft op elk van de pixels. Het algoritme gaat pixel-voor-pixel de afbeelding af. Bij elke pixel wordt er vanuit de camera een ray, een straal, de scène ingeschoten.
De straal zal een object op één punt in de scène raken. Vanaf dat punt wordt gekeken wat er verder gebeurt. Het materiaal op dat punt bepaalt de vervolgstappen. Zijn er bijvoorbeeld in de scène lampen aanwezig, en hebben die invloed op dat punt, dan wordt berekend wat het effect is van die lamp op dat punt. Dat effect hangt af van de afstand tot de lamp, en de hoek van het oppervlak ten opzichte van de lamp.
Tel de invloeden van elke lichtbron bij elkaar op, herhaal dit voor elke pixel, en het resultaat is een "foto" van de scène.

#### Schaduw

Niet alleen de afstand van de lamp en de hoek bepalen het effect van een lamp op een punt, het licht kan onderweg ook tegengehouden worden door een ander object. Hiervoor wordt een tweede ray getraced, dit keer vanaf de lamp naar het punt. Wordt de straal onderbroken, dan is dat punt in de schaduw van de lamp.

#### Reflectie

Reflectie is het weerkaatsen van een ray. Dit kan gedaan worden door een nieuwe ray te tracen op het eerste punt. Deze ray resulteert in een nieuw punt, waarna het proces, afhankelijk van het materiaal, herhaald wordt. Al deze resultaten worden gewogen en bij elkaar opgeteld voor het uiteindelijke resultaat. Dit kan in theorie eindeloos doorgaan, dus meestal wordt het proces tot een bepaald aantal beperkt.

#### Refractie

Refractie is het breken van licht op een grensvlak. Bij transparante materialen, zoals glas en water, gebeurt dit. De refractie van een straal kan berekend worden door een nieuwe straal te creëren op de plaats van het passeren van het grensvlak met de richting van de gebroken straal. In het voorbeeld is refractie weergegeven met behulp van twee lenzen.

### Tekortkomingen

De bovengenoemde effecten resulteren allemaal in harde afbeeldingen. Een punt wordt óf wel óf niet belicht door een lichtbron. Zachtere effecten, zoals doffe reflecties, zachte schaduwen, en omgevingslicht moeten op een andere manier berekend worden. Elk van deze problemen is individueel op te lossen, door elke pixel meerdere keren te evalueren. Door een lamp niet te zien als een punt, maar als een bol, kan het effect van een penumbra worden bereikt. Hiervoor moeten meerdere rays getraced worden in willekeurige richtingen. Om ruis in de uiteindelijke afbeelding tegen te gaan moet dit per effect ruim tientallen keren herhaald worden.

#### Globale verlichting

De grootste tekortkoming van klassiek raytracen is misschien wel Global Illumination. Met deze methode wordt elk punt belicht door alles in de omgeving. Licht kan van een lamp op een oppervlak weerkaatsen, waarna het op een ander oppervlak weerkaatst, en uiteindelijk in de lens terecht komt. Dit effect is zeer belangrijk voor een natuurlijk ogende foto. Om dit te bereiken moeten heel veel willekeurige rays de ruimte in worden gestuurd.
Er zijn verschillende manieren om dit te doen;
* Achterwaarts pad volgen (Backward Path Tracing)
* Voorwaarts pad volgen (Forward Path Tracing)
* Metropolis Light Transport
* Photon mapping

## Path tracing

Sinds ongeveer 2015 is path tracing de meer gangbare manier van het renderen van een 3D-scène. Het concept is grotendeels hetzelfde, en de grens tussen klassiek raytracen en path tracing is niet altijd scherp.
Bij path tracing wordt de ambitie om met één straal een schoon, ruisloos plaatje te genereren losgelaten, en wordt elk van de belichtingseffecten via een Monte-Carlosimulatie vervaardigd. Dat wil zeggen dat er altijd willekeurige rays uitgeschoten worden om ook de indirecte belichting van een scène mee te nemen.
Het resultaat is dat na de eerste set uitgeschoten rays het beeld vol ruis zit. Per pixel worden wel honderden rays uitgezonden, en elk van deze rays kan meerdere keren verder weerkaatsen. Het (soms gewogen) gemiddelde van al deze rays levert op den duur een ruisloos ogende afbeelding op.
Er is onderzoek gedaan naar manieren om materialen nog realistischer te simuleren, het path tracen zelf te versnellen, en naar ruisonderdrukking om het aantal samples te beperken.

## Raytracing in Videogames

Raytracing is een proces dat een hoop rekenkracht vereist. Met de komst van NVIDIA's RTX-reeks videokaarten, en de toevoeging van DXR aan Microsoft's DirectX, wordt raytracing steeds vaker toegepast in computerspellen. Toegewijde rekenkernen op de videokaart maken het mogelijk om bepaalde effecten na te bootsen die voorheen op andere manieren benaderd werden.
Een voorbeeld is een perfecte spiegel. De methode die het mogelijk maakt op videogames op hoge snelheid te renderen (rasterization) gaat uit van één perspectief. Bij een vlakke spiegel vormt het beeld zich via een tweede perspectief. Zonder trucage is dit onmogelijk na te bootsen in videogames, alhoewel er verschillende oplossingen voor zijn bedacht door de jaren heen.
Door de pixels in het beeld waar de spiegel te zien is daadwerkelijk te raytracen wordt dit probleem omzeild. Deze technologie staat nog in de kinderschoenen en wordt vaak alleen toegepast om enkele effecten over te nemen, met name schaduwen en reflecties. Om een vloeiend beeld te behouden kunnen slechts enkele rays per pixel gebruikt worden, en wordt er gebruik gemaakt van ruisonderdrukking om het beeld schoon te houden.