Mapeamento de Sombra e Quads Transparentes

10

O mapeamento de sombras usa o buffer de profundidade para calcular onde as sombras devem ser desenhadas.

Meu problema é que eu gostaria que alguns quadriciclos com textura semi-transparente projetassem sombras - por exemplo, árvores de outdoor. Como o valor da profundidade será definido em todo o quadrilátero e não apenas nas partes visíveis, ele lançará uma sombra do quadrilátero, que não é o que eu quero.

Como posso fazer meus quadríceps transparentes projetarem sombras corretas usando o mapeamento de sombras?

CiscoIPPhone
fonte

Respostas:

15

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: Alfa de 1 bits

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.

Notabene
fonte
6

Com o pipeline programável, você deve fazê-lo como o @notabene instruiu. No entanto, é fácil fazer isso com o pipeline fixo também sem escrever shaders. No OpenGL glAlphaFunc é o que você deseja. Por exemplo:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);
msell
fonte
1
Arrumado. Eu odeio pipeline fixo. Então, eu realmente admiro todo mundo que pode fazer isso sem shaders. +1 com certeza.
Notabene 02/02
@ Notabene Não há absolutamente nada admirável em usar a tecnologia obsoleta.
Tara
2

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.

r2d2rigo
fonte
-1

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 ...

remédios
fonte