Intervista Tecnica: Halo Reach
Bungie spiega la creazione del gioco.
L'idea dietro il nostro temporal anti-aliasing è piuttosto semplice: la roba che renderizzi in un determinato frame ha un'alta probabilità di essere molto simile a quella del frame precedente, quindi perché non utilizzare tutto il lavoro svoltoxc nel creare il frame precedente per migliorare quello attuale? Il nostro approccio particolare crea uno spostamento di mezzo pixel nella matrice proiettata ad ogni frame alterno, ed effettua un blend selettivo con Quincunx tra i due ultimi frame.
Tutto ciò è studiato per eliminare il frame blending per-pixel, basato sul movimento a video calcolato. Insomma, se il pixel non si muove facciamo un blending, e se si muove non facciamo il blending. Sulle parti statiche di una scena è molto più efficace di un normale MSAA 2x perché effettuiamo un blending con correzione di gamma, che ha un aspetto molto migliore del blending impiegato nelle soluzioni hardware, ed inoltre utilizziamo anche il pattern Quincunx.
Il rovescio della medaglia è che il movimento lo disattiva, ed anche se l'aliasing si avverte meno quando ci si muove, è ancora visibile. Un altro svantaggio è che non può gestire livelli multipli di trasparenza in cui alcuni strati sono fermi ed altri si muovono. Quindi ogni trasparenza deve decidere se sovrascrivere il movimento dei pixel o meno, a seconda di quanto sono opachi. Il grosso vantaggio del temporal anti-aliasing è che non grava quasi per nulla sulle prestazioni; molto meno del comune MSAA con tiling.
L'artefatto di ghosting nella beta era causato dai poligoni della visuale in prima persona (le braccia e l'arma del giocatore) che non facevano calcolare a dovere il movimento degli elementi a video, quindi non facevano disattivare il frame blending durante il movimento. Abbiamo semplicemente sistemato quel bug ed ora funziona come si deve.
L'AO che rimpiazza le shadowmap è solo una fortunata coincidenza, ma ne abbiamo preso vantaggio, che fosse intenzionale o meno. L'algoritmo è in realtà una forma pesantemente modificata ed ottimizzata di HDAO, quindi ovviamente è un effetto che avviene solo nello spazio visivo a video: le ombre dell'ambiente hanno una grandezza costante in termini di pixel a video, non importa quanto si sia distanti. Questo significa che gli oggetti lontani sembrano avere delle grandi ombre AO, mentre quelli vicini hanno solo una lieve ombra di contatto vicino alla base. Gli artisti hanno preferito privilegiare l'aspetto piuttosto che delle ombre più realistiche, e ciò è risultato anche un sistema più efficiente. In poche parole abbiamo preso due piccioni con una fava.
In realtà è quasi lo stesso algoritmo di Halo 3, ma l'aspetto è stato migliorato grazie a diverse modifiche. Quando calcolavamo la direzione dei pixel in motion blur in Halo 3, li delimitavamo in un quadrato; ora li delimitiamo in un cerchio. Col sistema quadrato, il problema è che i movimenti veloci finiscono sempre agli angoli, risultando in blur diagonali che non seguono la vera direzione del movimento. Oltre a questo, la stima del movimento dei pixel per il temporal anti-aliasing è stata d'aiuto, dando migliori risultati anche nel motion blur. Infine, il motion blur non subisce più la correzione della gamma, il che lo rende meno accurato fisicamente ma anche più veloce e più semplice da percepire.
È un argomento piuttosto complesso, ma in breve calcola le onde in una texture fuori dallo schermo, così come la sovrapposizione di varie particelle relative a schizzi ed onde. Usa il tesselator della GPU per convertire il tutto in una mesh su schermo, e fa partire uno shader custom di rifrazione/riflessi/nebbia/schiuma per renderizzarlo. In Reach abbiamo speso un sacco di tempo per ottimizzarlo al massimo, così da poterlo utilizzare su scala molto più grande. Abbiamo velocizzato lo shader parecchie volte, eliminando cose come la rifrazione in punti troppo distanti, e fermando l'animazione quando non è inquadrata. I miglioramenti visivi sono principalmente frutto di un lavoro più rifinito nel settare gli shader.
Il fattore più importante è che il nostro nuovo sistema genera automaticamente una versione a basso LOD (livello di dettaglio) di ogni oggetto e di ogni parte poligonale del livello. Questo sistema verrà illustrato da Xi Wang alla GDC. In breve, ricostruisce automaticamente una versione vertex shaded con pochi poligoni di ciascun oggetto e parte di livello. Questi modelli LOD vengono calcolati in maniera estremamente veloce, possono essere trattati in blocco, e hanno un aspetto quasi identico agli originali nella distanza. E visto che si tratta di un processo automatico, non abbiamo dovuto impiegare il tempo dei nostri artisti. Abbiamo anche migliorato i nostri algoritmi di visibilità culling e fatto uso di query occlusive della GPU ammortizzate per ridurre la quantità di elementi da gestire ad ogni frame.
Grazie! Anche alla prossima GDC presenterò questo argomento. Abbiamo creato una soluzione di rendering trasparente a bassa risoluzione per aggirare il "collo di bottiglia" del fill-rate e dell'overdraw, così da renderizzare molti più strati trasparenti. Non utilizziamo il trucco del fill-rate MSAA della 360, quindi è più dispendioso, ma così non otteniamo bordi compressi o artefatti in up-sampling. Ho anche tagliato circa il 70% del calcolo relativo al nostro sistema di nebbia, il che ha dato possibilità agli artisti di usarlo ovunque volessero; penso che l'unica area che non ne faccia uso è la seconda metà di Long Night of Solace, in cui si vola in giro nello spazio.
Sì, i dev-kit da 1GB sono stati piuttosto utili: ci hanno consentito di far girare delle versioni debug del gioco quasi integrali, anche se i maggiori beneficiari sono stati gli artisti ed i designer, che potevano caricare i livelli in modalità editing ma con le texture ad alta risoluzione del gioco completo.
Inoltre credo che tu stia parlando del back-buffer utilizzato dall'UI della 360, che penso fosse di circa 3 megabyte. Quando lanci un gioco si mantiene il back-buffer della precedente applicazione in giro per un frame, così, volendo, si può effettuare un bel fade o una transizione. La versione originale di Halo 3 non aveva questa memoria libera, il che significava che si avevano 3 megabyte in meno di memoria disponibile per incanalare le texture ad alta risoluzione. Ma uno degli aggiornamenti di Halo 3 ha sistemato questo problema, quindi ora quella memoria è disponibile per il gioco. Tale miglioria era quindi inclusa in ODST e in Reach fin dall'inizio.