Seu problema resolverá a renderização com 1bit alfa. O que significa que você especifica algum alfa da textura de origem que não é renderizado (principalmente 0,5).
Você precisa escrever seu próprio sombreador para economizar profundidade da luz e usar as instruções discard
. O descarte existe em hlsl, glsl e em cg também. Ele existe apenas no sombreador de pixel / fragmento e descarta o fragmento atual da renderização em backBuffer e no buffer z.
if (texSample.a < 0.5)
discard;
A vantagem é que você não precisa alterar a renderização da segunda passagem, apenas a profundidade da luz. Também eu tenho que provar que funciona:
Se você deseja renderizar sombras corretas para vários objetos transparentes, precisará usar várias texturas de profundidade, com informações de profundidade e opacidade renderizadas usando a remoção de profundidade. E para fumaça, cabelos etc. Mapas de opacidade profunda ou opacidade de Fourier são a melhor solução (eu recomendo principalmente mapas de opacidade de Fourier)
edit: Acabei de perceber que esqueci de adicionar créditos. Como sempre. O modelo de árvore é do projeto loopix, o que é ótimo se você estiver procurando por alguns tipos de vegetação com baixa densidade, uma textura e modelos livres de vegetação.
Você precisa de um sombreador personalizado para a geração do mapa de sombra, para poder gerar um oclusor válido quando a transparência do pixel / fragmento for maior que o limite especificado. Dessa forma, o mapa de profundidade será gerado por pixel e não por polígono.
fonte
A única maneira de pensar em fazer isso é criar uma textura de mapa de profundidade separada, renderizando as árvores para ele, produzindo a profundidade em que alpha! = 0, produzindo profundidade = 1 e combinando essa textura de mapa de sombra com a textura do mapa de sombra da cena , o que deve ser bastante simples; simplesmente pegue o menor dos dois valores e defina-o no mapa de profundidade final.
Isso não resolve os pedidos combinados; se você produzir uma profundidade atrás de uma textura alfa, ela será substituída quando você renderizar o quad com a textura, portanto, para que esse efeito funcione, você terá que renderizar cada quad individualmente na textura do mapa de profundidade ...
fonte