Recientemente, mientras buscaba resolver el problema del acné en las sombras del mapeo de sombras tradicional, implementé mapas de sombras exponenciales. Hizo el truco (sin acné en absoluto) pero al mismo tiempo introdujo otros errores inaceptables.
Para el desenfoque del mapa de profundidad, uso el desenfoque gaussiano con la sigma más pequeña = 1.
Prueba de mapa de sombra:
float occluder = texture(shadowMap lightCoords.xy).r;
float c = 5000.0;
float receiver = lightCoords.z;
float shadow = exp(c*(occluder-receiver));
shadow = clamp(shadow, 0.0, 1.0);
con factor c pequeño c=100.0
:
Sangrado leve inaceptable
con alto factor c c=5000.0
:
No hay sangrado leve pero los detalles de alta frecuencia parecen "hinchados".
No se puede encontrar el óptimo c - el sangrado de luz aparece incluso en c=3000.0
y el error de sombra de alta frecuencia ya está allí. No difumina el mapa de profundidad, pero se produce un alias.
Y mi pregunta es: ¿cómo puedo mejorar esta técnica (ESM) o debería buscar otra? Creo que las sombras de buena calidad con un buen rendimiento son definitivamente posibles, como se ve en juegos modernos como Witcher 3 o Fallout 4.