Sombras suaves de luz pontual

7

Como implementar sombras suaves para luz omnidirecional (ponto). Usamos a técnica típica de mapeamento de sombra. A profundidade é renderizada no cubo de textura e o addresing é bastante simples. Apenas usando vetor da luz para fragmentar a posição mundial. Funciona perfeitamente. Até que você queira sombras suaves. Em nosso mecanismo, usamos a técnica PCSS para luzes do ponto. Mas, como ponto de luz, começa problemas.

Como provar em 3D?

Desenvolvi a técnica quando a base ortonormal é criada a partir de uma direção e um vetor ascendente (0,1,0). E então multiplique o vetor de amostragem (algo como este (1.0, i / depthMapSize, j / depthMapSize) com essa base. Mas isso (é claro :)) parece muito ruim para vetores próximos (0,1,0) e (0, - 1,0)

Agradeço qualquer ajuda nisso.

Notabene
fonte
Como isso ainda não está resolvido, desejo deixar essa pergunta aberta. Talvez algum dia eu postarei minha solução porque realmente precisamos descobrir isso. Mas ainda assim eu ficaria muito feliz para todas as idéias
Notabene
Sua pergunta realmente não está clara para mim. Parece que você implementou luzes de ponto usando um mapa de sombra do cubo. As sombras suaves usando essa técnica são as mesmas que na implementação de sombras para luzes direcionais ou de ponto. Você já implementou sombras suaves com um ponto ou luz direcional antes? Os princípios são os mesmos.
precisa saber é o seguinte
@olhovsky: Claro que implementamos o PCSS típico, o problema do mapa de cubos de sombra é que ele é amostrado usando vetor 3D e o mapa de sombra de luz é amostrado em 2D ... o problema é: como fazer a amostragem em 3D, mantendo a mesma aparência que PCSS em 2D. Minha base de amostragem ortonormal produz artefatos, mas foi provado que funciona (mas acredito que há uma solução melhor).
Notabene
Nota: a filtragem PCF apenas suaviza as bordas das sombras e não ajuda a usar melhor a resolução do mapa de sombras no espaço claro. Para isso, você também precisa usar uma técnica como PSSM / CSM. Eu adicionei uma resposta que elborates, onde podemos continuar a discussão.
precisa saber é o seguinte
Em resposta à amostragem do cubo com um vetor 3D: basta aplicar qualquer técnica de mapa de sombras que você gosta aos lados 2D do cubo e, em seguida, provar todos os 6 lados e misturar-se adequadamente. Você pode pensar no PSSM como dando-lhe muitos cubos, se preferir vê-lo dessa maneira.
precisa saber é o seguinte

Respostas:

2

Bem como um simples hack na sua técnica atual, você pode escolher entre dois vetores up, com base no fato de seu vetor de visualização tender para o paralelo com um.

Seria apenas um abdômen, compare e selecione em termos de sombreador, de modo que não haja muita sobrecarga - especialmente considerando a amostragem e a mistura ...

JasonD
fonte
Obrigado pela resposta. Eu tentei o que você sugere antes e você está certo, isso ajuda, mas produz alguns outros problemas. Eu acho que minha técnica é um beco sem saída e eu adoraria encontrar uma nova.
Notabene
0

Você está usando um mapa de cubo para representar as sombras de uma luz pontual.

Nesse caso, é aproximadamente equivalente a ter 6 luzes de ponto unidas.

Você precisa executar a pesquisa do bloqueador PCSS em cada um dos 6 mapas de sombra, para encontrar um valor de penumbra para cada mapa de sombra (da mesma maneira que é feito para uma única luz de ponto).

Depois, você simplesmente mistura entre cada valor da penumbra, como já faz na etapa de mapeamento de sombras que você já implementou.

Isso pode ser otimizado porque um objeto de recebimento pode ser bloqueado por um objeto em no máximo 3 mapas de sombra - portanto, são necessárias apenas três pesquisas de bloqueadores de PCSS. No entanto, obtenha a versão mais simples funcionando primeiro.

Olhovsky
fonte