Artefatos de Mapeamento de Sombra

8

Eu tenho brincado com o mapeamento de sombras no OpenGL usando texturas de profundidade. A textura da profundidade é boa e posso mapeá-la na cena, mas tenho alguns artefatos estranhos na parte de trás do objeto:

Esfera projetando uma sombra, com artefatos na parte traseira

Minha pergunta é o que está causando isso e como posso corrigi-lo?

O shader de fragmento que estou usando é bastante simples (retirei a cor para simplificar, caso você esteja se perguntando por que não há azul aqui):

in vec4 vShadowCoord;

uniform sampler2DShadow shadowMap;

out vec4 fragColor;

void main()
{
    float bias = 0.005;
    float visibility = 1.0;
    if (texture(shadowMap, vec3(vShadowCoord.xy, vShadowCoord.z / vShadowCoord.w)) < (vShadowCoord.z - bias) / vShadowCoord.w)
        visibility = 0.25;

    fragColor = vec4(visibility);
}

Editar: conforme solicitado, captura de tela de exemplo de trabalho mínimo que usa apenas o código acima (sem cor).

Mesma esfera, menos cor

Blarglenarf
fonte
11
Você pode confirmar se o código mostrado (com o azul removido) também causa os artefatos? Se você restringiu o código, a exibição da imagem a partir do código restringido ajudará a excluir detalhes irrelevantes e a destacar o problema.
Trichoplax
Sim, é verdade, eu percebi que eu tirar um screenshot com a cor lá caso contrário, parece ainda mais feio :)
Blarglenarf
Entendo isso, mas como é a feiúra que você está pedindo ajuda, você pode ter uma chance melhor de alguém ver o problema se incluir a captura de tela que corresponda ao código também.
Trichoplax
11
Justo. Adicionei uma captura de tela extra.
Blarglenarf
Você já tentou brincar um pouco mais com o preconceito?
Cifz 31/08/2015

Respostas:

11

Esse problema parece artefatos padrão da acne do mapa de sombras. Além disso, sua equação de iluminação está incompleta ou incorreta. A luz não deve influenciar rostos com normais voltados para longe dela. Isso também significa que, com uma equação adequada, o lado "escuro" da esfera não deve ter artefatos de acne.

Existem três fontes de artefatos de acne:

  • A primeira fonte de acne é a precisão do mapa de sombras. Certifique-se de que os planos próximos e distantes da luz projetada pelas sombras sejam o mais estreitos possível. Todos os objetos antes do plano próximo podem ser colocados em panqueca, pois sua profundidade exata não é importante.
  • Segunda fonte de acne é a resolução do mapa de sombras. Para uma luz direcional, você deve fazer mapas de sombras em cascata com pelo menos 3 1024x1012 cascatas por ~ 100-200m de distância da sombra. É difícil cobrir distâncias de sombra semelhantes com um mapa de sombra com projeção uniforme.
  • A terceira fonte de acne é um filtro de mapa de sombras amplo, como o PCF, pois o uso de um único valor de comparação de profundidade de profundidade em um núcleo amplo é insuficiente. Existem muitos métodos para corrigi-lo, mas nenhum deles é robusto.

Para resumir, um frustum apertado com algumas cascatas e alguns ajustes de polarização é suficiente para fazer o caso geral funcionar (luz direcional). Comece ajustando desativando a filtragem de sombra e ajustando para filtragem somente quando os mapas de sombra básicos forem robustos o suficiente.

Além do viés de profundidade constante (que você usa atualmente), você também deve adicionar o viés de profundidade da inclinação e o viés de profundidade máxima da inclinação. Ambos podem ser implementados como estado de renderização ou como código de sombreador durante a renderização de mapa de sombra. O viés de profundidade da inclinação é simplesmente um valor de viés mágico dimensionado por ponto (normal, lightDir).

Existem alguns métodos interessantes adicionais e a maioria deles é implementada na excelente demonstração: Matt Pettineo - "Uma amostra de técnicas de sombra" .

  • Flip culling durante a renderização do mapa de sombras (troca a acne por Peter panning).
  • O mapeamento de sombra de deslocamento normal faz maravilhas para problemas de polarização, mas requer ter normais de vértice durante o sombreamento.
  • Os métodos baseados em variação (ESM, VSM, EVSM) removem completamente os problemas de polarização, mas têm outras desvantagens (vazamentos de luz e / ou problemas de desempenho).
Krzysztof Narkowicz
fonte