Gestisci molte luci in una scena (con shader)


9

Sono curioso di sapere come gestire molte luci in una scena. Data una mappa molto grande in un gioco di ruolo, con segrete (con le luci lì dentro) ecc. Conosco l'illuminazione differita, ma questo risponde solo a come rendere molte luci. Ma la mia domanda è di più: come non rendere molte luci. È ovviamente desiderabile rendere solo le luci che influenzano la scena, ma non conosco una tecnica / un algoritmo per archiviarlo. Nessuno vuole o è nemmeno in grado di rendere 500 punti luce, solo perché lì da qualche parte nella mappa. Ma non si può semplicemente prendere una linea retta dalla luce al giocatore e verificare se c'è qualcosa nel mezzo. Anche la distanza non sembra un buon indicatore. (Luce del sole?)

tl; dr: Come posso capire quali luci influenzano la scena per renderle solo?


OpenGL o DirectX?
kravemir,

6
in realtà, 500 luci sarebbero del tutto possibili con l'illuminazione differita, a condizione che tu non voglia ombre per tutte;)

Ad esempio, per i lig di punto e cono è possibile utilizzare l'abbattimento dell'occlusione - la luce del punto è solo una sfera. La luce direzionale è vista da ogni parte
Kikaimaru,

4
@Darkwings Stai praticamente descrivendo qui ciò che Blubb ha chiesto. Come cammino? Bene, penso che la soluzione qui sia solo camminare! (Ha funzionato per me.) ;-) "devi sapere se quella fonte sta illuminando qualcosa nella tua visione frustum." <- Questo è esattamente ciò che chiede, vuole sapere come può farlo. ^^ Anche se la cosa cono / sfera di Kikaimaru è probabilmente utile.
cooky451,

1
Per l'OP non era ovvio controllare il frustum di vista poiché aveva menzionato solo la distanza. Ogni luce avrà alcuni parametri per determinarlo. Se vengono utilizzate luci direzionali, raggiungeranno ovunque, i faretti avranno una zona target (quindi potrebbe essere risolta con l'intersezione del piano vettoriale) e così via. Dovresti pensare di più alle linee di quali luci vuoi influenzare la scena, dato che se hai davvero un sacco di luci molto vicine l'una all'altra, farai meglio ad approssimare (per l'ombra proiettata). IE: 100 candele su un antico lampadario possono essere gestite come un'unica luce.
Darkwings,

Risposte:


5

Ancora più semplice dei volumi limitati;

Assegna un raggio a ciascuna luce. Quando si tratta di rendere la scena, è sufficiente verificare se la distanza tra gli oggetti della scena e ciascuna luce è inferiore al raggio della luce. In tal caso, usa la luce, altrimenti salta.

Solo una frazione più complicata, a seconda dell'importanza delle prestazioni:

Con questo puoi fare anche una sorta di controllo di fase ampia. Basta definire una griglia spaziale che memorizza le maniglie delle luci su una base di griglia, quindi eseguire solo il controllo della distanza sulle luci che si trovano nelle celle entro il raggio massimo degli oggetti della scena.


5
+1 - Suona sospettosamente come una sfera di delimitazione;)
Gyan aka Gary Buyn,

Un po 'in ritardo ... comunque, quella e' esattamente una sfera di delimitazione. Usando questo metodo, renderai comunque le luci che sono completamente oscurate da muri ecc. E quindi non rilevanti per la scena. Inoltre, non tutte le luci vanno in tutte le direzioni.
Darkwings,

5

Il modo più semplice a cui riesco a pensare (siamo sinceri, l'unico modo in cui ho pensato) è di dare ad ogni luce un volume limite . Se il volume di delimitazione si interseca con il frustum della vista (o un volume di delimitazione del frustum della vista), applicare la luce.

Potrebbero esserci ancora delle luci che vengono applicate anche se non influenzano alcun oggetto visibile ma è semplice e veloce. La disposizione intelligente del grafico della scena potrebbe significare che solo pochi controlli di intersezione abbattono la maggior parte delle luci (proprio come ciò che viene fatto per l'abbattimento degli oggetti).

Qualcosa come il sole potrebbe non avere un volume limite (per indicare che dovrebbe sempre essere applicato).

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.