Shadow maps

Antes de nada, ¡feliz año!

Recientemente he implementado sombras dinámicas en Antares mediante shadow maps. Esta técnica consiste en tener una textura en la que se representa la escena poniendo la cámara en el lugar donde está la luz que proyecta las sombras. En esa textura no se guarda el color, sino la profundidad, o sea la distancia desde la luz hasta el punto iluminado.

Cuando, posteriormente durante el mismo frame, se dibuja la escena desde la cámara final, se usa la textura de profundidad para, sabiendo la posición del píxel actual, ver si es menor que la distancia guardada en la textura de profundidad. Para ello hay que convertir las coordenadas del píxel actual al espacio de la luz y proyectarlas, obteniendo las coordenadas de textura. Si efectivamente la distancia es menor, el píxel está iluminado. Si no, el píxel está en sombra.

Se necesita representar la escena en una textura de profundidad para cada luz que proyecta sombras, por lo que esta técnica requiere bastantes recursos. Con más de tres luces empieza a ir lento. Hay que tener en cuenta que mi filosofía en este motor es llevar al extremo el término KISS (Keep It Simple, Stupid). No hago optimizaciones (salvo alguna caché en la carga de recursos) y procuro mantener el código simple.

Me faltaría por implementar las sombras para luces direccionales, como el Sol. Para ello necesitaré implementar cámaras ortogonales en Antares, cosa que aún no he hecho porque no he necesitado. Naturalmente el shadow map sólo puede cubrir una superfície limitada, por lo que tendría que ajustar la parte iluminada a lo que está viendo el jugador, y no sé si quedaría bien. En juegos comerciales lo que se usa es la técnica de cascaded shadow mapping, que usa shadow maps de fiferentes resoluciones para cubrir zonas progresivamente más alejadas de la cámara, pero como digo yo no hago optimizaciones de ese tipo.

He tardado 4 días en implementar esto. Un día para investigar y pensarlo, y tres días para programarlo, aunque uno de esos tres días (el del medio) lo pasé bloqueado por un bug que me impedía progresar.

Os dejo algunas imágenes y vídeos, hasta la próxima!

pruebasShadowMap2La primera sombra que conseguí, aún en desarrollo