Traversal Shaders, cosa sono e quali applicazioni ha su GPU

Shader trasversali

Dall'apparizione di DirectX 8 il numero di nuovi tipi di shader è andato aumentando nel tempo, i successivi ad essere inclusi nell'elenco sono chiamati Traversal Shaders, che hanno a che fare con i progressi verso l'adozione con pausa, ma senza ray tracing che frenano in Giochi. Vediamo in cosa consiste e quali miglioramenti porterà ai giochi in termini di prestazioni.

I Traversal Shaders sono una delle due filosofie per porre il problema del percorso della struttura dei dati spaziali in Ray Tracing, che consiste nell'utilizzo di programmi shader per attraversare la struttura dei dati spaziali che rappresenta la scena invece di utilizzare strumenti specializzati o dedicati hardware.

Prima di tutto, ricordiamo cos'è uno Shader

Esempio di funzione shader

Nel software conosciamo colloquialmente come shader un programma che viene eseguito sui core del GPU, che hanno nomi diversi a seconda del produttore. Così AMD chiama questi pezzi di hardware Computer Units nella sua Radeon, NVIDIA li chiama Stream Multiprocessors o SM nella sua GeForce e Intel dà loro nei suoi nomi ARC queste unità Xe Core.

Quindi lo shader stesso è il software che gira su una di quelle unità, che funzionano molto da vicino a CPU, la differenza è che uno shader è un programma che viene eseguito su una primitiva grafica nelle diverse fasi della pipeline di rendering: vertici, primitive, triangoli, frammenti o pixel. Sebbene queste categorie non siano altro che astrazioni che creiamo, per l'unità shader tutto è dato e questo significa che possono eseguire tutti i tipi di programmi.

Allora perché non usare una CPU? Ebbene, a causa del fatto che ci sono problemi che le GPU, essendo progettate per funzionare in parallelo, funzionano molto meglio quando risolvono determinati contesti rispetto a quello che fa una CPU, e allo stesso modo accade nel caso delle GPU.

Microsoft, DirectX Ray Tracing e i suoi shader

Raytracing di Microsoft DirectX 12

Quando Redmond parlò per la prima volta dell'implementazione del ray tracing alla Games Developer Conference nel 2018, mancavano pochi mesi al lancio della NVIDIA RTX 20 e a quel tempo era completamente sconosciuto, almeno pubblicamente, l'esistenza di unità da accelerare Ray Tracing come i core RT di NVIDIA e le unità di accelerazione Ray di AMD.

Cosa era Microsoftla proposta di espandere la sua API multimediale? Bene, aggiungi una serie di fasi aggiuntive, che sono definite nel seguente diagramma:

Etapas DXR

Capire lo schema è facile:

  • I blocchi in blu sono programmi shader che vengono eseguiti a livello di GPU.
  • I blocchi in verde vengono eseguiti nella CPU, driver, in tandem con la GPU.
  • I diamanti in grigio sono condizioni che possono verificarsi quando un fulmine attraversa la scena.

Ora, in questo diagramma c'è un elemento che non è incluso ed è per ora uno dei maggiori problemi che esistono riguardo al Ray Tracing: il percorso della struttura di accelerazione. E che cos'è? Ne abbiamo parlato nei nostri tutorial di ray tracing, ma ricordarlo non fa mai male.

Strutture dati per velocizzare il ray tracing

rbol BVH

Per accelerare, e quindi far girare più velocemente, gli algoritmi di ray tracing, quello che viene fatto è mappare la posizione degli oggetti nella scena in una struttura dati, che ha la forma di un albero binario rispetto alla GPU. dovrebbe andare.

Per comprendere il processo di passaggio attraverso la struttura dei dati, ciò che viene fatto è iniziare dalla radice che rappresenta l'intera scena ed è specificata per livelli fino a raggiungere l'ultimo livello. In ogni livello ciò che viene fatto è fare una richiesta all'RT Core o all'unità equivalente per calcolare se c'è un incrocio, se ce n'è uno allora si scende al livello successivo, se non c'è allora quel percorso si ferma completamente. Questo viene fatto fino a raggiungere la fine dell'albero, che è dove l'intersezione raggio-riquadro non viene più eseguita e viene eseguita l'intersezione raggio-poligono.

Se sei stato perspicace, avrai visto che nel diagramma della sezione precedente tra i tipi di shader abbiamo quelli di intersezione, ma non quelli incaricati di attraversare l'albero BVH, cioè di attraversarli, sebbene sia capito che questo compito è svolto dagli shader delle unità anche se non esiste un tipo specifico di shader per esso.

I Traversal Shader, cosa sono e qual è la loro origine?

Nella documentazione di DirectX Ray Tracing possiamo trovare tra quelli futuri i cosiddetti Traversal Shaders, che verranno aggiunti in futuro all'interno della pipeline per Ray Tracing in una versione successiva delle API Microsoft, ma la cosa migliore è metterci nella situazione.

L'esercizio di attraversare la struttura dati finora nonostante sia un programma shader, questo è generico ed è controllato dal driver grafico, quindi i programmatori non devono fare nulla in quanto è ben inteso che il traversal shader Dà il controllo del codice dell'applicazione per eseguire il processo di attraversamento della struttura dati nodo per nodo.

E quali vantaggi porta questo alle prestazioni? Il principale è che possiamo definire scenari in cui uno o più raggi vengono scartati prima di effettuare l'intersezione, cosa non possibile in questo momento. Un esempio molto chiaro potrebbe essere affrontare oggetti molto lontani dalla fotocamera in cui il dettaglio dell'illuminazione non può essere apprezzato come a distanza ravvicinata. Bisogna tener conto che nella versione attuale dell'API di Redmond possiamo definire per quanto riguarda l'illuminazione indiretta se un oggetto emette raggi o meno tramite il Ray Generation Shader, ma non possiamo creare scenari in cui possiamo escludere i raggi in volo , soprattutto con la distanza.

Shader trasversali per costruire la struttura dei dati spaziali

Shader trasversali

La divisione R&D grafica di Intel ha presentato nel 2020 un documento intitolato Costruzione pigra di strutture di accelerazione con Shader trasversali e quelli di voi che hanno un po' di padronanza della lingua shakespeariana avranno dedotto che consiste nella costruzione delle stesse strutture di dati spaziali facendo uso di Traversal Shaders. Quindi questi possono essere usati non solo per controllare il percorso, ma anche per costruirlo.

La prima cosa che spicca è Lazy Build, che potremmo tradurre essere educati come una build con poco sforzo. E in cosa consiste? Bene, ciò che questa tecnica cerca è che il tempo di costruzione della struttura dati sia ridotto. Per questo, si basa su informazioni precedenti da fotogrammi precedenti aggiunti a un algoritmo di visibilità e se questo sembra confuso, definiamo cosa significa visibilità quando parliamo di rendering 3D.

Visibilità

Dobbiamo partire dal principio che quando una GPU esegue il rendering quello che fa è calcolare la visibilità tra un punto nello spazio e la prima superficie visibile in una data direzione o per semplificare: la visibilità tra due elementi. Prima di proseguire dobbiamo tener conto di una cosa, sicuramente leggendo questo vi sarete immaginati guardando due oggetti. Ebbene, la cosa non è così, stiamo parlando di come un oggetto vedrebbe un altro se potesse vedere, ma dalla definizione più semplice si fa riferimento alla telecamera, che è la vista da cui rendiamo.

Nel rendering ibrido che combina la rasterizzazione con il ray tracing, utilizzato ormai da tutti i giochi, la visibilità della telecamera non viene calcolata da detto algoritmo, ma piuttosto con l'algoritmo raster. L'idea in futuro è che la visibilità rispetto alla telecamera sia fatta da Ray Tracing, in modo che con queste informazioni la GPU finisca per costruire una struttura dati dell'intera scena attraverso i Traversal Shaders.