Eurogamer chiede, Guerrilla spiega, io cerco di spiegare la spiegazione

Tutto nasce da un articolo di Digital Foundry del 2 marzo in cui l’editore Leadbetter cerca di spiegare perché 1080p+30fps e 720p+60fps non sono sempre alternative praticabili e che spesso non si può solo “decidere” se avere una o l’altra. Tra le varie cose nel corso dell’articolo viene analizzato nuovamente Killzone: Shadow Fall, e si scopre che in realtà il buffer di rendering del multiplayer non è ad un 1080p “pieno”, ma lavora con solo la metà delle righe verticali, cioè a 960×1080.

Apriti cielo. Tutti gridano che Shadow Fall è sub-1080p ed è upscalato, motivo per cui Sony e gli sviluppatori hanno mentito.

 

Oggi, 6 marzo, Guerrilla Games pubblica un post sul proprio blog per spiegare come stanno effettivamente le cose. Riporto e traduco integralmente il comunicato. La parte tecnica potrebbe risultare difficile da comprendere per chi non se ne intende di queste cose, quindi cercherò a fine articolo di riassumerla e spiegarla in modo più facile.

 

Q: KILLZONE SHADOW FALL gira a 1080p o a qualche altra risoluzione?
Sia il singolo che il multiplayer di KILLZONE SHADOW FALL girano a 1080p.

 

Q: SHADOW FALL gira a 1080p nativamente?
Sia in SP che in MP KILLZONE SHADOW FALL produce in uscita un’immagine completa e non scalata a 1080p che può arrivare fino a 60 FPS. “Nativo” si usa spesso per indicare immagini che non vengono scalate; è nativa secondo quella definizione.

Nella modalità multiplayer, comunque, utilizziamo una tecnica chiamata “temporal reprojection”, che combina pixel e vettori di movimento da un maggior numero di frame a risoluzione inferiore per ricostruire un’immagine piena a 1080p. Se “nativo” significa che ogni elemento della pipeline è a 1080p, allora questa tecnica non è nativa.

I giochi impiegano spesso risoluzioni diverse in parti diverse della loro pipeline di rendering. Il grosso dei giochi renderizza gli effetti particellari e l’ambient occlusion ad una risoluzione minore, mentre altri giochi calcolano addirittura tutte le luci ad una risoluzione inferiore [di 1080p, NdT]. Viene chiamato comunque 1080p di solito. Questa tecnica impiegata in KILLZONE SHADOW FALL si spinge oltre e ricostruisce metà dei pixel partendo da frame precedenti.

Comprendiamo il grado di coinvolgimento della community su questa faccenda, e che la terminologia convenzionale usata fino ad ora potrebbe essere stata troppo vaga per spiegare con chiarezza cosa succede realmente dietro le quinte. Di conseguenza faremo del nostro meglio per essere più precisi con la terminologia in futuro.

 

Q: Quindi come funziona la “temporal reprojection”, e qual è la differenza rispetto all’upscaling?
L’upscaling è un filtro di interpolazione spaziale. Quando si upscala un’immagine da una risoluzione ad un’altra nuovi pixel vengono aggiunti stirando l’immagine nelle dimensioni X e Y. I valori dei nuovi pixel sono scelti in modo che siano da qualche parte a metà tra i valori reali dei vecchi pixel. Questo produce un’immagine più grande, ma anche più sfocata.

La temporal reprojection è una tecnica che tiene traccia nel tempo della posizione dei pixel  e predice dove andranno in futuro. Questi “pixel storici” vengono combinati con pixel appena renderizzati per formare un nuovo frame ad una risoluzione più alta. È questo che usa KILLZONE SHADOW FALL nel multiplayer. 

Quindi, un po’ più in dettaglio, questo è quello che dobbiamo fare per impiegare questa tecnica: 

  • Teniamo traccia di tre immagini di “pixel storici” grandi 960×1080
    • Il frame attuale
    • Il frame precedente
    • E il frame ancora prima
  • Per ogni pixel salviamo il suo colore e il suo vettore motorio – ovvero la direzione del pixel a video
     
  • Salviamo anche un “frame precedente” a 1080p pieni che usiamo per migliorare l’anti-aliasing
     

Poi dobbiamo ricostruire tutti i pixel dispari del frame:

  • Rintracciamo la posizione di ogni pixel nel frame precedente e in due frame prima usando il suo vettore motorio
     
  • Guardando come il pixel si è mosso in precedenza determiniamo la sua “prevedibilità”
     
  • Il grosso dei pixel sono molto prevedibili, quindi usiamo la ricostruzione di un frame precedente come pixel dispari [del frame attuale, NdT]
     
  • Se il pixel non è molto prevedibile prendiamo il valore migliore da quelli vicini nel frame attuale
     

In certe occasioni la predizione sbaglia e i pixel diventano localmente sfocati, o compaiono delle sottili linee verticali. Il grosso delle volte tuttavia la previsione funziona bene e l’immagine è identica ad una normale immagine a 1080p. A quel punto aumentiamo l’antialiasing dub-pixel usando il nostro “frame precedente” a 1080p e i vettori motori, migliorando ulteriormente la qualità dell’immagine.

La tecnica di temporal reprojection ha prodotto risultati soggettivamente simili e rende certe parti del processo di rendering più veloci [rispetto ad un normale 1080p nativo]. Questo riduce il ritardo del controller e ne aumenta la reattività, cosa che migliora l’esperienza multiplayer di KILLZONE SHADOW FALL.

 

 

Se avete già capito tutto non penso ci sia più bisogno di me: avete chiaramente le conoscenze tecniche sufficienti a decidere da voi come stanno le cose.

Se vi siete persi da qualche parte, invece, restate ancora un momento.

 

Dunque… la questione in verità è molto più semplice di quanto possa sembrare, basta parlare in termini comprensibili. Le engine 3D in cui vengono costruiti i giochi lavorano sostanzialmente “in astratto”, ovvero definiscono gli oggetti nello spazio secondo coordinate e comunque contengono gli ordini di come andrà rappresentato qualcosa, ma non la sua effettiva rappresentazione. Le immagini che il monitor del vostro tv riproduce sono invece raster, ovvero sono definite pixel per pixel, ogni pixel con il proprio colore chiaramente scritto sopra e basta. Il render è il processo che converte le “istruzioni” dell’engine in immagini raster, e per i videogiochi deve avvenire in tempo reale.

Come è intuibile, ciò che è contenuto nel codice dell’engine non ha risoluzione: sono istruzioni spaziali o di posizionamento generiche, non sono vincolate da nessuna “dimensione finale” arbitraria. Le immagini raster, al contrario, sono definite da una risoluzione molto precisa. Nel caso del 1080p questa risoluzione è 1920×1080, cioè 1920 pixel in ogni riga orizzontale e 1080 in ogni colonna verticale.

Quando un gioco, per come la si dice di solito, viene “renderizzato a 1080p nativi” significa che le “istruzioni” dell’engine vengono convertite in un’immagine raster da 1920×1080. Un gioco che renderizza a 720p e poi upscala a 1080p, invece, produce dei raster da 1280×720 che vengono subito dopo “stirati” (cioè scalati) fino a diventare 1920×1080; i pixel mancanti sono come dei “buchi” tra i vecchi pixel, e vengono riempiti facendo delle medie dei colori dei pixel originali attorno a loro.

Come accenna il testo di Guerrilla, le cose in verità non sono quasi mai così pulite. Spesso vari tipi di elementi grafici presenti nell’engine vengono renderizzati a risoluzioni diverse; ad esempio i modelli 3D possono venire elaborati a 1080p e gli effetti particellari, più impegnativi, a 720p: in questo caso il risultato sono due immagini, una più grande dell’altra, dove quella più piccola viene upscalata e poi “incollata” sull’altra.

Nel caso del multiplayer di Shadow Fall le cose sono ancora più complicate. Il gioco viene tutto renderizzato alla stessa risoluzione, non ci sono preferenze per alcuni elementi rispetto ad altri, ma il render copre solo metà dei pixel orizzontali, “deducendo” l’altra metà con una tecnica che va a guardare i frame precedenti e poi facendo comunque un passaggio di antialiasing per unificare il risultato ed eliminare difetti visivi. È come se l’immagine raster che esce del render fosse disegnata solo una colonna sì e una no, e poi le colonne mancanti venissero disegnate in base ad un’approssimazione dedotta usando i frame definitivi precedenti, invece che solo riempite con un colore medio arbitrario deciso guardando i pixel vicini del frame stesso (come avviene invece nel caso di un upscaling).

 

 

Spero di avere chiarito le cose; io meglio di così non riesco a spiegarmi, e mi rendo conto che sia un argomento difficile per chi non sa nulla di grafica digitale. La risposta comunque è: no, il multiplayer di Shadow Fall non lavora a 960×1080 e poi viene upscalato a 1920×1080, ma allo stesso tempo non viene neanche veramente renderizzato a 1920×1080 nativi; si è optato per una terza via, a metà tra queste due sia per definizione sia per impegno richiesto sulla macchina.

Se però siete ancora lì a chiedervi come accidenti funzioni questa temporal reprojection forse state semplicemente cercando di volare un po’ troppo in alto, e la domanda che dovreste farvi molto più banalmente è: come vi appare il gioco? Il multiplayer ha una grafica deludente rispetto al singolo, o in generale? Perché questo, secondo me, è il vero fulcro della questione: non ha senso parlare di dati tecnici a fronte del risultato a video reale, tantopiù se di aromgentazioni tecniche se ne capisce poco.

 

Eurogamer stesso oggi riporta, come è giusto, la risposta di Guerrilla Games. Primo e di gran lunga più votato commento degli utenti:

Se ci avete giocato per tre mesi e non avete notato nulla per tutto il tempo, ma vi arrabbiate ora che qualcuno ha fatto un’analisi ad un livello assurdo per svelare una tecnica intelligente per migliorare l’efficienza, allora avete dei problemi.

Amen.

Lorenzo Forini
Sono nato a Bologna nel 1993, videogioco da sempre, e da sempre mi ha affascinato l'idea di andare oltre al solo giocare, di cercare di capire cosa c'è nascosto in ogni titolo dietro al sipario più immediato da cogliere. Se i videogiochi sono una forma d'arte, forse è il caso di iniziare a studiarli davvero come tali.

Lascia un commento