Mentre Metal è la tecnologia di rendering grafico veloce di Apple per i giochi, MetalFX aggiunge miglioramenti per farlo brillare su Apple Silicon. Ecco come funziona MetalFX.
Nel 2014 Apple ha introdotto la sua nuova tecnologia di rendering di grafica e giochi chiamata Metal.
Metal è un’API di rendering che fornisce prestazioni rapide ottimizzate per l’hardware Apple. Con l’avvento delle GPU Apple Silicon, Metal ottiene un aumento delle prestazioni ancora maggiore.
Un problema nel rendering grafico dei giochi per computer è come disegnare un gran numero di poligoni modella rapidamente con shader di superficie ad alta risoluzione ed effetti rapidamente. Poiché i frame rate e la complessità delle scene di gioco sono aumentati, questo problema ha creato colli di bottiglia nelle pipeline di rendering grafico.
L’API Metal è un’API Apple C++ che ha il proprio linguaggio di ombreggiatura chiamato, come ci si aspetterebbe, Metal Shading Language (MSL). L’API Metal è stata confrontata con DirectX 12 su Windows o con la libreria di rendering grafico di terze parti Vulkan.
Esistono anche versioni Swift e Objective-C dell’API Metal.
Tuttavia, poiché Metal è di Apple e progettato per l’hardware Apple, fornisce le migliori prestazioni di rendering grafico di qualsiasi tecnologia di rendering disponibile su tali dispositivi.
Puoi vedere un esempio di rendering Metal in azione ogni volta che avvii un gioco Apple Arcade su un dispositivo iOS o tvOS: la breve animazione di rimbalzo del logo Apple Arcade che viene eseguita prima che ogni gioco Apple Arcade venga renderizzato utilizzando Metal.
Molti giochi utilizzano l’accelerazione hardware GPU e shader precalcolati per velocizzare il rendering grafico. In Metal, i comandi grafici vengono codificati in anticipo e quindi inviati alle GPU per il rendering.
Gli stati di rendering precalcolati comunicano in anticipo alla GPU come configurare la pipeline di rendering per ottenere le massime prestazioni.
Gli shader di rendering, o programmi precalcolati che controllano luce, oscurità e colore, vengono utilizzati durante il rendering di scene 3D per fornire realismo ed effetti speciali. L’MSL descrive come funzionano gli shader Metal.
Gli shader sono stati introdotti per la prima volta nel software commerciale nel 1988 con il software RenderMan della Pixar, che ha una lunga storia sul Mac che risale a decenni fa.
Nella maggior parte delle moderne pipeline di rendering GPU, sia i dati 3D che i programmi di linguaggio di ombreggiatura vengono inviati alla GPU per l’elaborazione, che gestisce quindi un processo o pipeline in più fasi mediante il quale viene creato ogni fotogramma in una scena.
Le fasi di rendering comportano approssimativamente trasformazioni della geometria, scomposizione dei modelli in triangoli e quad, applicazione di shader di frammenti, test di profondità e combinazione ed esclusione di superfici e oggetti occlusi. L’ultimo passaggio prevede la combinazione di tutto nel frame buffer finale per la visualizzazione.
Tutto ciò accade dozzine di volte al secondo sull’hardware GPU moderno.
Metal include anche gli shader delle prestazioni, programmi che accelerano il rendering riducendo il carico della GPU. Gli shader delle prestazioni includono il filtraggio delle immagini, la rete neurale, la matematica avanzata e il ray tracing.
Il ray tracing migliora notevolmente le superfici, le trame e i riflessi degli oggetti del modello 3D dalle fonti di luce.
Nel 2020 Apple ha annunciato di aver portato Metal su CPU e GPU Apple Silicon per fornire prestazioni molto più veloci. Al WWDC 2022, Apple ha introdotto una nuova funzionalità in Metal chiamata MetalFX.
MetalFX consente un rendering della scena più rapido e accurato ricalcolando e applicando l’anti-aliasing di alcuni fotogrammi per ricalcolare e smussare i bordi degli oggetti renderizzati.
L’arma segreta di MetalFX è una tecnologia chiamata upscaling.
L’idea è di rendere un oggetto o scena a una risoluzione inferiore, che rende più veloce il rendering complessivo del frame buffer. Quindi, aggiunge un ulteriore passaggio prima che venga visualizzato ingrandendo la scena.
Eseguendo il rendering della maggior parte delle scene a dimensioni più piccole, le scene possono essere renderizzate più velocemente e con maggiori dettagli e complessità. Nella maggior parte dei casi, di solito è più veloce eseguire il rendering degli oggetti della scena su scala ridotta e quindi migliorare la risoluzione complessiva del fotogramma finale piuttosto che eseguire il rendering dell’intera scena su una dimensione finale maggiore.
Utilizzando l’upscaling, MetalFX può fornire sia un rendering della scena più veloce che più dettagli e nitidezza degli oggetti.
Un esempio di upscaling MetalFX. La cornice a destra appare più nitida.
MetalFX utilizza due distinti tipi di upscaling: upscaling spaziale e upscaling anti-aliasing temporale.
Nell’upscaling spaziale, vengono create due classi Metal, MTLFXSpatialScalerDescriptor e MTLFXSpatialScaler. L’oggetto descrittore descrive i dettagli dell’oggetto scalatore spaziale e l’oggetto MTLFXSpatialScaler esegue la codifica effettiva (tramite il relativo metodo di codifica).
Quando viene chiamata la codifica, l’oggetto MTLFXSpatialScaler crea e invia comandi di rendering a un oggetto MTLCommandBuffer per il rendering. Questo processo viene ripetuto per ogni fotogramma di una scena.
L’upscaling spaziale MetalFX può fornire all’incirca fino al doppio dei dettagli della scena senza alcuna perdita materiale di prestazioni.
La creazione di oggetti MTLFXSpatialScaler è computazionalmente costosa e dovrebbe essere eseguita solo quando un’applicazione viene avviata o uno schermo cambia risoluzione.
Nell’upscaling dell’anti-aliasing temporale, i dati del fotogramma precedente vengono utilizzati come input per l’upscaling del fotogramma corrente.
Il supercampionamento e il campionamento temporale sono tecniche che utilizzano i dati dei singoli pixel dai fotogrammi per ottenere l’upscaling. Vengono campionati sia i dati di ciascun pixel che i pixel di più fotogrammi.
L’anti-aliasing temporale è leggermente più intensivo in termini di elaborazione e richiede dati aggiuntivi su colore, profondità e movimento per funzionare.
Ecco un altro esempio di upscaling anti-aliasing dalla presentazione WWDC di Apple:
1080p, a sinistra e 4K upscaling a destra con upscaling anti-aliasing.
La maggior parte dell’upscaling di MetalFX dovrebbe avvenire dopo il rendering ma prima di qualsiasi post-elaborazione finale è fatto su telai.
Un utilizzo dell’upscaling anti-aliasing MetalFX è aumentare la risoluzione dei frame 1080p in modo che si avvicinino alla risoluzione 4K.
Proprio come con l’upscaling spaziale, MetalFX fornisce due classi per l’upscaling anti-aliasing: MTLFXTemporalScalerDescriptor e MTLFXTemporalScaler.
La documentazione completa di MetalFX è disponibile sul sito web degli sviluppatori di Apple. Apple ha anche tenuto un video della sessione MetalFX al WWDC’22 intitolato”Aumenta le prestazioni con MetalFX Upscaling”che descrive in dettaglio l’uso di MetalFX, incluso il codice di esempio.
Diversi titoli di giochi AAA, tra cui No Man’s Sky, utilizzano già MetalFX sui dispositivi Apple.
MetalFX promette moderne tecniche di calcolo grafico per aumentare sia la risoluzione della scena che le prestazioni di gioco su hardware GPU moderno. È probabile che la nuova tecnologia Metal rivoluzionerà i giochi sui dispositivi Apple.