Jorge
Jorge Autor de Aprende Unreal Engine 4.

Cascaded Shadow Maps

Cascaded Shadow Maps

Los shadow maps son una técnica común para añadir sombras a los juegos. La idea básica es testear cuando un pixel es visible desde la fuente de luz, si no es visible, entonces hay sombra.

El algoritmo consiste en dos pasadas: la primera construye un mapa de profundidad (a veces llamado shadow depth map) en el espacio de luces; la segunda compara la profundidad de cada pixel (en espacio de luces) con la correspondiente profundidad en el mapa calculado en el paso uno. Si el pixel tiene mayor profundidad (z) que el valor en el shadow depth buffer significa que la luz está ocluida y por tanto hay que pintar sombra en dicho pixel.

Partiendo de esta escena de ejemplo:

Shadow Depth Map

El algoritmo shadow map hace su primera pasada donde construye el shadow depth buffer (que es básicamente una textura) en light-space desde la fuente de luz. Piensa que es como si renderizaras la escena pero no desde la cámara, si no con la fuente de luz cómo la cámara y almacenaras el z-buffer resultante en una textura. Esa textura es el shadow depth buffer.

Shadow Depth Buffer

En su segunda pasada se comparan las profundidades del pixel (en lights pace) con el depth buffer previamente calculado para saber si dicho pixel recibe sombra o no. El depth buffer previo se usa, por lo tanto, para saber que pixel están ocluido de la luz. Si el pixel cuya profundidad (z) en coordenadas lightspace es mayor que el valor en el shadow depth map significa que la luz “no ve” ese pixel y por tanto en dicho pixel debe pintarse sombra.

Shadow Depth Buffer

Esta técnica es ampliamente usada en todos los motores de render en tiempo real.

Artefactos

Este algoritmo presenta varios artefactos muy comunes:

Perspective Aliasing

Ocurre cuando al “mapear” los pixeles desde el viewspace a texels en el shadow buffer (que es una textura) no están en ratio 1 a 1. Esto es debido a que cerca de la cámara los pixeles son más cercanos los unos a los otros y requieren una resolución shadow depth map mayor.

Perspective Aliasing

En la siguiente imagen se ilustra la resolución del depth map junto al frustum de la cámara. Cuanto más cerca de la cámara necesitamos más resolución y cuanto más lejos necesitaremos menos resolución.

Cascaded Shadow Map Frustum

La técnica más común para resolver este artefacto es usar Cascaded Shadow Maps (CSM). La idea es dividir el frustum de la cámara y usar para cada división un depth buffer de mayor resolución cuanto más cerca de la cámara esté.

Cascaded Shadow Map Frustum

Shadow Acne

Ocurre cuando los valores en shadow depth buffer son muy cercanos al depth buffer de cada pixel y al comparar dichos valores tan cercanos se cometen errores (floating point).

Cascaded Shadow Map Acne

Se resuelve ajustando un valor, comúnmente llamado ‘bias’ que añade como offset al depth buffer, de este modo se resuelve el error al comparar floats tan cercanos.

Cascaded Shadow Map Acne

Peter Panning

Este artefacto ocurre precisamente al intentar arreglar el artefacto anterior. Al usar un ‘bias’ demasiado alto se puede caer en una mala comparación.

Cascaded Shadow Map Peter Panning

Con el valor de ‘bias’ correcto se consigue evitar el Acne y el Peter Panning:

Cascaded Shadow Map Peter Panning

comments powered by Disqus