Ray Tracing in CG 3D
L'espressione "Ray Tracing" può essere utilizzata in vari campi per denotare, in ambiti differenti, il calcolo e lo studio del percorso effettuato dai raggi luminosi all'interno di una scena (virtuale o reale) e l'interazione degli stessi con gli elementi presenti in tale scena (superfici, sistemi di particelle, effetti di riflessione, rifrazione e assorbimento, ecc...).
In Computer Grafica 3D, in particolare, "Ray Tracing" è il nome di un noto algoritmo di rendering, del quale parleremo in questo articolo.
Come in altre tecniche di rendering, come ad esempio Ray Casting, viene analizzato il percorso dei raggi luminosi partendo non dalle sorgenti luminose, ma dalla telecamera (ossia dall'osservatore); la simulazione di alcuni effetti, dovuti non solo ai materiali (ad es. riflessione e rifrazione) ma anche alla telecamera (profondità di campo), è però più accurata in Ray Tracing che in altre tecniche, cosa che lo rende particolarmente utile per effettuare -sotto determinate condizioni, come vedremo- rendering fotorealistici (simulazioni architettoniche, animazioni ed effetti speciali per film, ...).
La simulazione avviene, come anticipato, seguendo a ritroso i raggi luminosi, partendo cioè da ciascun pixel dell'immagine finale (spazio che coincide con quello della telecamera-osservatore), e questo principalmente perché una simulazione che tenga conto di TUTTI i raggi luminosi in uscita da una sorgente luminosa e di TUTTI i possibili rimbalzi degli stessi (considerando quindi anche raggi "inutili", ossia raggi che poi non andranno verso l'osservatore o che colpiscano parti non visibili degli oggetti) è fisicamente impossibile (alcune tecniche, come il Photon Mapping, simulano le traiettorie dei fotoni, ovviamente quantizzando la quantità di luce emessa da una fonte luminosa e ponendo un limite al numero dei rimbalzi).
Anche in Ray Tracing si pone, comunque, un limite al numero dei rimbalzi da calcolare per ciascun raggio; alla fine, il valore (colore) da assegnare ad un pixel dell'immagine viene determinato tenendo conto degli assorbimenti, degli apporti di colore dati da altri materiali e dai vari effetti (riflessione, rifrazione) eventualmente presenti.
L'algoritmo del Ray Tracing è ricorsivo: proiettando il raggio dal pixel al primo oggetto colpito si continua considerando eventuali altri rimbalzi fino alla sorgente luminosa; se viene raggiunta una sorgente luminosa, si segue il percorso inverso, memorizzando i vari materiali e le altre caratteristiche "ambientali" incontrate lungo il percorso del raggio luminoso attraverso i vari rimbalzi per poter calcolare il valore da assegnare al pixel sullo schermo.
Lo pseudo-codice dell'algoritmo di Ray Tracing di base è il seguente:
Per ciascun pixel dell'immagine { Crea un raggio che parta da questo pixel diretto verso la scena Crea variabile "NearestT" a "INFINITO" Crea variabile "NearestObject" inizializzandola a "NULL" // Inizialmente, il raggio non interseca alcun oggetto
Per ciascun oggetto presente nella scena virtuale { Il raggio interseca questo oggetto ? Se sì: { La distanza "t" dell'oggetto dalla telecamera è inferiore a "NearestT" ? Se sì: { Setta "NearestT" a "t" Setta "NearestObject" a questo oggetto } } }
"NearestObject" è "NULL" ? Se sì: { Non ci sono oggetti in vista: assegna il colore di sfondo (detto anche world o sky color) a questo pixel } Altrimenti: { Invia il raggio verso le sorgenti di luce per valutare le possibili ombre proiettate Se il materiale è riflettente, calcola la riflessione del raggio (con un procedimento ricorsivo) Se il materiale è trasparente, calcola -con un procedimento ricorsivo- la rifrazione del raggio Calcola il colore da assegnare al pixel utilizzando "NearestObject" e "NearestT" Assegna il colore calcolato al pixel dell'immagine } }
Implementazioni più articolate possono simulare, ovviamente, altri effetti (ad es.: profondità di campo), ma il "cuore" dell'algoritmo è, fondamentalmente, questo.
Il vantaggio principale del Ray Tracing sta quindi nell'alto livello di realismo raggiungibile anche con implementazioni "di base" dell'algoritmo (purchè l'equazione del rendering sia approssimata il più possibile), che calcola da subito la riflessione e la proiezione delle ombre, con risultati non ottenibili così facilmente (a livello di codice) con altri algoritmi.
Il costo da pagare consiste in tempi di rendering elevati: per ciascun pixel, è necessario (ri)calcolare gli effetti da zero, ossia senza avvalersi delle informazioni accumulate per pixel adiacenti e risparmiare così del lavoro (come avviene in altri algoritmi di rendering, magari meno accurati ma più veloci); inoltre, per approssimare al meglio l'equazione del rendering, è necessaria una quantità di calcoli molto elevata, il che ovviamente è un fattore collegato direttamente al tempo richiesto per l'elaborazione.
Il fatto che il lavoro debba essere rifatto da capo rappresenta, al momento, un problema, tuttavia rende Ray Tracing adatto per il calcolo in parallelo: vari processori possono dividersi le aree da raffigurare portando il tempo necessario per il rendering di un'immagine ad una frazione del tempo richiesto da un singolo processore per calcolare la stessa immagine.
Ray Tracing in tempo reale (per visualizzazioni e, soprattutto, videogiochi) attualmente è ancora in fase sperimentale; la ricerca prevede sia lo studio di motori di rendering più veloci (che sfruttino magari la presenza di più cores per effettuare le elaborazioni in parallelo, come accennato precedentemente) che periferiche hardware ad hoc.
|