à procura de técnicas aceitáveis ​​de mapeamento de sombras de qualidade

8

Recentemente, enquanto procurava solucionar o problema da acne das sombras do mapeamento tradicional das sombras, implementei mapas de sombras exponenciais. Ele fez o truque (sem acne), mas ao mesmo tempo introduziu outros erros inaceitáveis.

Para desfoque no mapa de profundidade, uso o desfoque gaussiano com o menor sigma = 1.

Teste para o 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);

com pequeno fator c c=100.0:

insira a descrição da imagem aqui

Sangramento leve inaceitável

com alto fator c c=5000.0:

insira a descrição da imagem aqui

Nenhum sangramento leve, mas os detalhes de alta frequência aparecem "inchados".

Não é possível encontrar o sangramento c-light ideal, mesmo quando o c=3000.0erro de sombra de alta frequência já está lá. Não desfocar o mapa de profundidade ajuda, mas o alias ocorre.

E minha pergunta é - como posso melhorar essa técnica (ESM) ou devo procurar outra? Acho que sombras de boa qualidade com bom desempenho são definitivamente possíveis - como visto em jogos modernos como Witcher 3 ou Fallout 4.

narthex
fonte

Respostas:

2

Bem deixa pra lá. Eu fiz algumas pesquisas e realmente vou:

  • faça uma amostra do ESM usando a amostragem Poisson da maneira PCF (agradeça a Bart Wronski pelo ótimo aplicativo gerador de amostras Poisson) e estenda-o à técnica PCSS (penumbra variável). Renderize para textura.
  • opcionalmente, o desfoque ciente da profundidade para suavizar - EDIT não tão rápido que esta opção não funciona conforme o esperado, muito ruim. Em vez disso, girar o kernel PCF parece funcionar bem.

E muito ruim, não há muita discussão aqui.

narthex
fonte