
Housemarque parla del ricostruire gli effetti visivi con un struttura unificata per lo sparatutto fantascientifico PS5
Cinque anni fa, abbiamo parlato di come gli effetti in Returnal avessero preso vita, compreso il voxeliser in tempo reale che ha dissolto Phrike in nebbia volumetrica. Se non lo avete letto, quel post è un buon accompagnamento a questo.
Ecco come continua quella storia.
Con Saros, non abbiamo solo espanso ciò che abbiamo creato per Returnal. Abbiamo fatto un passo indietro, osservato trent’anni di sviluppo del motore accumulato e lo abbiamo ricostruito come struttura unificata: Graphite.
Ciò che avevamo e perché lo abbiamo cambiato
Il nostro motore di particelle proprietario, NGP (Particelle di prossima generazione), è iniziato come prototipo di Resogun nel 2013 ed è cresciuto con ogni gioco da allora, fino ad arrivare a Returnal. Arrivati a SAROS, NGP era maturo, ma era anche un prodotto di dodici anni di decisioni incrementali, ognuna presa nel contesto di uno specifico gioco isolato.
Poi qualcos’altro è cambiato: noi. Entrare a far parte dei PlayStation Studios ha significato offrire esperienze al livello che si aspettano i nostri giocatori e i nostri strumenti e i nomi che gli abbiamo dato non erano più adatti allo studio che stavamo diventando.
Ecco che appare Graphite. Riunisce simulazione GPU, rendering tooling e integrazione DCC sotto un’unico sistema, creato direttamente per l’hardware PlayStation. NPG non è scomparso, è diventato parte di Graphite, evoluto e più capace che mai.
Ogni gioco di Housemarque ha un’identità visiva che i giocatori riconoscono immediatamente. Graphite è ciò che rende questo possibile.
E ciò che fa, fotogramma per fotogramma, è spiegato meglio dalle persone incredibili che lo hanno creato:
Sharman Jagadeesan (architetto della grafica) e Konsta Toivanen (programmatore grafico senior) vi porteranno attraverso la nebbia volumetrica in Saros: come si è evoluta da Returnal e i due sistemi che abbiamo creato per dare vita all’atmosfera di Carcosa.
Risto Jankkila (architetto degli effetti visivi) spiegherà come abbiamo esteso Graphite con dati di Houdini, inclusa una completa analisi della sequenza di generazione del giocatore.
Nebbia volumetrica
La nebbia nei giochi viene spesso considerata un effetto secondario, qualcosa che riempie spazio vuoto e nasconde distanze di disegno. In Saros volevamo che fosse parte vivente del mondo, reagendo a tutto quello che accade al suo interno.
In Returnal la nostra nebbia volumetrica era già reattiva, ma frequenza troppo bassa e pesanti filtri temporali gli hanno impedito di mostrare i dettagli più piccoli. Per Saros abbiamo creati due soluzioni complementari: la nebbia a bassa frequenza per l’atmosfera dell’ambiente e la nebbia ad alta frequenza per gli effetti dei personaggi in stanze della storia speciali a Carcosa.
Nebbia a bassa frequenza
Abbiamo preso la nebbia froxel di Unreal Engine, una griglia voxel frustum-aligned, come punto di partenza e ricostruito parti significative per raggiungere la nostra visione.
La prima sfida era la stabilità temporale. Il coefficiente d’isteresi controlla quanti dei dati del fotogramma precedente vengono mantenuti dalla nebbia: il default di 90% di Unreal mantiene l’immagine stabile, ma rende la nebbia lenta su camere e luci rapide. Lo abbiamo diminuito fino al 50%, utilizzando tremolio blue noise e depth clamping per tenere l’aliasing risultante sotto controllo.
Anche Saros aveva bisogno di nebbia che potesse rappresentare tutto dalla foschia ambientale a bassa densità alla nebbia a terra ad alta densità. Per renderizzarla fedelmente abbiamo usato:
- Una doppia funzione di fase di Henyey-Greenstein, modellando come la luce si diffonde avanti e indietro attraverso la nebbia in base all’angolo di visione.
- Un coefficiente d’assorbimento colorato, determinato da quanta luce viene assorbita mentre attraversa un medium, per una gamma molto più vasta di colori rispetto alle soluzioni monocromatiche tradizionali.
- Un sistema di self shadowing che aggrega fonti di luce in una direzione di ombreggiatura dominante e applica il ray-marching in quella direzione
- Un integrale d’illuminazione del cielo basata sulla fisica, per illuminazione distante accurata senza sacrificare la performance.
Insieme questi hanno dato all’atmosfera di Carcosa una qualità fisica e solida.
Finalmente, la nebbia a bassa frequenza è completamente interattiva. L’avvezione dalla simulazione dei fluidi che segue i giocatori viene incanalata direttamente nell’isteresi di densità, rendendo ogni movimento del giocatore, proiettile, esplosione e nemico leggibile nella nebbia in tempo reale.
Nebbia ad alta frequenza
Per la nebbia ad alta frequenza abbiamo costruito un ray marcher personalizzato. Per mantenere la performance sotto controllo mentre preserviamo la fedeltà, raggruppiamo dati sparpagliati in gruppi voxel 8x8x8 prima del marching, usando solo i gruppi che contengono i dati, con una soglia definita dall’utente che mantiene il numero sotto controllo. Durante il marching, le regioni vuote tra i gruppi possono essere saltate, permettendo al marcher di fare passi più grandi dove possibile.
Per l’illuminazione, abbiamo stimato un volume di luce per volume di dispersione, contenendo l’irradiamento da tutte le fonti di luce, con pre-marched self-shadowing per ogni voxel di luce. Abbiamo esposto parametri per albedo, assorbimento, densità e ombreggiatura, permettendo agli artisti di bilanciare la grafica e la performance per ogni volume.
I due sistemi di nebbia vengono poi fusi: campioniamo i dati di dispersione della nebbia a bassa frequenza nel marching ad alta frequenza e poi riportiamo i risultati alla prima in modo che rimangano costanti.
Casi d’utilizzo
Abbiamo utilizzato la nebbia volumetrica ad alta frequenza in alcuni scenari. Un caso d’utilizzo compare nel Prologo sotto forma di teschio fumoso con cavi attaccati. Un altro caso d’utilizzo era con ciò che chiamiamo Miraggi. In quattro dei nostri biomi ci sono specifiche stanze narrative dove Arjun deve affrontare creature di fumo.
La reattività è fondamentale per tutti gli effetti visivi che creiamo e questi effetti non sono un’eccezione. Dato che i dati d’impatto non hanno bisogno di alta risoluzione, li conserviamo in un volume a bassa risoluzione separato, che per il teschio mantiene anche il suo campo di velocità a bassa frequenza.
I video qui sotto mostrano quel volume sulla sinistra e combinato con il teschio sulla destra. Gli impatti sono stimati con un Signed Distance Field che si richiude nel tempo, mentre la velocità è mostrata a colori, permettendovi di vedere sia i fori d’impatto sia la turbolenza che creano.
Ecco l’effetto finale del teschio senza cavi e altri secondari e in un ambiente diverso.
L’effetto del miraggio è simile all’effetto del teschio. La differenza è che lì ci sono le cosiddette “scene” miraggio che ruotano. Abbiamo utilizzato anche il nostro mesh voxelizer scheletrico in tempo reale per portare mesh esistenti nelle scene. Il video qui sotto mostra uno sweep tra il risultato con voxelizer e il risultato finale con dati d’avvezione dal fotogramma precedente.
Ecco l’effetto finale con due scene miraggio in un ambiente di testing. Per la reattività, abbiamo utilizzato lo stesso modo descritto per l’effetto teschio.
Ampliare Graphite con dati di Houdini
Oltre a migliorare la qualità del rendering dei nostri effetti volumetrici, volevamo introdurre nuovi modi per permettere ai nostri artisti di crearli.
In precedenza, gli effetti volumetrici erano stati creati scrivendo espressioni per-voxel dell’emissione della densità, combinata con simulazioni di fluidi che guidano l’avvezione (il movimento direzionale) del campo di densità. Poiché questo approccio con griglia e voxel è lo standard del settore per gli effetti visivi dei film, è stato anche il nostro primo passo naturale.
Dai giorni di Returnal: voxelising Phrike in una griglia per emissione di densità
Nello sviluppo di Returnal abbiamo realizzato che avevamo bisogno di controllo più stretto su esattamente dove la densità è generata. La logica per-voxel ci permette di emettere densità sulle superfici circostanti o voxelised mesh, ma qualsiasi cosa di più complesso ha un rigoroso tempo d’esecuzione di overhead. Emettere densità solo da un braccio del personaggio, piuttosto che dal loro intero corpo voxelised, era molto difficile da fare efficacemente in tempo reale.
Di nuovo da Returnal: emissione della densità di un corpo completo dal voxelised mesh
Per risolverlo, ci siamo rivolti alle particelle per guidare l’emissione della densità volumetrica. Il sistema di particelle completamente programmabile di Graphite ci ha offerto solide fondamenta per volumi rigidamente controllati, risultando in due nuovi strumenti:
Una pipeline offline di dati di Houdini: permette agli artisti complessi dati pre-calcolati e ad alta fedeltà in Houdini che sarebbero troppo costosi da generare al tempo d’esecuzione.
Un rasterizzatore a nuvola di punti al tempo d’esecuzione: una componente ad alta performance che prende punti simulati e li rasterizza direttamente in un volume in tempo reale
Insieme, questi ci hanno liberato da espressioni per-voxel senza stato e simulazioni di fluidi rigide. Le particelle ora possono seguire precisamente un mesh animato di un personaggio, dando agli artisti il controllo completo del comportamento e del ciclo di vita di un effetto.
In pratica, un artista importa un personaggio di Saros animato in Houdini e utilizza i suoi strumenti per calcolare posizioni di partenza e attributi per un effetto. Quei baked data vengono dati al motore di gioco, dove avviene la simulazione in tempo reale. Nel video qui sotto, i punti generati in Houdini imitano da vicino il personaggio all’interno del gioco e la logica di tempo d’esecuzione personalizzata li distacca dal nemico all’impatto del proiettile, così le posizioni iniziali vengono da Houdini, ma il comportamento reagisce in maniera dinamica al giocatore in tempo reale.
Creare point data in Houdini
Usare point data di Houdini nel motore
Dato che gli artisti possono esportare qualsiasi tipo di dati da Houdini a Graphite è facile andare oltre particelle statiche attaccate ai personaggi. Sotto, le particelle fluiscono sulla superficie in un mesh animato: la superficie è stata dispiegata in Houdini in uno spazio di simulazione 2D, poi esportata e rimappata sul mesh animato in tempo reale.
Flusso di particelle del corpo di Arjun sulla sinistra. Nel mezzo estraiamo una superficie ISO dalle particelle. Sulla destra abbiamo una nebbia volumetrica emessa dal flusso di particelle.
Un ottimo esempio di questa tecnologia in azione all’interno del gioco è la sequenza di generazione del giocatore in Saros. Quest’effetto complesso è costruito su strati multipli, partendo offline in Houdini, dove generiamo queste spline in Graphite, trattiamo ogni punto di controllo lungo la spline come particella individuale.
Posizioni di particelle simulate in Houdini. Queste vengono usate solo come posizioni target nel motore e la mozione di crescita verrà simulata nuovamente in maniera dinamica nel tempo d’esecuzione.
Al tempo d’esecuzione, il nostro sistema di particelle programmabile controlla come questi elementi si comportano nel tempo. All’inizio, le splines si muovono libere nello spazio, poi ritornano gradualmente alle loro posizioni target sul mesh dei personaggi.
Volevamo che il giocatore apparisse come se si stesse fisicamente riformando da una pozzanghera di gelatina mutevole. I marching cubes ci hanno dato quell’aspetto viscoso e di superficie solida e controllarlo con particelle ci ha permesso di creare una sequenza dove il giocatore viene formato da componenti separati in un personaggio.
Marching cubes costruiti da spline di particelle
Come le spline che hanno generato la superficie di gelatina, possiamo anche emettere densità volumetrica. Nella sequenza di generazione abbiamo posizionato una serie di spline di particelle vicino alla posizione del giocatore e generato nebbia volumetrica da loro per simulare vapore o fumo.
Nebbia volumetrica emessa da spline di particelle
Come tocco finale, abbiamo aggiunto particelle spark che si scontrano con il personaggio del giocatore, utilizzando un signed distance field calcolato dalle capsule di collisione del giocatore. Qui il sistema di particelle programmabile ci ha offerto ancora una volta flessibilità: il giocatore attrae particelle, ma quando si avvicinano troppo, il mesh del giocatore le respinge, aiutando a creare l’aspetto di emergere da liquido bollente e simile a lava.
Particelle che si scontrano con capsule SDFs del giocatore
Ecco tutto insieme. Ogni elemento è simulato al tempo d’esecuzione, a 60 fps sulla PS5 base, senza elementi di baked simulation. Questo ci permette di realizzare multiple animazioni di generazione, ognuna con una lieve randomizzazione, in modo che sembri un po’ diverso ogni volta che il giocatore si sveglia.
Sequenza finale del giocatore
Un viaggio di sviluppo continuo
Leggendo ciò che Risto, Sharman e Konsta hanno espresso qui, il nostro obiettivo e quello della nostra tecnologia è sempre stato lo stesso: ogni simulazione, effetto e decisione di rendering esiste per farvi provare qualcosa mentre giocate.
Fare giochi significa credere in qualcosa che ancora non può essere dimostrato e le sole persone che possono confermarlo sono i giocatori stessi. I giocatori di Saros ci hanno detto, usando le loro stesse parole, che ciò che abbiamo creato ha importanza. Questo significa tutto per noi.
I nostri giochi continueranno a informare la tecnologia che sviluppiamo per Graphite, mostrando sempre ciò che può fare PlayStation come piattaforma. Non vediamo l’ora di condividere il futuro con voi.











I commenti sono chiusi.
1 Commento
Loading More Comments