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%.Vedi la Legge di conservazione dell'energia 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 Per ogni pixel dell'immagine { Crea un raggio che, dall'occhio, passa attraverso questo pixel Inizializza "NearestT" a "INFINITO" e "NearestObject" a "NULL"

Per ogni oggetto della scena { Se il raggio colpisce questo oggetto { Se la distanza "t" è meno di "NearestT" { Imposta "NearestT" a "t" Imposta "NearestObject" a questo oggetto

Se "NearestObject" è "NULL" { Colora questo pixel con il colore di sfondo } Altrimenti { Spedisci un raggio ad ogni sorgente di luce per testare se è in ombra Se la superficie è riflettente, genera il raggio riflesso: (ricorsione) Se la superficie è trasparente, genera il raggio rifratto: (ricorsione) Usa "NearestObject" e "NearestT" per calcolare il colore