INNO3D GeForce RTX 3070 iCHILL X3 [C30703-08D6X-1710VA38]

NVIDIA Ampere - Uno sguardo alla nuova architettura - Parte Seconda

Il ray-tracing è una tecnologia di rendering estremamente impegnativa dal punto di vista computazionale, capace di simulare realisticamente l’illuminazione di una scena e dei suoi oggetti.


Nuove unità RT Cores e Ray-Traced Motion Blur


In ambito professionale e cinematografico, seppur si faccia uso massiccio, ormai da diversi anni, di questa tecnica, sfruttando ad esempio gli strumenti Iray ed OptiX messi a disposizione da NVIDIA, non è mai stato possibile riprodurre tali effetti in alta qualità ed in tempo reale, specialmente affidandosi ad un singolo processore grafico.

Sempre a causa di questa sua natura intensiva in termini di elaborazione, questa tecnica non ha mai trovato impiego in ambito videoludico per attività di rendering significative. Come ben noto, infatti, i giochi che richiedono animazioni fluide ad elevati framerate si basano su ormai rodate tecniche di rasterizzazione, in quanto meno impegnative da gestire. Seppur scene rasterizzate possono vantare tutto sommato un bell’aspetto, non mancano purtroppo limitazioni significative che ne compromettono il realismo.

Ad esempio, il rendering di riflessi e ombre, utilizzando esclusivamente la rasterizzazione, necessita di semplificazioni di presupposti che possono causare diversi tipi di artefatti. Allo stesso modo, le scene statiche possono sembrare corrette fino a quando qualcosa non si muove, le ombre rasterizzate spesso soffrono di aliasing e fughe di luce e le riflessioni nello spazio possono riflettere solo gli oggetti visibili sullo schermo. Questi artefatti, oltre che compromettere il livello di realismo dell’esperienza di gioco, per essere in parte risolti obbligano gli sviluppatori a ricorrere ad effetti e filtri supplementari, con ovvio aumento delle richieste necessarie in termini di potenza elaborativa.

L’implementazione del ray-tracing in tempo reale su singola GPU è stata un’enorme sfida tecnica, che ha richiesto a NVIDIA quasi dieci anni di ricerca, progettazione e stretta collaborazione con i suoi migliori ingegneri in campo software. Tutti questi sforzi hanno portato alla messa a punto della tecnologia software NVIDIA RTX e di unità hardware specifiche espressamente dedicate al ray-tracing, denominate RT Cores e implementate per la prima volta nel 2018, in occasione del debutto di processori grafici basati su architettura Turing.

L’approccio scelto da NVIDIA appare del tutto intelligente, prevedendo una combinazione ibrida tra le due sopracitate tecniche di rendering. In questa maniera la rasterizzazione continuerà ad essere utilizzata laddove è più efficace, allo stesso tempo il ray-tracing verrà previsto esclusivamente negli ambiti nei quali è in grado di assicurare il maggior vantaggio visivo, come nel rendering dei riflessi, delle rifrazioni e delle ombre. A detta del colosso americano questo approccio rappresenta ad oggi il miglior compromesso possibile tra qualità e realismo grafico e onere computazionale. Nell’immagine che segue viene illustrato, in modo schematico, il funzionamento della nuova pipeline di rendering ibrida:

Anche se questi moderni processori grafici consentono un ray-tracing in tempo reale, il numero di raggi primari o secondari espressi per pixel o superficie varia in base a numerosi fattori, tra cui la complessità della scena, la risoluzione, gli ulteriori effetti grafici renderizzati nella scena stessa e, naturalmente, la potenza elaborativa del processore grafico. Non dobbiamo di conseguenza aspettarci che centinaia di raggi debbano o possano essere rappresentati in tempo reale.

Sono, infatti, necessari molti meno raggi per pixel quando si utilizza l’accelerazione tramite RT Cores in combinazione con tecniche di filtraggio di riduzione del rumore avanzate. NVIDIA ha quindi messo a punto degli specifici moduli denominati Denoiser-Tracing, capaci di sfruttare appositi algoritmi basati sull’intelligenza artificiale allo scopo di ridurre in modo significativo il quantitativo di raggi per pixel richiesti pur senza compromettere in maniera marcata la qualità dell’immagine.

Un esempio pratico di questo interessante approccio è stato mostrato nella demo Reflections creata dalla Epic Games in collaborazione con ILMxLAB e NVIDIA. L’implementazione del ray-tracing in tempo reale nel motore grafico Unreal Engine 4 sfrutta le API Microsoft DXR e la tecnologia NVIDIA RTX per portare su schermo illuminazioni, riflessioni, ombre e occlusione ambientale di qualità cinematografica, il tutto eseguito su una singola GPU Quadro RTX 6000 o GeForce RTX 2080 Ti.

Con la nuovissima architettura Ampere debutta anche la seconda generazione di unità RT Cores, unità rese ancor più prestanti ed efficienti rispetto al passato. NVIDIA stima una gestione delle intersezioni raggi-triangoli a velocità doppia rispetto alla scorsa generazione. Le nuove unità RT Cores, inoltre, confermano il pieno supporto verso le tecnologie di ray-tracing NVIDIA RTX e OptiX, le API Microsoft DXR e le più recenti API Vulkan Ray-Tracing, e possono accelerare le tecniche utilizzate in molte delle seguenti operazioni di rendering e non-rendering:


  • Riflessioni e Rifrazioni;
  • Ombre e Occlusione ambientale;
  • Illuminazione Globale;
  • Baking istantanea e offline della lightmap;
  • Immagini e anteprime in alta qualità;
  • Raggi primari nel rendering VR;
  • Occlusion Culling;
  • Fisica, rilevamento delle collisioni e simulazioni di particelle;
  • Simulazioni audio (ad esempio tramite NVIDIA VRWorks Audio basata sull’API OptiX);
  • Intelligenza artificiale;
  • In-engine Path Tracing (non in tempo reale) per generare immagini di riferimento per la messa a punto di tecniche di rendering in tempo reale di eliminazione del rumore, composizione del materiale e illuminazione della scena.

Gli RT Cores, inoltre, sono in grado di gestire in hardware la cosiddetta Bounding Volume Hierarchy (BVH), un particolare algoritmo di scomposizione gerarchica delle superfici tridimensionali che finora richiedeva un’emulazione di tipo software per essere eseguita. Nello specifico l’obiettivo è quello di individuare tutti quei triangoli che incrociano effettivamente uno dei raggi di luce presenti nella scena.

Le unità hardware lavorano insieme ad avanzati filtri di denoising all’interno dell’efficiente struttura di accelerazione della BVH sviluppata dagli ingegneri NVIDIA al fine di ridurre drasticamente la mole di lavoro a carico delle SM, consentendo a queste ultime di dedicarsi ad altre tipologie di operazioni, quali l’ombreggiatura dei pixel e dei vertici e quant’altro. Funzioni come la costruzione e il refitting BVH sono gestite direttamente dai driver, mentre la generazione e l’ombreggiatura dei raggi sono a carico dell’applicazione attraverso nuovi tipi di shader.

Per comprendere meglio la funzione dei nuovi RT Cores e cosa accelerano esattamente, dovremmo prima spiegare come viene eseguito il ray-tracing su GPU o CPU senza un motore hardware dedicato. In questo caso, come descritto da NVIDIA, sono gli shader a lanciare il cosiddetto “raggio sonda” che innesca il processo BVH vero e proprio, comprendente tutti i suddetti test di intersezione raggio/triangolo.

A seconda della complessità della scena da elaborare possono essere necessari migliaia di slot di istruzioni per ogni raggio proiettato fino al momento in cui non verrà effettivamente colpito un triangolo, che sarà successivamente colorato sulla base del punto di intersezione (o se al contrario non ne viene colpito alcuno, il colore di sfondo può essere usato per l’ombreggiatura del pixel stesso). Stiamo parlando di un processo estremamente intensivo dal punto di vista computazionale, al punto da essere considerato impensabile da eseguire in tempo reale facendo uso di una GPU sprovvista di accelerazione ray-tracing in hardware.

La presenza di questo genere di unità dedicate, al contrario, consente un’elaborazione efficiente di tutti i test di intersezione tra i raggi proiettati e i triangoli, sgravando la SM di migliaia di slot di istruzioni per ogni singolo raggio proiettato. Un vantaggio enorme se pensiamo alla mole di calcoli che sarebbero necessari per un’intera scena.

All’interno di ogni unità RT Cores di Turing vi sono una coppia di sotto-unità specializzate: la prima si occupa dell’elaborazione della scena e della sua suddivisione, dapprima in grandi rettangoli (denominati box) e successivamente in ulteriori rettangoli sempre più piccoli fino ad arrivare ai singoli triangoli; la seconda invece si occupa della gestione dei calcoli di intersezione tra i raggi proiettati e i triangoli, restituendo un risultato in termini di colorazione o meno dei pixel. Alle unità SM, di conseguenza, viene esclusivamente affidato l’onere di lanciare il “raggio sonda”, trovandosi di fatto in gran parte libere di svolgere eventualmente altre operazioni grafiche o computazionali.

Nelle nuove unità RT Cores di seconda generazione, NVIDIA ha apportato diverse ottimizzazioni; dapprima è intervenuta sull’unità “Triangle Intersection”, velocizzandola e dotandola di risorse dedicate al fine di limitare tutti quegli scenari in cui avrebbe potuto rappresentare un collo di bottiglia, in secondo luogo ha aggiunto una nuova sotto-unità, denominata Interpolate Triangle Position, espressamente pensata per l’implementazione del Motion Blur in ambito Ray-Tracing.

Il Motion Blur è un effetto di computer grafica molto popolare e importante utilizzato in film, giochi e molti diversi tipi di applicazioni di rendering professionali per simulare meglio la realtà o semplicemente per creare interessanti effetti artistici. Per comprenderlo al meglio basta pensare a come una telecamera genera l’effetto. Un’immagine fotografica non viene creata istantaneamente, ma al contrario viene creata esponendo la pellicola alla luce per un periodo di tempo finito.

Gli oggetti che si muovono abbastanza velocemente rispetto all’apertura dell’otturatore della fotocamera appariranno come strisce o macchie nella foto. Affinché una GPU crei sfocature di movimento dall’aspetto realistico quando gli oggetti nella scena (geometrie) si muovono rapidamente davanti a una telecamera statica o la telecamera sta scansionando oggetti statici o in movimento, deve simulare il modo in cui una telecamera e un film riprodurrebbero tali scene.

Gli effetti di sfocatura ad alta qualità possono essere molto dispendiosi in termini di calcolo, spesso richiedendo il rendering e la fusione di più fotogrammi in un determinato intervallo di tempo. Potrebbe essere necessaria anche la post-elaborazione per migliorare ulteriormente i risultati. Un certo numero di trucchi e metodi di scelta rapida vengono spesso utilizzati per il Motion Blur in tempo reale, come nei giochi, ma la sfocatura può mancare di realismo. Ad esempio, le immagini potrebbero essere innaturalmente macchiate, rumorose o presentare artefatti di ghosting/strobo, oppure l’effetto potrebbe mancare del tutto nei riflessi e nei materiali traslucidi.

Al contrario, il Motion Blur con Ray-Tracing può essere più accurato, realistico e senza artefatti indesiderati, ma può anche richiedere molto tempo e notevoli risorse per portarne a termine il rendering su una GPU, soprattutto senza l’accelerazione hardware delle operazioni di Ray-Tracing, parte integrante dell’esecuzione di effetti di sfocatura.

Diversi algoritmi o combinazioni di algoritmi possono essere impiegati per eseguire il Motion Blur con Ray-Tracing. Un metodo diffuso spara casualmente nella scena una serie di raggi con time-stamp. Un BVH in grado di sfocare in movimento restituisce le informazioni sui colpi del raggio rispetto alla geometria che si muove nel tempo, campionate al time-stamp associato a ciascun raggio.

Questi campioni vengono quindi ombreggiati e combinati per creare l’effetto sfocato finale. È possibile riprendere più raggi in una scena e gli RT Cores accelerano i calcoli eseguendo test di intersezione raggio/triangolo e restituendo risultati per creare effetti di sfocatura. Tuttavia, eseguire il Motion Blur sulla geometria in movimento può essere più impegnativo entro un dato intervallo di tempo poiché le informazioni BVH cambiano mentre gli oggetti si muovono.

Ed è proprio questo che rappresenta la sfida più grande a cui hanno dovuto far fronte gli ingegneri NVIDIA; con il Motion Blur i triangoli nella scena non sono più fissati nel tempo. Nel Ray-Tracing di base, ogni triangolo è definito all’interno della struttura di accelerazione BVH. Quando viene tracciato un raggio, vengono eseguiti i test raggio/riquadro di delimitazione e intersezione raggio/triangolo e, se viene colpito un triangolo, le informazioni sul risultato vengono campionate e restituite.

Con il Motion Blur nessun triangolo ha una posizione fissa.  Fortunatamente il BVH prevede una formula che possiamo riassumere così: “se mi dici che ore sono, posso dirti dove si trova questo triangolo nello spazio”. Ad ogni raggio viene quindi assegnato un time-stamp che indica il tempo da tracciare, alimentando le equazioni BVH per risolvere la posizione del triangolo e l’intersezione raggio/triangolo. Per ovvi motivi, se questo processo non fosse accelerato dall’hardware della GPU, rappresenterebbe un enorme collo di bottiglia data l’ingente mole da calcoli necessari.

Sul lato sinistro dell’immagine sopra riportata, la ripresa dei raggi nella scena senza movimento potrebbe avere, come mostrato, molti raggi, ma colpiscono tutti lo stesso triangolo nello stesso punto nel tempo. I punti bianchi mostrano dove hanno effettivamente colpito il triangolo e l’output viene prodotto e restituito.

Con il Motion Blur, ogni raggio esiste in un momento diverso nel tempo. Di seguito sono mostrati tre colori dei raggi a scopo illustrativo per differenziarli, ma a ogni raggio viene assegnato in modo casuale un time-stamp diverso. Ad esempio, i raggi arancioni cercano di intersecare triangoli arancioni in punti diversi nel tempo, quindi i raggi verdi e blu cercano di intersecare rispettivamente triangoli verdi e blu. Il risultato è un output filtrato più macchiato e matematicamente corretto come mostrato in basso, derivato da un mix di campioni generati dai raggi che colpiscono i triangoli in diverse posizioni in diversi punti nel tempo.

La nuova unità Interpolate Triangle Position è in grado di generare triangoli nel BVH tra le rappresentazioni triangolari esistenti in base al movimento degli oggetti, in modo che i raggi possano intersecare i triangoli nelle loro posizioni previste nello spazio dell’oggetto ai tempi specificati dai time-stamp dei raggi. Questa nuova unità consente un rendering accurato della sfocatura del movimento con Ray-Tracing fino a otto volte più veloce rispetto all’architettura GPU di Turing.

Newsletter HW Legend


Caricamento