NVIDIA GameWorks VR

La realtà virtuale è una sfida impegnativa, che richiede tanta potenza di elaborazione. NVIDIA vuole andare incontro agli sviluppatori con GameWorks VR, fornendo loro tecniche software per agevolare la resa dei contenuti con i visori.

NVIDIA GameWorks VR
Articolo a cura di

Il 2015 appena passato è stato un grande anno per NVIDIA, che ha messo in gioco tante proposte allettanti ed effettuato molteplici, interessanti annunci. La situazione per l'azienda si farà ancora più calda nel 2016, complice l'arrivo della realtà virtuale nel mercato consumer. La VR cambierà il modo di interagire con i videogame e non solo. L'utente è completamente immerso nel mondo 3D che lo circonda, può girare per esempio la testa e vedere replicati gli stessi movimenti nel titolo a cui sta giocando. Alcuni controller ad hoc sono invece costruiti per essere usati come se fossero le mani del proprio personaggio, al fine di ottenere un'interazione ancora più naturale con gli oggetti del mondo virtuale. La VR è vicinissima, ma richiederà numerosi accorgimenti software ed hardware per funzionare a dovere. Essa, infatti, esige un frame rate elevato e senza troppe oscillazioni, nonché una latenza bassissima. Il mancato rispetto di solo uno di questi requisiti dà vita ad un'esperienza minata da fastidiosissimi problemi, primo fra tutti il motion sickness. NVIDIA sa quanta eccitazione giri attorno alla settore, e si è quindi rimboccata le maniche per fornire una suite contenente strumenti che tentano di migliorare la fruizione dei contenuti VR. Stiamo parlando di GameWorks VR, un ecosistema stracolmo di nuove tecnologie, atto a fornire agli sviluppatori i mezzi per far fronte all'elevata richiesta computazionale della VR. I componenti inclusi nella suite sono tanti: alcuni mirano direttamente ai motori grafici, altri invece danno una mano nella progettazione e miglioramento degli headset VR.

Panoramica su NVIDIA GameWorks VR

La realtà virtuale è nata per toccare svariati ambiti, dal gaming agli sport, dal design all'arte. Uno degli ambiti di utilizzo più interessanti è certamente il gaming, poiché un visore come Oculus Rift o HTC Vive restituisce quella totale immersività a cui ogni titolo mira con impegno. Non si parla solo di videogame per PC, ma anche per console e persino per dispositivi mobile. Le richieste computazionali però sono elevate, ed è qui che entra in gioco NVIDIA GameWorks VR, un SDK che aiuta gli sviluppatori ad incrementare le performance, ridurre la latenza e migliorare la compatibilità generale dei contenuti sviluppati per la realtà virtuale, grazie a tecnologie come il VR SLI o il Multi-Res Shading, mentre altre tecniche come il Context Priority sono dedicate agli ingegneri impegnati nel progetto di un headset VR.
Oltre alla bassa latenza ed al frame rate pari o superiore a 90 FPS, altri concetti imprescindibili per fruire al meglio dei contenuti sono un ampio campo visivo, una risoluzione adeguata, una bassa persistenza dei pixel ed un refresh rate elevato. Tutto questo ha un impatto forte sulle prestazioni e NVIDIA ha stimato che serva circa una potenza sette volte superiore a quella generata da un gaming PC tradizionale; questo perché è necessario passare ad un'esperienza con risoluzione 3024x1680 pixel a 90 FPS, che esige una potenza di calcolo di 450 MP/s - attualmente siamo in media a 60 MP/s. GameWorks VR punta a tirare in basso questo valore, in quanto 450 MP/s sono davvero tantissimi, anche per i PC da gaming di fascia più alta. Fortunatamente le premesse sono buone, ma le specifiche minime per usufruire della realtà virtuale rimangono comunque importanti. Oculus ha infatti diramato la lista dei componenti hardware essenziali per godere di un'esperienza adeguata a mezzo del proprio Rift: si parla di un processore Intel i5-4590, di 8GB di memoria RAM, di una scheda grafica NVIDIA GTX 970, di un output HDMI 1.3 e di due porte USB 3.0. GeForce Experience si aggiornerà man mano che la diffusione della realtà virtuale sarà più capillare, mettendo a disposizione degli utenti le note ottimizzazioni con singolo click anche per i titoli VR, per assicurare gli agognati 90 fps cercando di sfruttare al meglio l'hardware sotto la scocca.
Entrambi gli headset più rinomati, Oculus Rift ed HTC Vive, possiedono display a 90 Hz, che però sono difficili da mantenere, soprattutto per la loro risoluzione. Mike Abrash di Oculus, in seguito a svariati test, ha dichiarato che fra il movimento dell'utente e l'immagine a schermo non devono passare più di 20 millisecondi per un'esperienza confortevole. Il problema è che le operazioni da fare per ottenere il risultato finale sono diverse: la posizione della testa deve essere inviata dal visore alla CPU, che deve passare l'immagine da renderizzare alla GPU, inviando poi il frame definitivo allo schermo. Ogni step introduce una significativa latenza, e uno degli obiettivi più sostanziosi di GameWorks VR è fare in modo che questa sia ridotta al minimo.

VR SLI

VR SLI si basa su un'idea piuttosto semplice: ogni visore possiede due schermi separati, uno per ogni occhio. È intuitivo quindi sfruttare una scheda grafica per ogni display dell'headset, per un massiccio incremento prestazionale.
Attualmente lo SLI funziona mediante una tecnica denominata Alternate Frame Rendering (AFR). Essa consiste nel destinare il rendering dei frame dispari alla prima scheda video, mentre di quelli pari se ne occupa la seconda. Questa soluzione ha dalla sua una minore complessità nello sviluppo, ma introduce una pesante latenza. E' per questo motivo che alcuni utenti vanno incontro al cosiddetto microstuttering con alcuni titoli. Palesemente, mediante l'AFR i processori grafici non vengono mai utilizzati in parallelo. Oltre ad introdurre overhead, l'Alternate Frame Rendering non è la migliore modalità per la realtà virtuale. Una tecnica più efficiente sarebbe quella di dividere il singolo frame in due zone, ed assegnare a ciascuna una GPU. Nel caso della VR, è opportuno splittare l'immagine per far sì che la singola parte di frame sia destinata ad uno specifico occhio. Si tratta quindi di una sorta di Split Frame Rendering (SFR), che non solo diminuisce la latenza, ma incrementa anche le prestazioni perché consente al videogioco di servirsi contemporaneamente di entrambe le schede grafiche. Questa è l'unica maniera per poter sfruttare il VR SLI come indicato da NVIDIA, e fortunatamente è anche la più efficiente. Abbiamo così a che fare con una command stream condivisa, che permette alle due schede grafiche di reagire alla stessa identica maniera agli input dell'applicazione, restando così nello stesso stato istantaneo. In questa maniera non c'è overhead derivante dall'invio di troppi comandi da eseguire, in quanto essi si inviano una sola volta, poco importa quanti sono i processori grafici. Per far sì che questo concetto sia applicato ai visori, però, è essenziale differenziare leggermente il modo in cui l'API di GameWorks VR funziona. Le due GPU, infatti, devono per poter rimanere in stati differenti. Gli sviluppatori dovrebbero preparare due buffer diversi, ciascuno contenente rispettivamente i frame da spedire all'occhio destro ed i frame all'occhio sinistro. E' qui che NVIDIA mette a disposizione un metodo per i developer, chiamato SetConstantBuffer, che si occupa di raggruppare i due buffer in un singolo flusso di comandi. Anziché quindi inviare due volte lo stesso codice, l'API NVIDIA è responsabile del raccogliere i dati contenuti nei due buffer ed inviarli alle rispettive GPU. Lo sviluppatore deve esclusivamente preoccuparsi di creare i buffer, senza fare altro.

Nel caso però non si voglia inviare comandi contemporaneamente alle due schede grafiche, VR SLI fornisce una funzione per evitare che ciò accada. SetGPUMask consente di impostare una maschera per ciascuna GPU, fungendo da filtro per il singolo comando ed inviandolo solo alla scheda video di interesse. SetGPUMask dà la possibilità anche di effettuare il rendering dei frame in parallelo, nel caso il motore grafico supporti esclusivamente quello seriale - come l'AFR. Effettuare però la conversione da seriale a parallelo ha un costo, perché in pratica si perde la command stream condivisa e i comandi devono essere inviati due volte. Le maschere, comunque, possono essere sfruttate indipendentemente dal numero di GPU, non conta se queste sono due oppure otto.
Una volta che le schede grafiche hanno ricevuto i comandi, è chiaro che i risultati prodotti devono essere fusi e diventare un tutt'uno. La GPU che si occupa dell'occhio destro e quella che si occupa dell'occhio sinistro devono mettere insieme le due parti della scena, in modo che l'utente possa vedere quella completa. Tutto ciò richiede uno scambio di dati fra i processori grafici, che avviene a mezzo del bus PCI Express. Il problema è che il bus PCIe è veloce, ma non abbastanza per le applicazioni VR. Un singolo trasferimento richiede circa un millisecondo, che è un'importante fetta dei 90 Hz dei visori. Per fortuna GameWorks VR supporta i trasferimenti asincroni, e ciò permette alle GPU di scambiarsi informazioni in background, mentre esse compiono altre operazioni come il rendering. Questa modalità operativa consente di eludere elegantemente il ritardo imposto dal bus PCIe.
VR SLI quindi è un ottimo strumento per gestire più efficientemente configurazioni multi-GPU per la realtà virtuale. Sta però agli sviluppatori integrarlo al meglio nel proprio motore grafico, e lo scaling dello SLI dipende comunque dall'applicazione stessa e dall'abilità di chi la realizza.

Multi-Resolution Shading

Prima di arrivare ai nostri occhi, la luce proiettata dai display del visore passa attraverso delle lenti. Queste inducono una certa curvatura all'immagine, che deve essere in qualche maniera compensata. Un'immagine correttamente mostrata su un comune schermo sarebbe distorta se la guardassimo così com'è attraverso le lenti. Il problema è che, nativamente, una GPU non può lavorare con un'immagine così distorta, se non effettuando calcoli sin troppo onerosi. Le piattaforme VR risolvono in genere questo problema renderizzando dapprima l'immagine, per poi introdurre tale manipolazione solo in una fase di postprocessing. Curvare l'immagine in modo che sia percepita come planare a mezzo delle lenti schiaccia però i bordi, così tanto che non riusciamo più a coglierli attraverso l'ottica di un visore; la parte centrale rimane invece immutata. Questa è la premessa su cui si basa il Multi-Resolution Shading: la distorsione non viene effettuata sui bordi effettivi dell'immagine, ma su quelli scalati. L'idea di NVIDIA è quella di disegnare una griglia 3x3 sull'immagine renderizzata, lasciando immutata la parte centrale dell'immagine e scalando invece tutte le altre. Solo poi si procede a distorcere il tutto. In questo modo si pone minor carico di lavoro sulla GPU, ed inoltre si approssima meglio l'effetto introdotto dalle lenti. Lo scaling dei bordi può essere fatto in maniera più o meno accentuata, renderizzando dal 25 al 50% di pixel in meno. La zona centrale invece richiede la stessa capacità computazionale, indipendente dallo scaling effettuato. Un utilizzo aggressivo del Multi-Resolution Shading è quello che fa risparmiare metà del calcolo, ma deve essere impiegato con parsimonia perché può facilmente influenzare la qualità dell'immagine. In alcune scene, tagliare i pixel del 50% non produce effetti visibili, mentre in altre succede il contrario. Sarebbe opportuno quindi utilizzare il Multi-Resolution Shading aggressivo esclusivamente dove è adeguato, in maniera tale da velocizzare il più possibile le operazioni di rendering quando possibile, con un chiari benefici sul frame rate.

Context Priority e Direct Mode

Il Context Priority è una feature di basso livello che NVIDIA fornisce ai produttori di visori per far sì che essi possano implementare il cosiddetto Timewarp Asincrono. GameWorks VR mette a disposizione solo gli strumenti per farlo e non lo implementa da sé, sta quindi allo sviluppatore il lavoro di integrazione. Il Timewarp è una tecnica che consente agli sviluppatori di applicare effetti di post-processing all'immagine renderizzata nel caso in cui, durante il rendering stesso, l'utente effettui movimenti con la testa. Immaginiamo che la scheda grafica abbia processato una certa immagine e che, non appena finisce il rendering, l'utente guardi in una direzione differente. Il Timewarp sposta l'immagine renderizzata prima di mandarla a schermo, in modo da tenerla in linea con lo sguardo dell'utente. Tale metodo può produrre certe volte piccoli artefatti ma riduce la latenza e contribuisce a mantenere stabile il frame rate. Senza il Timewarp, prima di mandare a schermo l'immagine, il monitor deve attendere che la CPU campioni la nuova posizione della testa dell'utente e la invii ancora una volta alla GPU per il rendering. Grazie al Timewarp, mentre la GPU sta renderizzando il frame corrente, essa ha la facoltà di spostarlo nello spazio se nel mentre l'utente cambia direzione dello sguardo, senza che la CPU campioni nuovamente posizione. È per questo motivo che la latenza viene abbattuta in modo considerevole. C'è però un rilevante compromesso: il timewarp funziona bene soltanto quando il frame rate è solido, e funziona con meno efficacia se esso non lo è. Se un frame impiega più tempo a renderizzarsi, nessun nuovo frame è consegnato alla GPU e quindi l'utente nota una sorta di stuttering. In un titolo VR questo è un serio problema, che deve essere a tutti i costi eliminato. Il Timewarp Asincrono viene in nostro aiuto: la proposta è quella di non aspettare che la GPU finisca il rendering, ma che si effettui il warping e poi lo si continui a renderizzare. In questo modo nessun frame rimane bloccato per troppo tempo a schermo.
Il Direct Mode è un'altra caratteristica che, come Context Priority, si rivolge direttamente ai progettisti di visori. I driver NVIDIA riescono a captare la differenza fra gli schermi di un headset VR e di un monitor comune. Questo permette alla scheda grafica di nascondere l'immagine dallo schermo classico, a meno che il sistema operativo non forzi la visualizzazione anche su quest'ultimo.

NVIDIA Secondo i dati di NVIDIA, al giorno d’oggi sono solo 13 milioni i PC che rispecchiano i requisiti minimi della virtual reality, e questi possiedono esclusivamente schede grafiche di fascia medio-alta o superiore. NVIDIA sta lavorando duramente per portare ottimizzazioni VR sulle sue GeForce GTX, sfruttando tutta la potenza di GameWorks VR. La società di Santa Clara ha fatto sapere che tale piattaforma continuerà ad espandersi, via via che la realtà virtuale si diffonde. Le compagnie coinvolte attualmente in progetti sulla VR sono circa 600, ed il numero è destinato solo a salire. NVIDIA ha già rilasciato una lista contenente alcuni notebook già pronti per la VR, tutti dotati di un chip GeForce GTX 980. Figurano per esempio l’ASUS GX700VO, l’MSI GT80, l’Aorus X7 DT o il Clevo P870DM. Anche i videogame si stanno scaldando, ed il primo motore grafico ad annunciare il pieno supporto a GameWorks VR è stato il diffusissimo Unreal Engine 4, a cui seguiranno probabilmente tanti altri. Anche la rivale AMD si sta dando da fare con la soluzione LiquidVR, suite che ha anch’essa il suo ventaglio di feature. La competizione fa sempre bene ai consumatori e tiene l’interesse sempre acceso, anche nel campo della realtà virtuale, vero campo di battaglia in cui si sfideranno le aziende nel prossimo futuro.