2012-03-12 13 views
7

A quanto ho capito, la mappatura delle ombre viene eseguita rendendo la scena dalla prospettiva della luce per creare una mappa di profondità. Quindi si ri-renderizza la scena dal POV della telecamera, e per ogni punto (frammento in GLSL) nella scena si calcola la distanza da lì alla sorgente luminosa; se corrisponde a quello che hai nella tua mappa ombra, allora è nella luce, altrimenti è nell'ombra.Come utilizzare una singola mappa shadow per più fonti di luce puntiforme?

Stavo leggendo il numero this tutorial per avere un'idea di come eseguire il mapping ombra con una luce punto/omnidirezionale.

Nella sezione 12.2.2 si dice:

Usiamo una mappa sola ombra per tutte le sorgenti luminose

E poi sotto 12.3.6 si dice:

1) Calcola la distanza quadrata dal pixel corrente alla fonte di luce.
...
4) Confrontare il valore della distanza calcolata con il valore della mappa shadow recuperato per determinare se siamo o meno in ombra.

Che è approssimativamente quello che ho dichiarato sopra.

Quello che non capisco è se abbiamo bruciato tutte le nostre luci in una mappa ombra, quindi a quale luce dobbiamo confrontare la distanza? La distanza indicata nella mappa non dovrebbe corrispondere a nulla, perché è una miscela di tutte le luci, non è vero?

Sono sicuro che mi manca qualcosa, ma spero che qualcuno possa spiegarmelo.


Inoltre, se si utilizza una singola mappa di ombreggiatura, come si fonde con tutte le sorgenti di luce?

Per una singola sorgente di luce la mappa delle ombre memorizza solo la distanza dell'oggetto più vicino alla luce (cioè una mappa di profondità), ma per più fonti di luce, cosa conterrebbe?

risposta

5

Hai tagliato la frase breve prematuramente:

Usiamo una mappa sola ombra per tutte le sorgenti luminose, creando un'immagine con il rendering multipass e l'esecuzione di un passaggio per ogni luce fonte.

Quindi la mappa delle ombre contiene i dati per una singola fonte di luce alla volta, ma essi utilizzano solo una mappa perché rendono solo una luce alla volta.

Penso che questo sfoci nella tua seconda domanda: la luce è additiva in modo da unire i risultati di più luci semplicemente aggiungendoli insieme. Nel caso delle GPU Gems, essi si sommano direttamente nel frame buffer, senza dubbio a causa del numero relativamente limitato di campionatori di texture di storage disponibili sulle GPU al momento. Al giorno d'oggi probabilmente vorrai fare una combinazione di combinazione nel frame buffer e direttamente nello shader dei frammenti.

Generalmente si applica anche il test di "pixel acceso se è inferiore o uguale alla distanza nel buffer shadow più un po '" piuttosto che esattamente uguale, a causa di un accumulo di errori di arrotondamento in virgola mobile.

+0

Pensavo che il resto di quella frase significasse semplicemente che hanno costruito la mappa delle ombre eseguendo il rendering sulla stessa mappa (forse in modo additivo) per ogni sorgente di luce; non che lo ripuliscano e lo riutilizzino. Questo ha più senso ora ... è un peccato però - Speravo davvero di riuscire a farla franca con una mappa delle ombre: p – mpen

+0

È possibile se si capovolge qualcosa e si usa quello che viene spesso chiamato rendering differito. Si esegue il rendering della scena dalla videocamera alla profondità di output + normali + alcune informazioni sulla superficie per pixel, quindi per ogni luce si disegna un quad a tutto schermo che itera in modo efficace attraverso il rendering della videocamera. Anche se la tua GPU può emettere solo RGB a 8 bit (ancora comune nel mondo mobile) puoi eseguire il primo bit su più trame in più passaggi. – Tommy

+0

Grande. Hai appena aperto una nuova lattina di vermi per me. Sto facendo un gioco, e la maggior parte degli oggetti sono statici (o raramente cambiano), quindi stavo pensando di precomputare le mappe ombra per tutti gli oggetti statici, mantenere una copia e aggiornarla solo per gli oggetti in movimento. Voglio supportare più luci possibili, quindi non credo che ricreare la scena 100 volte da diverse angolazioni 60 volte al secondo sia una possibilità per me. Ma una mappa delle ombre utilizza una trama attiva, non è vero? Devo legarli tutti contemporaneamente per il passaggio finale di rendering, no? – mpen