Raggi Luminosi e Piano di Vista

In uno scorso articolo avevamo introdotto il ray tracing parlando delle differenze tra forward e backward ray tracing. Avevamo anche detto che, nel backward, i raggi luminosi devono partire dal punto di vista dell’osservatore, ma la domanda che vogliamo porci è, quanti ne dobbiamo generare? La risposta a questa domanda giunge dall’introduzione di un nuovo elemento, il piano di vista o piano dell’immagine. Tale oggetto può essere interpretato come un piano trasparente posto di fronte all’osservatore, nella direzione in cui sta guardando, attraverso il quale devono necessariamente passare tutti i raggi generati.

Il piano di vista nel nostro caso è il monitor, quindi dobbiamo sparare tanti raggi luminosi quanti ne può supportare il monitor. Dobbiamo quindi prendere la risoluzione in pixel dello schermo e generare per ognuno di essi il nostro raggio: per una risoluzione di 1024×768 pixel dobbiamo quindi generare 786.432 raggi luminosi e determinarne il colore trasportato, in questo modo abbiamo la certezza che il piano di vista coincide con l’immagine, ovviamente all’aumentare dei pixel da calcolare aumenta anche il costo computazionale. Se per esempio potessimo rappresentare un pixel in un millisecondo, per calcolare l’immagine ad una risoluzione di 1024×768 dobbiamo aspettare 786,432 secondi, che equivalgono a circa 13 minuti. Tuttavia non bisogna disperare, poiché esistono delle tecniche di ottimizzazione, che consentono di abbassare notevolmente i costi computazionali di produzione, permettendoci di realizzare un’immagine di buona qualità in tempi accettabili. Il primo passo che il motore di backward ray tracing deve compiere è generare un raggio la cui base sia posta nel punto di vista dell’osservatore e la cui punta coincida con un pixel del piano. Se siamo abbastanza fortunati il nostro raggio colpirà un oggetto, questo primo raggio si chiamerà primary ray o raggio primario, poiché è il primo ad essere generato. A seconda delle proprietà fisiche dell’oggetto colpito il raggio primario verrà riflesso da un angolo più o meno grande. Se conosciamo l’angolo della riflessione possiamo creare un nuovo raggio la cui base è posta nel punto di intersezione tra il raggio primario e l’oggetto, mentre la punta è posta nella direzione calcolata. Continuiamo a creare un nuovo raggio finché troviamo oggetti lungo il suo allungamento. Alla fine ci sarà un raggio che anche allungandolo all’infinito non colpirà nessun oggetto, a questo punto possiamo interrompere il nostro procedimento e controllare che il percorso sia plausibile per un raggio luminoso emesso da una fonte di luce, basta allungare il raggio fino alla sorgente e controllare che non intersechi nessun oggetto, questo tipo di raggio è definito shadow ray o illumination ray. Se nessun oggetto interseca lo shadow ray, allora significa che la sorgente di luce è in grado di illuminare il punto e possiamo calcolare il colore sfruttando le caratteristiche fisiche dell’oggetto a cui il punto di intersezione appartiene e la quantità di luce che lo colpisce.
Per calcolare il colore del pixel dopo il test dello shadow ray occorre ritornare a ritroso per vedere il cammino del raggio. Se per esempio il nostro raggio colpisse un oggetto A di colore rosso che rifletta il 20% della luce e successivamente un oggetto di colore verde con il 50% della luce riflessa, il colore risultante sarebbe dato da un 50% di verde con sommato un 50% del 20% di rosso e quindi un 10% di rosso.
Al termine di questo articolo vediamo i pro ed i contro di questo tipo di approccio, costituito dallo studiare la natura fisica di un raggio e rispecchiando fedelmente la realtà. I vantaggi sono: la generazione delle ombre è completamente gratuita, l’algoritmo utilizza solo ricorsioni. Tra i tanti contro abbiamo: durante il suo percorso un raggio genera altri raggi secondari che a loro volta ne generano altri e questo porta un notevole costo computazionale, inoltre per ottenere un effetto foto-realistico dovremmo considerare altre peculiarità degli oggetti come l’opacità e la trasparenza. L’algoritmo inoltre presenta dei problemi per quello che riguarda la generazione del raggio ed il calcolo dell’intersezione con un generico oggetto, inoltre occorre determinare come un oggetto venga effettivamente illuminato.
Ultimo problema molto importante è sapere quando fermarsi dalla ricorsione, perché un raggio può rimbalzare da un oggetto ad un altro in maniera indefinita e quindi entreremo inevitabilmente in un loop, per questo dobbiamo fare l’assunzione di considerare solo un limite massimo di ricorsioni per raggio, l’esperienza ci dice che 3 livelli di riflessione sono più che sufficienti a generare un’immagine di ottima qualità, mentre oltre il terzo livello i dettagli aggiunti sono molto pochi.
In un prossimo articolo vedremo tutti i tipi di raggio che occorre generare per avere un’immagine il più realistica possibile.

Pubblicato
Categorie: Grafica

Di Giampaolo Rossi

Sviluppatore software da oltre 16 anni.