Non so in cosa stai programmando, ma è così che l'ho gestito in XNA:
- Alla chiamata di disegno, un
List<Light>
oggetto viene creato / cancellato.
- Durante il loop di disegno delle tessere, ogni tessera viene controllata per vedere se ha delle Luci associate. In tal caso, gli
Light
oggetti vengono aggiunti a List<Light>
.
- Le tessere sono disegnate da sole
RenderTarget2D
.
- Dopo il loop di tile, l'elenco di
Light
s viene ripetuto e disegnato da solo RenderTarget2D
utilizzando una trama creata in questo modo:
(Nota: ho usato i valori R, G e B qui ma probabilmente dovresti usare il canale alfa nel tuo trama reale.)
- Usando uno shader personalizzato, eseguo il rendering della superficie della piastrella sullo schermo e passo la superficie dell'illuminazione come parametro che viene campionato per il valore di "oscurità" in ciascun pixel.
Ora, ci sono alcune cose da notare:
Per quanto riguarda il punto 4:
In realtà ho due shader personalizzati, uno per disegnare le luci sul target del rendering dell'illuminazione (passaggio 4) e un altro per disegnare il target del rendering delle piastrelle sullo schermo utilizzando il target del rendering dell'illuminazione (passaggio 5).
Lo shader utilizzato al punto 4 mi consente di aggiungere (quello che chiamo) un valore di "luminosità". Questo valore è un valore float
che viene moltiplicato per ogni pixel della trama prima che venga aggiunto al target di rendering in modo che io possa essenzialmente rendere le luci più chiare o più scure.
A questo punto, prendo in considerazione anche il valore di "scala" della luce, il che significa che posso avere luci grandi o piccole usando solo una trama.
Per quanto riguarda il punto 5:
Pensa al target del rendering dell'illuminazione essenzialmente come se avesse un valore per ogni pixel da 0 (nero) a 1 (bianco). Lo shader essenzialmente moltiplica quel valore rispetto ai valori RGB per un pixel nella destinazione di rendering delle tessere per creare l'immagine finale disegnata.
Ho anche un altro codice qui dove passo (allo shader) un valore da usare come colore di sovrapposizione giorno / notte. Questo viene anche moltiplicato nei valori RGB e incluso nei calcoli del target di rendering dell'illuminazione.
Ora, questo non ti consentirà di fare cose come bloccare la luce attorno agli oggetti e quant'altro, ma, almeno per i miei scopi, è semplice e funziona bene.
Ho scritto post di blog più dettagliati qui e qui che potrebbero aiutarti. Non ho tempo in questo momento, ma se vuoi posso approfondire qui su gamedev.
Oh, ed ecco uno sguardo nel mio editor di mappe: