Perché alcuni giochi mostrano che le luci brillano attraverso i muri?


28

In alcuni giochi, vedo le luci brillare attraverso i muri, anche se ho impostato la qualità video su livelli elevati.

Un paio di esempi di giochi che ho giocato di recente sono Borderlands 2 (missile Explosions) e Call of Cthulhu (lanterne; il gioco utilizza persino Unreal Engine 4).

È un bug o ci sono motivi di prestazioni?

Esempio Borderlands 2: https://youtu.be/9bV83qA6_mU?t=419 (poche volte, ma rapidamente)

Domanda bonus: in quest'ultimo caso, esiste un modo per tracciare i raggi in modo economico per risolvere il problema? Immagino che il costoso RT abbia definitivamente risolto il problema, ma mi chiedo se possa essere utilizzato anche in una forma "economica" per risolvere questo specifico problema.


21
Un'immagine vale più di 1000 parole.
Evorlor

8
Dovrei andare a giocare per testare, ma in realtà è la luce che cola o potrebbe essere un effetto particellare incandescente? In particolare il tuo esempio di esplosione di un missile, potrei immaginare un effetto addizionale "fuoco" sulle particelle che è molto probabile che ignori le collisioni. Le lanterne potrebbero anche fare lo stesso per creare un alone visibile, suppongo ...
AC

@Evorlor ha aggiunto un esempio.
Marcus,

Risposte:


43

Espandendo la risposta corretta di TomTsagk, ho pensato che potesse aiutare a descrivere un po 'di più il motivo per cui i giochi funzionano così.

La luce nei giochi non "viaggia" realmente dalla sorgente, alla superficie, alla telecamera, restando ostruita lungo il percorso.

Per capire quanto sia luminoso disegnare ogni pixel di una superficie in base a una data luce, usiamo (o approssimativo) una formula matematica che utilizza la direzione del rivestimento della superficie e la direzione da questo punto sulla superficie alla sorgente luminosa. Questo è tutto, proprio dalla direzione da cui brilla: in genere non lanciamo un raggio per verificare se la luce raggiunge effettivamente questo pixel, perché farlo per ogni pixel sullo schermo e controllare il raggio contro tutta la geometria dettagliata nella scena è di solito è ancora troppo costoso per i giochi in tempo reale.

Quindi, per impostazione predefinita, nessuna luce di gioco genera ombre. La direzione verso una luce rimane invariata anche se c'è un shadowcaster sulla strada, quindi la matematica ci dà lo stesso valore di luminosità.

Se vogliamo simulare le ombre, dobbiamo farlo separatamente. Un modo comune è quello che viene chiamato Shadow Map. In questa versione, prima di oscurare la scena, rendiamo la scena dal punto di vista di ogni luce, come se quella luce fosse una videocamera, memorizzando la profondità di ogni pixel che vede in una trama fuori schermo.

Quindi, quando ombreggiamo la scena, possiamo confrontare la distanza matematica di questo pixel dalla sorgente luminosa rispetto alla profondità registrata nel pixel corrispondente nella mappa dell'ombra. Se la profondità della mappa delle ombre è più piccola, significa che c'è un'altra superficie tra qui e la luce e disegniamo invece questo pixel nell'ombra.

Ci sono molte tecniche interessanti per rendere queste ombre basate su mappe più belle, con meno artefatti / aliasing, ma per ora le cercherò. Basti dire che in genere non sono nemmeno liberi.

Perché questo richiede il rendering (fino a) di nuovo dell'intera scena dalla prospettiva di ogni luce - fino a sei volte se è una luce di punto che brilla in tutte le direzioni {nord, sud, est, ovest, su, giù}, e dobbiamo ri -rendering della mappa ombra ogni volta che qualcosa si muove, questo può diventare molto costoso.

Quindi i giochi concentreranno spesso il loro budget di rendering sulle luci più importanti della scena - come la luce solare direzionale - per garantire che abbiano delle belle ombre. Le luci piccole, di breve durata, come il lampo di un'esplosione sono spesso perdonabili se passano un po 'oltre gli occludenti. Spesso questo è più appetibile per i giocatori di un intoppo nel framerate a causa di un improvviso aumento del costo di rendering da tutto il rendering e il calcolo della mappa ombra extra. Soprattutto se si tratta di una scena d'azione frenetica in cui la fluidità conta più della perfezione dei pixel.


3
Un'altra ruga è che mentre è banale capire se una fonte di luce si trova davanti o dietro una superficie, impedire alle superfici di brillare quando illuminate da dietro spesso porta a risultati strani.
supercat

E questo è particolarmente vero con gli effetti delle particelle (che probabilmente è l'esplosione, almeno in parte), poiché le particelle devono essere particolarmente economiche da gestire per essere molto utili.
Luaan, il

2
Luci e particelle sono due cose diverse. Una particella può anche "fuoriuscire" attraverso un ostacolo, ma per ragioni completamente diverse. A volte un sistema di particelle includerà anche una luce per aiutare a vendere l'effetto (pensa a un falò o sciame di lucciole), ma una luce all'interno di un effetto particellare è ancora solo una luce, di solito non una variante speciale.
DMGregory

2
Un approccio alternativo per ombra mappe è volumi di ombre , che risolve il problema aliasing, ma è più costoso: richiede geometria supplementare da rendere (un nuovo poligono a sagoma bordo di ogni oggetto per ciascuna sorgente di luce), nonché il rendering supplementare passa. Mi aspetto che l'approccio di mappatura sia abbastanza buono per la maggior parte delle situazioni, però.
DarthFennec,

22

Per farla breve, questo accade per motivi di performance.

Quando c'è una luce sullo schermo, per impostazione predefinita brilla su tutti gli oggetti (ostruiti o meno), quindi il gioco avrebbe bisogno di fare calcoli extra per vedere quale oggetto è influenzato da cosa.

Questo è più facile da risolvere su oggetti statici utilizzando l'illuminazione statica e al forno, ma non è lo stesso per le luci dinamiche, come le esplosioni come hai notato.

Per la tua domanda bonus, ray tracing ed economico non vanno insieme sulla stessa frase. L'unica ragione per cui il ray tracing non è stato integrato fino ad ora è la performance. Supponendo che tutte le luci utilizzino il ray tracing, questo problema sarebbe "risolto", ma a scapito delle prestazioni.


6
Quindi il ray tracing è più importante per i film in CGI che per i giochi in tempo reale?
Accumulo

21
@Acccumulation È corretto. Il rendering di un singolo fotogramma di un film può richiedere ore, mentre un gioco ha solo millisecondi.
NobodyNada - Ripristina Monica il

16
Detto questo, i giochi esplorano sempre di più usando il raytracing o il raymarching in tandem con le tecniche di rasterizzazione, lasciando che il rasterizzatore faccia ciò che è bravo e i raggi facciano ciò che sono bravi. Non è il raytracing completo di ogni pixel, ma puoi comunque ottenere degli ottimi effetti in questo modo.
DMGregory

2
@DMGregory In effetti, giochi come Duke Nukem 3D utilizzavano già una variante molto semplificata di raytracing - sebbene non fosse utilizzata per l'illuminazione dinamica e sicuramente non tracciava ogni singolo pixel sullo schermo (di solito, era fatto per ogni colonna di pixel) e le riflessioni e la trasparenza erano ancora un caso speciale piuttosto che il valore predefinito. Il rendering 3D del software ha sempre giocato con approcci simili, è stato l'hardware 3D a chiudere quella strada (fino ad ora).
Luaan,

@Acccumulation Raytracing arriva a livelli diversi, quindi mentre i giochi in cima alla linea possono sparare raggi primari, non fanno ancora abbastanza rimbalzi secondari o più rimbalzi per pixel. Quindi, anche se dovessi raytrace, avrai comunque dei compromessi prestazionali molto simili a questo. Quindi l'abilità traccia le luci principali non significa ancora che puoi permetterti di renderizzare tutte le luci secondarie.
joojaa,
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.