DirectX 12 Ultimate porta le funzionalità di Xbox Series X nei giochi per PC

98
  • Il ray tracing DirectX è diventato disponibile all’inizio del 2018. DX12 Ultimate offre nuove funzionalità che non erano disponibili in DXR1.0.

    Nvidia

  • L’ombreggiatura a velocità variabile (VRS) consente ai giochi di concentrare più dettagli su porzioni di scene che ne hanno bisogno e meno su porzioni di sfondo (o in rapido movimento) in cui la mancanza non verrà notata.

    Nvidia

  • Gli shader mesh (e lo shader di amplificazione) reinventano la pipeline della geometria DirectX, aumentando il parallelismo e consentendo potenzialmente meno viaggi di andata e ritorno dalla GPU alla CPU.

    Nvidia

  • Sampler Feedback consente una maggiore qualità senza aumentare i tempi di elaborazione, consentendo agli sviluppatori di caricare le trame solo quando necessario.

    Nvidia

Oggi Microsoft annuncia una nuova versione della sua piattaforma API multimediale e di gioco, DirectX. La nuova versione, DirectX 12 Ultimate, unifica in gran parte i PC Windows con la prossima piattaforma Xbox Series X, offrendo le nuove funzionalità di rendering di precisione della piattaforma ai giocatori Windows con schede video di supporto.

Molte delle nuove funzionalità hanno più a che fare con il lato software dello sviluppo che con l’hardware. Le nuove chiamate API DirectX 12 Ultimate non solo consentono l’accesso a nuove funzionalità hardware, ma offrono un accesso più profondo, di livello inferiore e potenzialmente più efficiente alle funzionalità e alle risorse hardware già presenti.

Per ora, le nuove funzionalità sono previste in gran parte solo per le schede Nvidia, con “pieno supporto su GeForce RTX”: la presentazione da cui stai vedendo le diapositive proviene in realtà da Nvidia stessa, non da Microsoft. Nel frattempo, AMD ha annunciato che la sua prossima serie di GPU RDNA 2 avrà “pieno supporto” per l’API DirectX 12 Ultimate, ma non per le precedenti generazioni di schede AMD. (AMD coglie l’occasione per ricordare ai giocatori che la stessa architettura RDNA 2 alimenta sia la Xbox Series X di Microsoft che le console PlayStation 5 di Sony.)

Alcune delle nuove chiamate ricordano il lavoro che AMD ha svolto indipendentemente nei driver Radeon. Ad esempio, l’ombreggiatura a velocità variabile ci sembra simile al sistema Radeon Boost di AMD, che riduce dinamicamente la risoluzione dei fotogrammi durante il rapido panning. Sebbene queste caratteristiche non siano certamente la stessa cosa, sono abbastanza simili nel concetto che sappiamo che AMD ha almeno pensato in modo simile.

Questo video prodotto da Nvidia offre esempi visivi delle nuove funzionalità aggiunte in DirectX 12 Ultimate.

Tracciamento dei raggi DirectX

Ingrandisci / Sebbene questa immagine non sia stata creata utilizzando il ray-tracing in tempo reale DirectX, è un buon esempio di ciò che la tecnica può fare. Il concetto chiave è seguire un raggio di luce mentre rimbalza o si rifrange attraverso più oggetti.

DirectX Ray Tracing, noto anche come DXR, non è nuovo di zecca: DXR1.0 è stato introdotto due anni fa. Tuttavia, DirectX 12 Ultimate introduce diverse nuove funzionalità in uno schema di controllo delle versioni DXR1.1. Nessuna delle funzionalità di DXR1.1 richiede nuovo hardware: le GPU esistenti in grado di eseguire il ray-tracing necessitano semplicemente del supporto del driver per abilitarle.

Per il momento, solo Nvidia offre schede grafiche per PC rivolte ai clienti con ray tracing hardware. Tuttavia, Xbox Series X offre il ray tracing sul suo hardware GPU Radeon personalizzato e il CEO di AMD Lisa Su ha affermato di aspettarsi schede grafiche Radeon discrete con supporto del ray tracing “mentre andiamo attraverso il 2020” al CES2020 di gennaio.

Annuncio

Ray-tracing in linea

Il ray tracing in linea è un’API alternativa che consente agli sviluppatori un accesso di livello inferiore alla pipeline di ray tracing rispetto al ray tracing basato su dynamic-shader di DXR1.0. Invece di sostituire il ray tracing con shader dinamico, il ray tracing inline è presente come modello alternativo, che può consentire agli sviluppatori di effettuare chiamate di ray tracing poco costose che non hanno tutto il peso di una chiamata con shader dinamico. Gli esempi includono il calcolo dell’ombra vincolato, le query da shader che non supportano i raggi di shader dinamici o semplici raggi ricorsivi.

Non esiste una risposta semplice su quando il ray tracing in linea è più appropriato di quello dinamico; gli sviluppatori dovranno sperimentare per capire il miglior equilibrio tra l’uso di entrambi i set di strumenti.

DispatchRays() tramite ExecuteIndirect()

Gli shader in esecuzione sulla GPU possono ora generare un elenco di chiamate DispatchRays(), inclusi i loro parametri individuali. Ciò può ridurre significativamente la latenza per gli scenari che preparano e generano immediatamente il lavoro di ray-tracing sulla GPU, poiché elimina un viaggio di andata e ritorno alla CPU e viceversa.

Oggetti di stato in crescita tramite AddToStateObject()

In DXR1.0, se gli sviluppatori volessero aggiungere un nuovo shader a una pipeline di ray tracing esistente, dovrebbero creare un’istanza di una pipeline completamente nuova con uno shader aggiuntivo, copiando gli shader esistenti nella nuova pipeline insieme a quella nuova. Ciò ha richiesto al sistema di analizzare e convalidare gli shader esistenti e quello nuovo, quando viene istanziata la nuova pipeline.

AddToStateObject() elimina questo spreco facendo esattamente quello che sembra: consentendo agli sviluppatori di espandere una pipeline di ray tracing esistente, richiedendo l’analisi e la convalida solo del nuovo shader. L’aumento di efficienza qui dovrebbe essere ovvio: una pipeline di 1.000 shader che deve aggiungere un singolo nuovo shader ora deve convalidare solo uno shader, anziché 1.001.

GeometryIndex() negli shader di ray tracing

GeometryIndex() consente agli shader di distinguere le geometrie all’interno delle strutture di accelerazione di livello inferiore, senza dover modificare i dati nei record degli shader per ciascuna geometria. In altre parole, tutte le geometrie in una struttura di accelerazione di livello inferiore possono ora condividere lo stesso record di shader. Quando necessario, gli shader possono usare GeometryIndex() per indicizzare le strutture dati dell’app.

Salto di un’istanza primitiva con modifiche di configurazione

Gli sviluppatori possono ottimizzare le pipeline di ray tracing saltando le primitive non necessarie. Ad esempio, DXR1.0 offre RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, RAY_FLAG_CULL_NON_OPAQUE e RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH.

DXR1.1 aggiunge opzioni aggiuntive per RAY_FLAG_SKIP_TRIANGLES e RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES.

Ombreggiatura a velocità variabile

Ingrandisci / Un lato di questa immagine rende il 14 percento più veloce grazie all’uso di VRS per evitare il rendering dei dettagli non necessario. Puoi dire qual è quale?

Nvidia

L’ombreggiatura a tasso variabile (VRS) si autodefinisce “un bisturi nel mondo delle mazze”. VRS consente agli sviluppatori di selezionare la velocità di ombreggiatura su porzioni di fotogrammi in modo indipendente, concentrando la maggior parte dei dettagli e il carico di lavoro di rendering sulle porzioni che ne hanno effettivamente bisogno e lasciando che lo sfondo o gli elementi visivamente non importanti vengano visualizzati più rapidamente.

Annuncio

Sono disponibili due livelli hardware per il supporto VRS. L’hardware di livello 1 può implementare tassi di ombreggiatura per disegno, che consentirebbero agli sviluppatori di disegnare risorse grandi, lontane o nascoste con dettagli di ombreggiatura inferiori, quindi disegnare risorse dettagliate con dettagli di ombreggiatura maggiori.

Se sai che un giocatore sparatutto in prima persona presterà più attenzione al mirino che altrove, puoi avere il massimo dettaglio dell’ombreggiatura in quell’area, cadendo gradualmente fino al minimo dettaglio dell’ombreggiatura nella visione periferica.

Uno sviluppatore di giochi di ruolo o di strategia in tempo reale, d’altra parte, potrebbe invece scegliere di concentrare i dettagli dell’ombreggiatura extra sui confini dei bordi, dove è più probabile che gli artefatti di aliasing siano visivamente odiosi.

VRS per primitivo fa un ulteriore passo avanti consentendo agli sviluppatori di specificare il tasso di ombreggiatura in base al triangolo. Un caso d’uso ovvio è per i giochi con effetti di sfocatura del movimento: perché preoccuparsi del rendering di ombre dettagliate su oggetti lontani se sai che le sfocherai comunque?

Screenspace e l’ombreggiatura a velocità variabile per primitiva possono essere combinati e abbinati all’interno della stessa scena, utilizzando i combinatori VRS.

Mesh e shader di amplificazione

  • Gli shader mesh consentono una maggiore parallelizzazione della pipeline di ombreggiatura.

    Nvidia

  • Uno shader di amplificazione è, essenzialmente, una raccolta di shader mesh con accesso condiviso ai dati dell’oggetto padre.

    Nvidia

Gli shader mesh mettono in parallelo l’elaborazione mesh utilizzando un modello di programmazione di calcolo. I blocchi della mesh complessiva sono separati in “meshlet”, ciascuno costituito in genere da 200 o meno vertici. I singoli meshlet possono quindi essere elaborati simultaneamente anziché in sequenza.

Gli shader mesh inviano una serie di threadgroup, ognuno dei quali elabora un meshlet diverso. Ogni threadgroup può accedere alla memoria condivisa di gruppo ma può generare vertici e primitive che non devono essere correlati con un thread specifico nel gruppo.

Ciò riduce notevolmente la latenza di rendering, in particolare per le geometrie con colli di bottiglia lineari. Consente inoltre agli sviluppatori un controllo molto più granulare su parti separate della mesh complessiva piuttosto che dover trattare l’intera geometria nel suo insieme.

Gli shader di amplificazione sono essenzialmente raccolte di shader mesh gestiti e istanziati come uno. Uno shader di amplificazione invia gruppi di thread di shader mesh, ognuno dei quali ha accesso ai dati dello shader di amplificazione.

Feedback del campionatore

Ingrandisci / Separare l’ombreggiatura e la rasterizzazione consente di eseguire corse più efficienti e poco frequenti attraverso le routine di calcolo dell’illuminazione.

Nvidia

Il feedback del campionatore essenzialmente rende più semplice per gli sviluppatori capire a quale livello di dettaglio eseguire il rendering delle trame al volo. Con questa funzione, uno shader può interrogare quale parte di una trama sarebbe necessaria per soddisfare una richiesta di campionamento senza dover effettivamente eseguire l’operazione di campionamento. Ciò consente ai giochi di eseguire il rendering di trame più grandi e dettagliate utilizzando meno memoria video.

Texture Spacing Shading amplia la tecnica di feedback del campionatore consentendo al gioco di applicare effetti di ombreggiatura a una trama, indipendentemente dall’oggetto su cui è avvolta la trama. Ad esempio, un cubo con solo tre facce visibili non necessita di effetti di luce applicati alle tre facce posteriori.

Utilizzando TSS, gli effetti di luce possono essere applicati solo alle parti visibili della trama. Nel nostro esempio di cubo, questo potrebbe significare solo illuminare la porzione che avvolge le tre facce visibili nello spazio di calcolo. Questo può essere fatto prima e indipendentemente dalla rasterizzazione, riducendo l’aliasing e minimizzando le spese di calcolo degli effetti di luce.

Immagine dell’elenco di Nvidia