No sé en qué estás programando, pero así es como lo manejé en XNA:
- En la llamada de sorteo,
List<Light>
se crea / borra un objeto.
- Durante el ciclo de extracción de fichas, cada ficha se verifica para ver si tiene luces asociadas. Si lo hace, los
Light
objetos se agregan a la List<Light>
.
- Los azulejos se dibujan por su cuenta
RenderTarget2D
.
- Después del bucle de mosaico, la lista de
Light
s se repite y se dibuja por sí misma RenderTarget2D
usando una textura que hice que se ve así:
(Nota: Usé los valores R, G y B aquí, pero probablemente debería usar el canal alfa en su textura real.)
- Utilizando un sombreador personalizado, renderizo la superficie de mosaico en la pantalla y paso la superficie de iluminación como un parámetro que se muestrea para el valor de "oscuridad" en cada píxel.
Ahora, hay algunas cosas a tener en cuenta:
Con respecto al punto 4:
De hecho, tengo dos sombreadores personalizados, uno para dibujar las luces hacia el objetivo de representación de iluminación (paso 4) y otro para dibujar el objetivo de representación de mosaico en la pantalla utilizando el objetivo de representación de iluminación (paso 5).
El sombreador utilizado en el punto 4 me permite agregar (lo que llamo) un valor de "luminosidad". Este valor se float
multiplica por cada píxel en la textura antes de agregarlo al objetivo de renderizado, de modo que esencialmente puedo hacer que las luces sean más brillantes o más oscuras.
En este punto, también tengo en cuenta el valor de "escala" de la luz, lo que significa que puedo tener luces grandes o pequeñas usando solo una textura.
Con respecto al punto 5:
Piense en el objetivo de renderizado de iluminación como esencialmente un valor para cada píxel de 0 (negro) a 1 (blanco). El sombreador esencialmente multiplica ese valor contra los valores RGB para un píxel en el objetivo de representación de mosaico para hacer la imagen dibujada final.
También tengo más código aquí donde paso (al sombreador) un valor para usar como color de superposición de día / noche. Esto también se multiplica en los valores RGB y se incluye en los cálculos del objetivo de renderizado de iluminación.
Ahora, esto no le permitirá hacer cosas como impedir que la luz pase alrededor de objetos y otras cosas, pero, al menos para mis propósitos, es simple y funciona bien.
He escrito publicaciones de blog más detalladas aquí y aquí que pueden ayudarte. No tengo tiempo en este momento, pero si quieres puedo entrar en más detalles aquí en gamedev.
Ah, y he aquí un vistazo en mi editor de mapas: