Manipulando Aliasing Projetivo no Mapeamento de Sombra

15

Estou brincando com a simples modelagem 3D processual para criar pequenos edifícios para impressão 3D. Um exemplo:

O edifício


Para tornar os modelos mais legíveis na tela, implementei o mapeamento básico de sombras para uma única luz direcional. Como minha cena não está mudando, apenas renderizo o mapa de sombras uma vez usando uma caixa alinhada por eixo da cena para descobrir quais devem ser os limites do mapa de sombras. As sombras e os limites parecem ter todas as matrizes corretas, mas chegar um pouco mais perto parece terrível:

Closeup da torre

Pela leitura que fiz, compreendo o peter panning e o que devo fazer sobre isso, mas as arestas irregulares, que acredito serem uma forma de aliasing projetivo, parecem tão ruins que acho que algo está errado na minha implementação básica.

Eu cortei o pixel shader para mostrar os limites da sombra texel:

Mostrando limites de Texel

Eu tenho filtragem bilinear na textura (sem ela, eu tenho uma grave acne na sombra). Infelizmente, minha tentativa de PCF também falhou - parece igualmente irregular:

insira a descrição da imagem aqui

Aqui está um exemplo de caso com a filtragem bilinear desativada:

insira a descrição da imagem aqui

Isso se parece com um aliasing projetivo "típico"? Poderia a renderização dinâmica do mapa de sombras, usando a vista cortada na cena, possivelmente em cascata, resolver o problema?

Edit: Adicionando um close de filtragem bilinear, comparação pós-sombra, apenas para mostrar o que recebo. A acne com sombra ruim aparece por causa das bordas internas; Estou modelando com blocos virtuais empilhados e não estou fazendo uma operação de união adequada. Pela minha leitura, a implementação de operações booleanas no poliedro não é trivial, mas também permitirá a implementação de volumes estáticos de sombra e a limpeza de alguns softwares de impressão 3D.

Filtragem Bilinear

Daniel M Gessel
fonte

Respostas:

10

O mapeamento de sombras com qualidade aceitável é uma jornada e tanto. Então, você implementou o primeiro passo - mapa de sombras básico que abrange toda a cena estaticamente. Isso significa que o tamanho do texel do mapa de sombra no espaço de exibição de luz para o tamanho de texel da cena renderizada na proporção do espaço de exibição da câmera é bastante grande, resultando em aliases. Para reduzir essa proporção mais perto de 1: 1, existem técnicas mencionadas como:

  • a maneira mais fácil é aumentar o tamanho do seu mapa de sombras, para encontrar o valor com desempenho ainda ideal,
  • alinhar o mapa de sombra com o modo de exibição de câmera. O mapa de sombras abrange uma parte menor da cena, reduzindo o alias,
  • isso pode ser aprimorado para o CSM, que faz o mesmo, mas é necessário renderizar a cena para cada cascata com uma posição central diferente da matriz de exibição de luz com base no ponto central de cada fatia de frustum.

Algumas das técnicas básicas de suavização da borda da sombra:

  • obviamente PCF, mas é recomendável combinar sua implementação PCF com PCF de hardware embutido (em Opengl - usando sampler2DShadow). Isso resultaria em menos iterações de loop do seu lado e em um PCF mais barato,
  • o bloqueio das arestas pode ser trocado por ruído usando o disco Poisson girado. As amostras usadas para amostrar do mapa de sombra são giradas aleatoriamente a cada iteração do loop PCF.

Você também pode pesquisar as técnicas de suavização de borda, como:

  • renderizando o mapa de sombra no framebuffer aplicado pelo MSAA,
  • melhorar ainda mais o PCF por interpolação ,
  • número crescente de amostras com mistura temporal .

A técnica básica do PCF sofre de acne nas sombras, que pode ser corrigida através da aplicação de alguns desvios no teste de sombras. Calcular o tamanho desse deslocamento também é uma área de pesquisa .

Outros métodos mais avançados de mapas de sombras incluem:

  • Mapas de sombras exponenciais e mapas de sombras de variação - na maioria dos casos não sofrem de acne nas sombras e oferecem bordas suaves sem obstruções, mas no custo de algumas situações de vazamento de luz,
  • Mapas de sombras de variação exponencial - provavelmente a técnica mais avançada de mapeamento de sombras de mapas de profundidade 2D, combina grande suavidade do VSM e resolve vazamentos de luz, com um custo de uso de memória duplicado,
  • Sombras suaves mais próximas à porcentagem - técnica básica para aprimorar os mapas de sombras tradicionais com tamanhos variados de penumbra,
  • Mapas de sombras com múltiplas vistas - vários mapas de sombras de alguma técnica, organizados na luz da área, para calcular sombras suaves realistas com tamanhos variados de penumbra,
  • Mapas de sombras profundas - para aprimorar a dispersão volumétrica com sombras,
  • Sombras traçadas por raios em tempo real - provavelmente o futuro.

Você não falhou com o PCF, parece que :)

Eu gostaria que houvesse uma maneira de aplicar a desfocagem gaussiana no mapa de sombras no espaço de visualização da câmera, mas não funciona como esperado.

narthex
fonte
Parte deste comentário está agradecendo a sua resposta, por isso pensei em informar você, já que você não receberá uma notificação a partir daí.
Trichoplax
Sim, eu vi, mas obrigado.
Narthex
1

Você disse que "... filtragem bilinear na textura ...". Parece que você está interpolando os valores de profundidade do mapa de sombras. A maneira correta de usar a interpolação com o mapa de sombra é aplicá-la aos resultados dos testes de sombra (tanto quanto me lembro, o OpenGL suporta isso). Você pode até combinar a interpolação dos resultados dos testes de sombra com o PCF, o que proporcionará resultados muito melhores. No entanto, como você deve ter notado, o alias é uma praga que sempre busca o mapeamento de sombras :)

Embora eu entenda que você está procurando soluções em relação ao mapeamento de sombra (mesmo porque é bastante simples de implementar), você já considerou o uso de volumes de sombra? É muito mais complicado de implementar, mas não sofre nenhum tipo de alias, e acho que se encaixaria bem nos seus propósitos.

Christian Pagot
fonte
Muito obrigado pelas respostas! Para obter os resultados que estou procurando, pode ser apropriado mudar para volumes de sombra. O link de fluxo de código fornecido em "interpolação" é muito útil - obrigado!
DanielM Gessel