# Ray tracing

Il ray tracing è una famiglia di soluzioni di geometria ottica che si basa sul calcolo del percorso fatto dalla luce, seguendone i raggi attraverso l'interazione con le superfici. È usato nella modellazione di sistemi ottici, come lenti per fotocamere, microscopi, telescopi e binocoli. Il termine viene utilizzato anche per un preciso algoritmo di Rendering nel campo della Computer grafica 3D, in cui le visualizzazioni delle scene, modellate matematicamente, vengono prodotte usando una tecnica che segue i raggi partendo dal punto di vista della telecamera oppure dalle sorgenti di luce.
In uno spettro di costi computazionali e fedeltà visiva, le tecniche di rendering basate sul ray tracing, come: ray casting, ray tracing ricorsivo, ray tracing distribuito, mappatura dei fotoni e path tracing; sono generalmente più lente e con una maggiore fedeltà rispetto ai metodi di scanline rendering.
Altre tecniche che fanno parte del ray tracing sono path tracing bidirezionale, Metropolis light transport (MLT) e path tracing volumetrico.

## Descrizione generale dell'algoritmo per computer

Il ray tracing descrive un metodo per la produzione di immagini costruite in sistemi di computer grafica 3D, con maggior realismo di quello che si potrebbe ottenere con l'uso di ray casting o scanline rendering. Lavora tracciando, all'inverso, il percorso che potrebbe aver seguito un raggio di luce prima di colpire un'immaginaria lente. Mentre la scena viene attraversata seguendo il percorso di numerosi raggi, le informazioni sull'aspetto della scena vengono accumulate. La riflessione del raggio, la sua rifrazione o l'assorbimento sono calcolate nel momento in cui colpisce un qualsiasi oggetto.
Le scene, nel ray tracing, vengono descritte matematicamente, solitamente da un programmatore, o da un grafico, utilizzando particolari programmi. Le scene possono anche includere immagini e modelli creati attraverso varie tecnologie, per esempio usando la fotografia digitale. Seguendo i raggi in senso inverso viene alleggerita di molto la complessità dell'algoritmo, il che rende possibile una precisa simulazione di tutte le possibili interazioni presenti nella scena. Questo è dovuto al fatto che la maggior parte dei raggi che parte da una sorgente non fornisce dati significativi all'occhio di un osservatore. Potrebbero invece rimbalzare finché si riducono al nulla, andare verso l'infinito o raggiungere qualche altra camera. Una simulazione che parta seguendo tutti i raggi emessi da tutte le sorgenti di luce non è fisicamente praticabile.
La scorciatoia utilizzata nel raytracing, quindi, presuppone che un dato raggio termini sulla camera, e ne cerca la sorgente. Dopo aver calcolato un numero fisso di interazioni (già deciso in precedenza), l'intensità della luce nel punto di ultima intersezione viene calcolata con un insieme di algoritmi, inclusi il classico algoritmo di rendering ed altre tecniche (come la radiosity).

## Descrizione dettagliata dell'algoritmo, e sua nascita
### Cosa accade in natura

In natura, una sorgente di luce emette un raggio che viaggia fino a raggiungere una superficie che ne interrompe il tragitto. Si può pensare al raggio come ad un fascio di fotoni che viaggia sulla stessa linea. Nel vuoto assoluto questo raggio seguirebbe una linea retta. In realtà, una qualsiasi combinazione di questi tre risultati si può verificare: assorbimento, riflessione e rifrazione. Una superficie può riflettere tutto o parte del raggio di luce, in una o più direzioni. Può anche assorbire parte del raggio, causando una perdita di intensità della luce riflessa/rifratta. Se la superficie ha proprietà di trasparenza o traslucenza, convoglierà una porzione di luce dentro se stessa, in una direzione diversa rispetto a quella causata dall'assorbimento di una parte (o tutto) lo spettro ottico (ed eventualmente alterandone il colore). Sommando i valori di assorbimento, riflessione e rifrazione, si ottiene esattamente la potenza del raggio entrante. Una superficie non può, ad esempio, assorbire il 66% del raggio entrante, e rifletterne il 50%, dal momento che la somma darebbe 116%. Partendo da qui, i raggi riflessi e/o rifratti possono colpire altre superfici, dove verranno assorbiti, riflessi e rifratti (di nuovo). Alcuni di questi raggi, alla fine del viaggio, colpiscono il nostro occhio, permettendoci di vedere la scena e contribuendo al disegno dell'immagine finale.

### Algoritmo di ray casting

Il primo algoritmo di ray casting (in opposizione a quello di ray tracing) venne presentato da Arthur Appel nel 1968. L'idea di fondo del ray casting consiste nel far partire i raggi dall'occhio, uno per pixel, e trovare il più vicino oggetto che ne blocca il percorso (occorre pensare ad un'immagine come ad una grata, in cui ogni quadrato corrisponde ad un pixel). L'oggetto colpito è quello che l'occhio vede attraverso quel pixel. Usando le proprietà del materiale e gli effetti della luce nella scena, questo algoritmo è in grado di determinare il colore dell'oggetto. Questa supposizione è fatta pensando che una superficie è visibile se il raggio la raggiunge senza essere bloccato o in ombra. Il colore della superficie viene calcolato usando i tradizionali shading model presenti in Computer grafica. Un importante vantaggio offerto dal ray casting rispetto al più vecchio algoritmo di scanline, è la sua capacità di gestire con semplicità superfici solide o non-piane, come ad esempio coni e sfere. Se una superficie matematica può essere colpita da un raggio, il ray casting è in grado di disegnarla. Oggetti complicati possono essere creati utilizzando tecniche di modellazione solida, e facilmente renderizzati.
Il ray casting per la produzione di computer grafica venne usato per la prima volta da alcuni scienziati del Mathematical Applications Group, Inc., (MAGI) di Elmsford, New York. Nel 1966, il gruppo venne creato per effettuare calcoli di esposizione alle radiazioni da parte del Dipartimento della Difesa degli Stati Uniti. Il software creato dal MAGI calcolava non solo i rimbalzi dei raggi gamma sulle superfici (il ray casting per le radiazioni era utilizzato dagli anni quaranta), ma anche il modo in cui penetravano negli oggetti e ne venivano rifratti. Questi studi aiutarono il Governo a scegliere alcune applicazioni militari, costruendo veicoli che avrebbero protetto le truppe dalle radiazioni e veicoli di rientro per le esplorazioni spaziali. Sotto la direzione del dr. Philip Mittelman, gli scienziati svilupparono un metodo per la generazione di immagini utilizzando lo stesso software. Nel 1972 MAGI divenne un'azienda commerciale di animazione, che utilizzò il ray casting per creare animazioni 3D per la televisione, documentari, e film (crearono buona parte del film Tron utilizzando esclusivamente il ray casting). La MAGI venne chiusa nel 1985.

### Algoritmo di ray tracing

La successiva scoperta rivoluzionaria venne fatta da Turner Whitted nel 1979. I precedenti algoritmi lanciavano il raggio dall'occhio verso la scena, ma i raggi non venivano più seguiti. Whitted continuò il processo. Quando un raggio colpisce una superficie, può generare fino a tre nuovi tipi di raggio: riflessione, rifrazione ed ombra. Un raggio riflesso continua nella direzione della riflessione a specchio su di una superficie lucida. A questo punto interagisce con altri oggetti della scena; il primo oggetto che colpisce sarà quello visto nel riflesso presente sull'oggetto originario. Il raggio rifratto viaggia attraverso il materiale trasparente in modo simile, con l'aggiunta che può entrare o uscire da un materiale. Per evitare di tracciare tutti i raggi presenti in una scena, un raggio ombra viene usato per testare se la superficie sia visibile ad una luce. Un raggio colpisce una superficie in un qualche punto. Se questo punto "vede" la luce, un raggio (dal punto di vista del computer un segmento) viene seguito fino alla sorgente, Se durante il tragitto si incontra un oggetto opaco, la superficie è in ombra, e quella sorgente non contribuisce al calcolo del colore. Questo nuovo livello di calcolo aggiunge più realismo alle immagini create attraverso il ray tracing.

### Vantaggi del ray tracing

La popolarità conquistata dal ray tracing pone le basi nella simulazione realistica della luce rispetto ad altri modelli di rendering (tipo scanline rendering o ray casting). Effetti come riflessione ed ombra, difficilmente simulabili con altri metodi, sono il risultato naturale dell'algoritmo. Un'implementazione relativamente semplice conduce a risultati impressionanti, il ray tracing spesso rappresenta il punto di accesso allo studio della programmazione grafica.

### Svantaggi del ray tracing

Un grave svantaggio è dato dalle performance. Algoritmi come lo scanline utilizzano la coerenza dei dati per gestire la computazione tra i pixel, mentre il raytracing ricomincia tutto il procedimento ad ogni nuovo pixel, trattando ogni raggio in modo separato. Questa separazione offre vantaggi, tipo la possibilità di spedire più raggi del necessario per ottenere l'antialiasing e migliorare la qualità dell'immagine. Nonostante gestisca interriflessioni e rifrazioni accuratamente, il Ray Tracing tradizionale non è necessariamente fotorealistico. Il vero fotorealismo si ottiene quando l'equazione di rendering è ben approssimata o completamente implementata. Il suo calcolo dà il vero fotorealismo, dal momento che descrive ogni effetto fisico del flusso di luce. Il calcolo completo è normalmente impossibile date le risorse di computazione richieste. Il realismo di tutti i metodi di rendering, quindi, deve essere valutato in rapporto all'approssimazione dell'equazione e, nel caso del ray tracing, non è necessariamente il più realistico. Altri metodi, tra cui il photon mapping, sono basati sul ray tracing in alcune parti dell'algoritmo, e danno migliori risultati.

### Attraversamento inverso della scena

Il processo di lanciare i raggi dall'occhio verso la sorgente di luce, per disegnare un'immagine, viene chiamato a volte backwards ray tracing (o "ray tracing inverso"), dal momento che i fotoni viaggiano in senso opposto a quello usuale. Questa terminologia crea confusione. All'inizio il ray tracing era fatto partendo dall'occhio, ed i primi ricercatori (tipo James Arvo), usarono il termine backwards ray tracing per riferirsi al percorso sorgente-occhio. Per questo motivo, è più semplice distinguere i due casi in eye-based (basato sull'occhio) e light-based (basato sulla sorgente). La ricerca, negli scorsi decenni, ha esplorato combinazioni di computazioni effettuate in entrambi i sensi, così come schemi in grado di generare più o meno raggi in direzioni differenti, partendo da una superficie colpita. Ad esempio, gli algoritmi di radiosity lavorano solitamente computando il modo in cui i fotoni, emessi da una sorgente, modificano le superfici, registrandone i risultati. Questi dati possono essere usati da un ray tracer ricorsivo standard per creare un'immagine più corretta. Nel contesto degli algoritmi di illuminazione globale, come il photon mapping ed il Metropolis light transport, il ray tracing è solo uno dei tool usati per calcolare il trasferimento di luce tra le superfici.

### Algoritmo: classico ray tracing ricorsivo

Sotto viene mostrata un'immagine che illustra il percorso di alcuni raggi ricorsivi, calcolato utilizzando lo pseudocodice scritto qui sopra. Una superficie diffusiva riflette la luce in tutte le direzioni.
Per prima cosa, un raggio viene creato dal punto di vista della telecamera e tracciato attraverso un pixel verso una scena, dove colpisce una superficie diffusiva. Da questa superficie l'algoritmo genera un raggio riflesso, lanciato, a sua volta, attraverso la scena, fino ad un'altra superficie. Infine, un nuovo raggio parte, fino a raggiungere la sorgente di luce, dove viene assorbito. A questo punto, il colore del pixel dipende da quello delle due superfici colpite e da quello della sorgente di luce. Ad esempio, se la luce emessa è bianca e le due superfici sono blu, il colore risultante sarà blu.

## Ray tracing in real time

Nel tempo si sono succeduti anche sforzi tesi ad implementare un ray tracing in sistema real-time per applicazioni di grafica quali i videogiochi.
Il progetto OpenRT è composto da un nucleo altamente ottimizzato basato sul ray tracing, e ad un API in stile OpenGL per poter offrire un'alternativa all'approccio corrente basato sulla rasterizzazione.
L'hardware specifico per il ray tracing, come il Ray Processing Unit sviluppato all'Università della Saarland, è stato progettato per accelerare alcune operazioni computazionalmente dispendiose.
Alcuni software real-time, con motore basato sul ray tracing, sono stati sviluppati da programmatori appassionati fino ai tardi anni novanta. I ray tracer usati in queste demo, comunque, usano spesso approssimazioni inaccurate ed arrivano ad imbrogliare per ottenere un buon frame rate.
Dalla generazione GeForce 20 series di GPU in poi, della casa Nvidia, è stato implementato un sistema di accelerazione hardware che punta a rendere possibile il ray tracing in tempo reale, specie nei videogiochi, il tutto col supporto di dedicati tool per sviluppatori. Tale soluzione venne successivamente migliorata, permettendo anche il "full ray tracing" o "path tracing" o "modalità RT Overdrive" con le schede video GeForce 20 series accompagnate dalla controparte software DLSS 3.5.

## Nell'ottica geometrica

Il ray tracing, in computer grafica, deriva il proprio nome ed i principi da una precedente tecnica usata per la progettazione di lenti. In ottica, il raytracing è una tecnica utilizzata per la realizzazione di lenti e strumenti ottici - fotocamere, binocoli, telescopi e microscopi - fin dai primi anni del XX secolo. Questo tipo di raytracing descrive la propagazione dei raggi di luce attraverso sistemi di lenti o uno strumento ottico, permettendo di modellare le proprietà di creazione dell'immagine.
I seguenti effetti possono essere integrati in un software di ray tracing:
* Dispersione ottica (conduce ad aberrazioni cromatiche; parzialmente integrata in POV-Ray)
* Indice del gradiente ottico
* Polarizzazione
** Ottica dei cristalli
** Equazioni di Fresnel
* Effetti di luce laser
* Interferenza in pellicole sottili come bolle di sapone o ottiche multistrato (può essere utilizzata per calcolare la riflettività di una superficie).
Nella progettazione delle lenti acquistano importanza due casi particolari. Nel primo caso, i raggi provenienti da una sorgente luminosa si incontrano in un punto focale dove possono interferire in modo costruttivo e distruttivo gli uni con gli altri. Nella regione focale prossimale, i raggi possono essere approssimati convenientemente da onde piane che ne ereditano la direzione. La lunghezza del percorso ottico (OPL) dalla sorgente viene utilizzata per determinare la fase dell'onda. La derivata della posizione del raggio nella regione focale rispetto alla posizione della sorgente è usata per ottenere la larghezza del raggio e, da questa, l'ampiezza dell'onda piana. Il risultato è la funzione di diffusione del punto luminoso (point spread function o PSF), la cui trasformata di Fourier corrisponde alla funzione di trasferimento della modulazione (MTF), da cui si può calcolare anche il rapporto di Strehl.
Il secondo caso considera l'interferenza dei fronti d'onda (l'insieme dei punti che hanno la stessa fase) che sono approssimabili, come detto in precedenza, a delle superfici piane. Quando i raggi si avvicinano tra loro, o si intersecano, questa approssimazione viene meno.
Le interferenze di onde sferiche non hanno solitamente a che fare con il ray tracing dato che la diffrazione, ad una determinata apertura, non può essere calcolata.
Queste tecniche vengono utilizzate per minimizzare le aberrazioni ottiche in campo fotografico, per applicazioni ad elevata lunghezza d'onda, come la modellazione di microonde o sistemi radio, e a corta lunghezza d'onda come le ottiche a raggi ultravioletti e raggi X.
Prima dell'avvento dei computer, i calcoli di ray tracing venivano svolti manualmente attraverso tavole trigonometriche e logaritmiche. Le formule ottiche utilizzate da molte lenti fotografiche classiche erano ottimizzate da gruppi di lavoro numerosi, ognuno dei quali era responsabile di una piccola parte del complicato calcolo. Nell'era informatica, queste operazioni sono affidate ai calcolatori elettronici e a software dedicati (come, p.e., OSLO o TracePro di Lambda Research, CODE V o Zemax). Una versione semplificata del ray tracing, conosciuta come "ray transfer matrix analysis", viene utilizzata frequentemente nella progettazione di risonatori ottici utilizzati nei laser.

## Esempio

Una dimostrazione dei principi coinvolti nel ray tracing, ci permetterà di considerare in che modo si possa trovare l'intersezione tra un raggio ed una sfera. L'equazione generale di una sfera può essere espressa in notazione vettoriale, dove I è un punto sulla superficie della sfera, C ne è il centro e r il raggio, con questa formula: $|\mathbf {I} -\mathbf {C} |^{2}=r^{2}$.
Allo stesso modo, se una semiretta è definita attraverso il punto di origine S (origine del raggio) e la sua direzione d, ogni punto sulla linea soddisfa la seguente equazione:
    $\mathbf {S} +t\mathbf {d} \ ,$
in cui t è una costante che definisce la distanza misurata sulla semiretta partendo dall'origine (per cui, per semplicità, d è generalmente un vettore unitario). Ora, nella scena noi conosciamo S, d, C, ed r. Quello che ci serve è trovare t per poterlo sostituire ad I:
    $|\mathbf {S} +t\mathbf {d} -\mathbf {C} |^{2}=r^{2}\ .$
Supponiamo che $\mathbf {V} \ {\stackrel {\mathrm {def} }{=}}\ \mathbf {S} -\mathbf {C}$ per semplicità, allora
    $|\mathbf {V} +t\mathbf {d} |^{2}=r^{2}$
    $\mathbf {V} ^{2}+t^{2}\mathbf {d} ^{2}+2\mathbf {V} \cdot t\mathbf {d} =r^{2}$
    $(\mathbf {d} ^{2})t^{2}+(2\mathbf {V} \cdot \mathbf {d} )t+(\mathbf {V} ^{2}-r^{2})=0\$
Questa equazione quadratica ha soluzioni:
    $t={\frac {-(2\mathbf {V} \cdot \mathbf {d} )\pm {\sqrt {(2\mathbf {V} \cdot \mathbf {d} )^{2}-4(\mathbf {d} ^{2})(\mathbf {V} ^{2}-r^{2})}}}{2(\mathbf {d} ^{2})}}\$
Se il radicando è negativo, il raggio non interseca la sfera. Questa è la matematica di fondo del calcolo di intersezione raggio-sfera. Esistono ovviamente processi molto più generali per il raytracing, ma questo voleva solo essere un esempio di come l'algoritmo viene usato.