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.
fonte
Respostas:
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 ...
fonte
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.
fonte