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 feios
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 CreateShadowMap
efeito é 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.