Graphite è il nome che Housemarque ha scelto per riunire trent’anni di lavoro sul proprio motore di gioco, e dietro questa decisione c’è una storia che parte da lontano. Cinque anni fa lo studio aveva raccontato come prendevano vita gli effetti in Returnal, compreso il voxeliser in tempo reale capace di dissolvere Phrike in nebbia volumetrica. Con Saros quella storia trova il suo seguito naturale, ma con un cambio di passo deciso. Invece di limitarsi ad ampliare ciò che già esisteva, il team ha fatto un passo indietro, ha osservato l’intero accumulo di sviluppo e ha ricostruito tutto dentro una struttura unica chiamata appunto Graphite.
Il punto di partenza era NGP, il motore di particelle proprietario nato come prototipo di Resogun nel 2013. Negli anni è cresciuto con ogni gioco fino ad arrivare a Returnal, ma quando è arrivato il momento di lavorare su Saros era ormai un sistema maturo eppure frammentato, frutto di dodici anni di scelte prese una alla volta, ognuna legata a un titolo specifico. Nel frattempo è cambiato qualcosa anche dentro lo studio. Entrare nei PlayStation Studios ha alzato l’asticella delle aspettative, e gli strumenti di prima non rispecchiavano più l’identità che Housemarque stava costruendo. Così è nato Graphite, che mette insieme simulazione GPU, rendering, tooling e integrazione DCC in un solo sistema pensato per l’hardware PlayStation. NGP non è sparito, è diventato parte di Graphite, più capace di prima.
La nebbia volumetrica che reagisce a tutto
Nei videogiochi la nebbia viene spesso trattata come un riempitivo, qualcosa che maschera le distanze e nasconde lo spazio vuoto. In Saros l’idea era opposta. La nebbia doveva essere una parte viva del mondo, reattiva a ogni cosa che accade al suo interno. In Returnal era già reattiva, ma frequenza bassa e filtri temporali pesanti le impedivano di mostrare i dettagli più piccoli. Per questo motivo sono nate due soluzioni complementari, una nebbia a bassa frequenza per l’atmosfera generale e una ad alta frequenza per gli effetti dei personaggi nelle stanze narrative speciali di Carcosa.
Per la nebbia a bassa frequenza il team è partito dalla nebbia froxel di Unreal Engine, ricostruendone parti importanti. La sfida principale riguardava la stabilità temporale. Il coefficiente d’isteresi decide quanto dei dati del fotogramma precedente viene mantenuto, e il valore predefinito di Unreal pari al 90 per cento tiene l’immagine stabile ma rende la nebbia lenta con camere e luci rapide. Abbassandolo fino al 50 per cento, con l’aiuto di tremolio blue noise e depth clamping, l’aliasing è rimasto sotto controllo. A questo si aggiungono una doppia funzione di fase di Henyey-Greenstein, un coefficiente d’assorbimento colorato per una gamma di colori molto più ampia, un sistema di self shadowing e un integrale d’illuminazione del cielo basato sulla fisica. Il risultato è un’atmosfera solida e fisicamente credibile, completamente interattiva, dove ogni movimento, proiettile, esplosione o nemico resta leggibile in tempo reale.
La nebbia ad alta frequenza usa invece un ray marcher personalizzato, costruito per restare efficiente senza perdere fedeltà. I dati sparpagliati vengono raggruppati in blocchi voxel 8x8x8 prima del marching, saltando le regioni vuote dove possibile. Gli artisti possono regolare albedo, assorbimento, densità e ombreggiatura per bilanciare resa e prestazioni. I due sistemi vengono poi fusi insieme, in modo che i dati restino coerenti. Questa tecnica compare nel teschio fumoso con cavi del Prologo e nei cosiddetti Miraggi, presenti in quattro biomi dove Arjun affronta creature di fumo.
Dati di Houdini dentro il motore
L’altro grande filone di lavoro riguarda l’estensione di Graphite con i dati di Houdini. In passato gli effetti volumetrici nascevano scrivendo espressioni per voxel combinate con simulazioni di fluidi, un approccio standard nel cinema ma con limiti precisi in tempo reale. Emettere densità solo dal braccio di un personaggio invece che dal corpo intero, ad esempio, era molto difficile da fare in modo efficiente. La soluzione è arrivata dalle particelle, grazie al sistema completamente programmabile di Graphite. Da qui sono nati due strumenti, una pipeline offline che porta nel motore dati ad alta fedeltà pre calcolati in Houdini, e un rasterizzatore a nuvola di punti che trasforma in tempo reale i punti simulati in un volume.
In pratica un artista importa un personaggio animato di Saros in Houdini, calcola posizioni e attributi, poi questi dati vengono passati al motore dove la simulazione avviene in tempo reale. Le particelle possono seguire con precisione un mesh animato, reagendo all’impatto dei proiettili e staccandosi dal nemico in modo dinamico. Un esempio perfetto è la sequenza di generazione del giocatore in Saros, costruita su più strati a partire da spline generate offline. Al momento dell’esecuzione le spline si muovono libere nello spazio per poi tornare alle loro posizioni sul mesh del personaggio. L’obiettivo era far sembrare che il giocatore si riformasse da una pozzanghera di gelatina mutevole, e i marching cubes hanno dato proprio quell’aspetto viscoso e solido.