Se avete giocato a Thief su PlayStation 4 e avete un po’ l’occhio per la grafica, potreste esservi accorti di un curioso difetto visivo legato alle texture.
Fermatevi a guardare una parete frontalmente e la vedrete ben nitida; ma guardatela di sbieco, e vi accorgerete che il muro diventa molto meno definito, fino a mostrare un pastone di colori ad alcuni metri da voi. Lo stesso discorso vare per i pavimenti e tutte le superfici lisce: man mano che l’angono da cui li vedete si sposta verso la perpendicolarità, con la distanza perdono di definizione in maniera a dir poco insolita.
La stessa esatta cosa sembra essere presente nella versione per PS4 di Dying Light, uscito digitalmente qualche giorno fa e analizzata preliminarmente ieri da Digital Foundry.
Il motivo tecnico di questa sbavatura grafica è conosciuto: risiede nel tipo di filtro delle texture utilizzato dai due titoli per la versione PS4. Ma, più di qualsiasi altro problema o anomalia grafica riscontrata di recente nelle uscite su console, questa è piuttosto misteriosa, dato che la tecnologia mancante è non solo presente in tutte le altre versioni e in tutti gli altri titoli per PS4 e Xbox One, ma piuttosto vecchia e data praticamente per scontata.
Quello che leggerete in questa pagina è una mia personale speculazione, quindi prendetela come tale, ma ci tenevo a provare ad andare a fondo con questi due casi veramente insoliti, anche per capire se possono essere indicatori di qualcosa di più ampio.
Cos’è il filtro delle texture
Per prima cosa, mi sembra il caso di spiegare cos’è, un filtro delle texture.
Per venire renderizzati, cioè “colorati”, ed essere quindi visibili mentre si gioca, tutti i modelli 3D (chiamati mesh) devono avere una o più texture di riferimento. Le texture sono immagini piane in 2D, come qualsiasi disegno o fotografia digitale, che vengono “avvolte” sulla mesh, e le danno quindi il colore.
Il filtro delle texture è l’algoritmo che determina come una texture viene applicata ad una mesh. Ci sono diversi tipi di filtri, che più sono precisi più sono anche impegnativi per la macchina che deve renderizzare il gioco.
Quasi tutti i giochi, oggi, si appoggiano ad un filtro anisotropico, il tipo più definito e adatto a rappresentare texture a tutte le angolazioni. Thief e Dying Light, su PS4, usano invece un filtro trilineare, più vecchio e che produce appunto i problemi di cui parlavo all’inizio.
Differenze tra un filtro trilineare e un filtro anisotropico
Per cominciare, i filtri tanto trilineari quanto anisotropici si appoggiano ad una tecnologia chiamata MIPmap. Le MIPmap sono sequenze di una stessa texture ripetuta più volte a risoluzioni (dimensioni) diverse.
Quando un renderer (la parte del programma che appunto renderizza la grafica, cioè la calcola e la disegna a video) usa un filtro trilineare per applicare le texture, succede questo: in base alla distanza della telecamera di gioco dall’oggetto in questione, sceglie i due disegni dalla MIPmap della dimensione più vicina a quella in pixel occupata a video dall’oggetto stesso, li interpola (cioè fa una “media” dei due) e il risultato viene applicato alla mesh. In pratica, si incolla sulla superficie della mesh la versione più nitida della texture che vale la pena di usare in quel particolare momento, formata dalla fusione di due delle versioni a risoluzioni diverse disponibili.
Questo sistema funziona perfettamente finché la superficie a cui va applicata la texture è bene o male isotropica (“uguale in tutte le direzioni”), ovvero la sua definizione a video è equamente distribuita in verticale e in orizzontale. Guardando una parete da posizione perfettamente frontale, quello che vedrete sarà quasi uguale a fissare direttamente la texture originale, che era appunto un disegno piano, quindi non ci sono problemi.
La cosa si fa più complicata quando l’oggetto viene invece guardato di sbieco, come nel caso di un muro visto di taglio o di un pavimento visto per forza di cose un po’ dall’alto al basso. Il motivo degli artefatti e della perdita di definizione a distanze ancora sorprendentemente corte va ricercato, appunto, nell’anisotropia, ovvero una diversa definizione orizzontale e verticale. Quando una superficie è vista in diagonale rispetto alla profondità, la stessa definizione deve essere compressa in un numero di pixel a video diversa sui due assi cartesiani. Se guardando il nostro muro frontalmente quello che avevamo era bene o male un rettangolo perfetto, affiancandoci ad esso e guardandolo di taglio si crea sul monitor una specie di trapezio, dove nello stesso numero di pixel orizzontali deve essere contenuto un livello di dettaglio molto maggiore che in quelli verticali. Con un filtro trilineare, questa situazione produce un’evidente perdita di definizione nell’immagine.
La soluzione è quindi un filtro anisotropico, che lavora per l’appunto con texture a risoluzioni orizzontali e verticali diverse. Anche i filtri anisotropici usano delle MIPmap, ma versioni con molte più varianti dello stesso disegno, che servono appunto a coprire casi di raffigurazione anisotropica.
Perché non si è usato un filtro anisotropico su PS4?
Un filtro anisotropico è sempre una scelta migliore di un filtro trilineare, e ogni volta che si può lo si implementa. I filtri anisotropici sono diventati lo standard nei videogiochi da parecchi anni, quindi sembra ancora più assurdo che non li si sia riusciti ad implementare in una console di fine 2013, anche se solo in un paio di casi.
Il peso di un filtro anisotropico su GPU di questo livello è risibile, quindi il problema va cercato altrove.
Le MIPmap anisotropiche sono file consistentemente più grandi delle più semplici MIPmap isotropiche, e questo significa due cose: caricarli e scaricarli impegna la RAM per più tempo, ed in ogni caso lo spazio da riservargli sulla RAM è maggiore.
Se facciamo un rapido confronto con le versioni di Thief e Dying Light per Xbox One – console strutturalmente molto simile a PS4 – ci accorgiamo che un filtro anisotropico lì è utilizzato, ma a fronte di un render a dimensioni minori (1600×900 Thief e circa 1536×1080 Dying Light, contro 1920×1080 per entrambi su PS4). Le altre componenti visive sono bene o male le stesse, se non che in entrambi i casi il gioco gira in maniera più pulita sulla console Sony (quindi, difficilmente possiamo pensare ad un collo di bottiglia in CPU e GPU nel caso di PS4).
Dato che PS4 ha una RAM consistentemente più veloce di quella di Xbox One (GDDR5 contro DDR3), è molto improbabile che il problema ricada nella velocità di caricamento e scaricamneto delle MIPmap. Al contrario, visto che la RAM utile per l’esecuzione dei giochi è minore su PS4 (4,5 GB contro 5 su Xbox One) e che il render avviene ad una risoluzione più alta (immagini rispetivamente 1,44 e 1,25 volte più grandi), non mi sembra impossibile che molto banalmente nella RAM di PS4 non fosse più garantito lo spazio per MIPmap anisotropiche grandi più del doppio di versioni isotropiche, a fronte di texture già molto definite di loro.
Non ho ovviamente modo di confermare la mia conclusione, ma dato che i casi in cui questo fenomeno si è verificato sono decisamente minoritari e che in entrambi il più probabile collo di bottiglia sembra essere la quantità intrinseca di RAM, per quanto mi riguarda ho pochi dubbi.
Il tutto, in definitiva, sembrerebbe ridursi a quanto gli asset di Thief e Dying Light su PS4 sono stati compressi, cioè poco. Dato che molti effetti grafici non pesano tanto sulla RAM, probabilmente introdurre delle MIPmap anisotropiche avrebbe significato togliere parecchia altra roba e (o?) ridurre sensibilmente la risoluzione di rendering.
Visto che i titoli interessati da questo problema sono appunto due su svariate decine, e neanche due che risaltano particolarmente per qualche altra caratteristica tecnica incredibile unica, non direi che ci sia da preoccuparsi più di tanto per il futuro.
Potrebbe capitare ancora occasionalmente, ma prima che diventi una moda penso proprio che si ridurrà la risoluzione, o l’antialiasing, o semplicemente tutti gli studi terzi capiranno come sfruttare meglio lo spazio a disposizione sulla RAM.