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:
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).
opengl
glsl
shadow-mapping
shadow
Blarglenarf
fonte
fonte
Respostas:
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:
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" .
fonte