Perché i giochi moderni usano un approccio render-to-texture per i mirror?


40

Quando si guardano vecchi giochi come Mario64 o DukeNukem3D, tutti gli specchi del gioco sono essenzialmente solo buchi nel muro con una copia speculare della geometria davanti allo specchio posta dietro di loro. Nel caso di DukeNukem3D si può anche attivare la funzione No-Clip ed entrare in quella stanza specchiata.

Al contrario, i giochi moderni usano un approccio render-to-texture per i mirror. Questo porta gli pixel ad essere notevolmente pixelati quando si avvicinano a loro. Uno dei primi giochi che ho notato questo approccio è stato Luigi's Mansion, ma sembra essere utilizzato in quasi tutti i giochi moderni.

Quali cambiamenti nell'hardware o nei motori hanno reso il secondo approccio così dominante in questi giorni e quali sono i vantaggi? In termini di effetti visivi puri, il primo approccio sembra superiore, in quanto non presenta problemi di pixel.


14
E se volessi uno specchio su una porta tra due stanze?
Superbo

Risposte:


37
  1. L'uso di RTT (render-to-texture) consente di ridimensionare facilmente la qualità di rendering (risoluzione, LOD, complessità dell'illuminazione) per prestazioni regolabili. RTT semplifica inoltre la sostituzione della superficie con una mappa cubica a una certa distanza in cui è difficile vedere esattamente il riflesso.
  2. Poiché l'output è una trama, ci sono più opzioni riguardo a cosa si può fare in seguito (illuminazione, ombreggiatura, sfumatura, distorsione ecc.).
  3. Se una versione speculare della geometria viene posizionata nella scena, richiederebbe l'abbattimento più complicato quando si interseca con la geometria reale e potrebbe essere visto dietro l'angolo. Nei giochi più vecchi, i livelli sono stati progettati per evitarlo. Per non parlare del fatto che qualcuno deve fare il vero mirroring.
  4. Se la geometria non viene specchiata manualmente, il rendering deve essere eseguito modificando la matrice di visualizzazione e la modalità di abbattimento (per compensare l'inversione dello spazio nella matrice) e utilizzando il buffer di stencil per ritagliare lo specchio. I motori moderni preferiscono creare in anticipo tutti gli stati di rendering, quindi ci sarebbe un piccolo problema nel fare copie di ogni stato di rendering della scena con le modifiche necessarie per il rendering speculare.

Quindi, fondamentalmente, usare RTT offre più libertà a tutti.


Su 3 .: La maggior parte dei (più vecchi) motori di gioco FPS utilizzava algoritmi di bisection (come il famoso "portale engine" utilizzato da DOOM) che già eseguono il clipping su (molto probabilmente quad) poligoni per l'abbattimento della visibilità. Tali motori possono facilmente calpestare uno "specchio" quad come un portale visivo in una stanza dietro lo specchio senza preoccuparsi della geometria specchiata all'esterno dello specchio.
dronus,

@dronus Cosa? Quindi perché preoccuparsi di fare uno "specchio" in primo luogo? Basta aprire un buco nel muro.
S. Tarık Çetin,

Poiché la vera geometria potrebbe non lasciare spazio dietro la parete dello specchio, come un vero specchio non ha bisogno di avere una stanza dietro per funzionare.
dronus,

29

No, ti sbagli: non è così che gli specchi Duke Nukem 3D hanno funzionato.

DN3D utilizzava un motore portale . Una giuntura tra due settori qualsiasi era arbitraria in una certa misura e quando il motore di rendering arrivava a un portale, sapeva che doveva iniziare a renderlo un altro settore. Il settore dietro lo specchio era fondamentalmente un segnaposto per affrontare una stranezza nel motore - l'unico punto del settore era quello di essere più grande di qualsiasi cosa avessi bisogno di "riflesso". Non conteneva alcuna geometria reale. In effetti, ha funzionato praticamente nello stesso modo in cui i "portali" funzionano in Portal - tranne che Portal (essendo esso stesso basato su un motore di portale) crea i portali in fase di esecuzione e ha un limite al numero di volte in cui i portali possono richiamare (ad es. A -> B -> A -> B -> A ...), mentre Build (DN3D) andrebbe semplicemente in crash quando il suo stack traboccava se puntassi uno specchio su un altro mirror.

È ovvio quanto sia semplice implementare uno specchio con quello - creare un portale che punti di nuovo nella stanza. Ciò significa che il rendering dello specchio costerebbe esattamente quanto il rendering della stanza stessa, offrendo grandi prestazioni e coerenza. Finché non hai puntato uno specchio su un altro specchio, cioè. Se guardi attraverso il codice sorgente del motore Build, vedrai che non esiste alcun codice per la gestione dei mirror: non deve essercene uno, perché è così che funzionano i portali NOTA: in realtà, c'è un codice per capovolgere i pixel renderizzati - esso semplicemente non capovolge la geometria e tutti i vari sprite ed effetti. L'editore doveva essere in grado di realizzare questi portali "falsi", guardando indietro su se stesso. Se vuoi sapere di più sul motore di costruzione piuttosto intelligente, c'è una grande analisi di Fabien Sanglard su interni del motore Build. L'intero motore è stato aperto e portato anche su piattaforme moderne, anche se il vecchio funziona ancora perfettamente su Windows 10 (testato per te: P). Molti dei giochi basati su Build sono stati anche open source e / o rifatti.

Perché questo non viene più utilizzato? Bene, alcuni motori non preferiscono più i portali, per esempio. È difficile applicare molti hack e ottimizzazioni grafiche: non posso indicarti nulla di specifico, ma molta post-elaborazione dipende da hack che non funzionerebbero in un vero motore di portale (fanno molte ipotesi che non tenere più). Questo è fondamentalmente lo stesso tipo di problema che questi giochi hanno con immagini stereoscopiche: gli hack non funzionano più.

Ancora più importante, gli specchi sono diventati più complicati. Possono avere forme, trame complesse, possono essere a terra (anche conosciute come "acqua") ecc. Mentre tutti questi problemi sono risolvibili in un motore a portale, RTT diventa la scelta più semplice ad un certo punto e le GPU sono abbastanza veloci per gestirlo.

Tuttavia, nonostante tutto, ci sono molti giochi con accelerazione 3D hardware che fanno le cose "reali". Dei giochi più vecchi, Quake 3 o Alien vs. Predator, per esempio. Per quanto ne so, i giochi del motore di origine usano ancora mirror "reali". Se ti aspetti che le persone si avvicinino allo specchio e puoi garantire che non ci sono troppe superfici riflettenti allo stesso tempo (ad esempio attraverso la progettazione a livello), gli specchi a portale sono ancora molto attraenti.


Apparentemente il motivo della convinzione comune secondo cui Duke Nukem 3D ha funzionato in questo modo è il fatto che nei progetti di livello reale, lo spazio dietro lo specchio è grande quanto la stanza che riflette, anche se il motore di rendering non lo richiede.
Casuale 832,

Inoltre, i portali non-specchio non, bene, specchio cose, quindi non so come "non c'è manipolazione specchi codice" è possibile.
Casuale 832,

5
@ Random832 Era un po 'richiesto - c'erano alcuni artefatti visivi se un settore appariva nel luogo in cui si supponeva che fosse la stanza specchiata. Questa è una di quelle parti in cui i presupposti per lo più innocui sono stati importanti per le prestazioni. Se hai mai giocato con Build, potresti aver notato che quando due settori si incrociano alla stessa altezza, non verranno visualizzati correttamente. Per quanto riguarda il mirroring, funziona allo stesso modo in cui funzionano i mirror della vita reale. Vi siete mai chiesti perché gli specchi "ruotano" solo sull'asse y? È lo stesso motivo per cui non è necessario capovolgere un portale che ti ricollega alla stessa stanza.
Luaan,

Il punto è che un normale portale che conduce in una stanza che si affaccia nella direzione opposta dovrebbe ruotare le cose di 180 gradi anziché riflettendole. Quindi avere la possibilità di non farlo conta come una gestione speciale per i mirror. (Non avere la possibilità di farlo significherebbe che i portali non funzionano come portali e sono adatti solo per i mirror, nel qual caso l'intero sistema è una gestione speciale per i mirror). E sì, so perché gli specchi "solo" ribaltano "sull'asse y". In effetti, si capovolgono sull'asse z. Ma il fatto che capovolgano un numero dispari di assi li distingue dai portali.
Casuale 832,

@ Random832 Dipende da quello che chiami l'asse y, ovviamente :) E sì, hai ragione, c'è una gestione speciale. Ma è molto interessante: capovolge i dati renderizzati, non la geometria (e gli sprite e tutto ... un bel po 'di lavoro, in realtà). Il frame del portale viene capovolto, il portale viene renderizzato come al solito e quindi il tutto viene reso all'indietro, riga per riga.
Luaan,

3

RTT sarebbe stato usato se fosse possibile, ma la pipeline di rendering dell'hardware era a senso unico.

Anche l'hardware precedente presentava limitazioni che impedivano il rendering alla trama. Scrivere su RAM significa che non può essere letto contemporaneamente. Per migliorare le prestazioni di rendering, il buffer di destinazione era bloccato solo per la scrittura, solo l'hardware di visualizzazione poteva leggere da esso. Potresti richiedere la lettura, ma questo ha bloccato la RAM e il rendering ha dovuto attendere la cancellazione del blocco prima di poter avviare il fotogramma successivo. RTT causerebbe un grosso collo di bottiglia alla pipeline e quindi sarebbero state utilizzate altre soluzioni.

Scoprirai che prima delle pipeline di rendering hardware erano utilizzate le normali RTT in quanto fornivano un modo per ridurre il carico di rendering. Rendering 3D agli sprite per fornire contenuti pseudo 3D. Il rendering delle trame era troppo costoso (CPU) per essere usato allora, a parte le macchine specializzate che erano al di fuori del mercato di consumo generale.


1

Duke Nukem gestisce che ridigitando la geometria dietro lo specchio, le altre risposte sono parzialmente corrette. Ci sono aree dietro i mirror che in realtà non contengono geometria (nei file di dati di gioco), la geometria viene nuovamente renderizzata in fase di esecuzione, il motivo per cui tali aree esistono è di evitare di posizionare accidentalmente un livello durante la modifica del livello :

poiché esiste un'area contrassegnata, non inserirai accidentalmente alcuna geometria al suo interno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.