Artefatos de mapa de sombras

16

Quero tentar adicionar sombras a um jogo 3D XNA. Eu configurei um ambiente de teste com uma luz e uma câmera. No entanto, estou encontrando artefatos com minha abordagem.

Estou usando o código shader de http://pastebin.com/zXi0hmsU para renderizar o resultado final e http://pastebin.com/rY4Gcj9N para criar os mapas de sombra. O código é bastante direto e envolve a produção do mapa de profundidade do ponto de vista da luz, projetando-o no espaço da câmera e verificando se há oclusões.

No entanto, da maioria dos ângulos, estou obtendo resultados bastante feioscomo nesta imagem

A cena consiste em alguns cubos simples (construídos à mão, de frente para fora, a face traseira é abatida), uma luz (mapa de sombras mostrado no canto superior esquerdo - parece bom) e uma câmera.

Meu RenderTarget para os mapas de sombra é inicializado por

int shadowMapSize = 512;
RenderTarget2D shadowMap = new RenderTarget2D(GraphicsDevice, shadowMapSize,
    shadowMapSize, true, GraphicsDevice.PresentationParameters.BackBufferFormat,
    DepthFormat.Depth24Stencil8);
GraphicsDevice.SetRenderTarget(shadowMap);
GraphicsDevice.Clear(Color.White);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;

Depois, o CreateShadowMapefeito é aplicado, seguido pelo efeito LambertWithShadows. Finalmente, o mapa de sombras é desenhado usando a SpriteBatch.

O restante do código consiste em simplesmente fornecer os valores corretos aos shaders. Se necessário, posso fornecê-lo também.

Etan
fonte

Respostas:

19

Este é um problema típico chamado acne no mapa de sombras . É causado por causa do pixel projetado do mapa de sombras (profundidade) ser maior que o pixel na tela (a equação não pode representar a profundidade corretamente).

insira a descrição da imagem aqui

Existem muitas soluções para isso. Primeiro, o mais fácil é o viés (eu o vejo no seu código, então esse não é o problema). E a segunda solução fácil é o mapa de sombras em uma resolução maior, é realmente mais do que o típico ter mapas de sombras na resolução 2048x2048 no hw atual. (EDIT: isso não é verdade, escrevi isso quando estava trabalhando na renderização de filmes. No desenvolvimento de jogos, você deseja manter o mapa de sombras o menor possível)

Alguns recursos para estudar técnicas mais avançadas.


editar:

Notabene
fonte
Tenho mais alguns materiais sobre esse tópico no trabalho, se você estiver interessado, eu também o compartilharei.
31411 Notabene
O principal problema com grandes resoluções é que, no final do jogo, tenho cerca de 3-4 luzes que não são direcionadas => Vou ter que usar mapas cúbicos de sombras lá, o que resulta em 24 mapas de sombras. Se você tem materiais adicionais, eu realmente appretiate seu esforço de compartilhá-lo comigo :-)
Etan
Estou interessado pelo menos se isso importa :)
James
1
@Etan. Sim, luzes omnidirecionais são uma verdadeira dor se falar sobre sombras. (eu sei algo sobre isso :) gamedev.stackexchange.com/questions/6203/… ). Tente usar mapas parabolóides duplos. Ou, se você gosta de mapas de cubos, tente economizar algum espaço selecionando o cruzamento frustum-camera_frustum para cada rosto / renderização. Você propably não vai precisar de sombra para todas as direções o tempo todo (especialmente em exteriores)
Notabene
1
@Etan @James Adicionei mais algumas coisas para você. Vale a pena ler ambos, se você estiver interessado neste tópico.
Notabene 02/04