Il RAY TRACING: che cosa è e come funziona?

ray-tracing

Il massimo del fotorealismo si ottiene oggi con il ray tracing fisicamente corretto, impiegabile con tempi di calcolo ragionevoli solo grazie alle moderne Gpu.

Ray tracing è una tecnica per produrre a computer immagini (rendering) di una scena 3D mediante il calcolo dei percorsi dei singoli raggi di luce. Queste immagini possono essere praticamente indistinguibili da foto professionali,  ma i calcoli necessari sono molto pesanti e per portarli a termine in tempi accettabili è necessario impiegare  hardware potente.

Con il ray tracing è possibile riprodurre in maniera realistica tutte le caratteristiche fisiche della luce, come la  riflessione, la rifrazione e la diffrazione. Nel mondo reale i raggi luminosi partono dalla fonte di luce (il sole, una lampada), rimbalzano anche solo parzialmente sulle superfici degli oggetti riflettenti, passano attraverso gli elementi trasparenti e infine arri\·ano alla telecamera che rappresenta l’occhio deU’osserrntore. Un algoritmo che riproducesse fedelmente questo processo sarebbe però troppo inefficiente, perché solo una piccola parte dei raggi raggiunge l’osservatore, la maggioranza è dispersa in tutte le altre direzioni. Un sistema molto più efficiente consiste nel calcolare i percorsi a ritroso, cioè partendo dall’occhio dello spettatore per risalire fino alla fonte lwninosa.

La direzione dei raggi iniziali è stabilita inclinandoli in modo che par tendo dalla telecamera passino attraverso una griglia posta subito dm·anti, che rappresenta i pixel che com pongono l’immagine finale.

ray-tracingLa griglia è quindi una sorta di finestra attraverso la quale l’osservatore vede la scena 30. Per ogni pixel il sistema  genera uno o più raggi luminosi e ne definisce il percorso calcolando l’intersezione di ciascun raggio con i poligoni (triangoli) che costituiscono le superfici degli oggetti 30. Per testare l’intersezione con il poligono effettivamente più vicino senza dover prendere in esame tutti gli elementi presenti nella scena, l’algoritmo usa lo z-buffer, una memoria in cui sono registrate le distanze tra i poligoni e il punto di vista. Queste informazioni sono state generate dal motore di rendering stesso, prima di partire con i raggi luminosi.

Per velocizzare ulteriormente i calcoli è prassi comune racchiudere gli oggetti in semplici forme Virtuali standard (sfere, scatole, cilindri) con cui fare un primo  test approssimativo di collisione. Ovviamente la validità di questo sistema è tanto maggiore quanto più le forme fittizie si avvicinano a quelle effettive presenti nella scena 3D .

In pratica, dopo aver trornto una collisione tra il raggio e una superficie, l’algoritmo valuta le caratteristiche del materiale e mod ifica d i conseguenza il percorso, l’intensità e il colore della luce. Nel caso di materiali trasparenti l’algoritmo deve tenere in conto che la luce si divide in più raggi, secondo la legge fisica della rifrazione. Il  processo è ripetuto per le collisioni successive fino al raggiungin1ento del numero massimo di rimbalzi stabilito dall’utente, fino a quando l’energia del raggio scende sotto un valore minimo limite oppure fino a quando la luce esce dal volume 3D che contiene l’intera scena. Se una di queste tre condizioni si verifica, l’algoritmo termina i calcoli relativi a quel raggio e aggiorna il colore del pixel relativo.

Nella maggior parte dei casi il metodo di calcolo dei percorsi a ritroso è il più efficiente, ma esistono situazioni in cui è meglio partire dalla lampada e procedere verso l’osservatore. Per esempio se la fonte di illuminazione è indiretta, come quella che passa attraverso lo spiraglio di una finestra socchiusa o quella di una lampada orientata verso il soffitto. Un altro caso classico sono le caustiche, disegni luminosi che si fom1ano quando la luce rimbalza o attraversa una superficie curva. In questi casi il sistema genera un set ristretto di raggi tutti puntati verso la zona effettivamente utile, individuata con algoritmi dedicati (Metropolis light transport, per esempio). i motori ray tracing più completi possono cambiare il verso dei raggi in base a come è organizzata la scena 3D e lavorare in entrambe le maniere (bidirectional path tracking).

Il calcolo indipendente del percorso di ciascun raggio luminoso si presta bene alla parallelizzazione del lavoro, una caratteristica tipica delle moderne Cpu dotate di migliaia di nodi di calcolo. Di contro, il grande numero di raggi necessari e i numerosi rimbalzi rendono molto lungo il processo, quindi di solito il motore ray tracing usa algoritmi semplificati, che non tengono conto di tutte le caratteristiche fisiche della luce. Solo di recente è stato possibile implementare algoritmi fisicamente corretti, non limitati a un numero massimo di rimbalzi e capaci di calcolare in tempi accettabili anche i fenomeni luminosi più complessi.