Su problema resolverá el renderizado con 1 bit alfa. Lo que significa que especifica algún alfa de textura de origen que no se procesa (principalmente 0.5).
Tienes que escribir tu propio sombreador para salvar la profundidad de la luz y usar las instrucciones discard
. El descarte existe en hlsl, glsl y también en cg. Solo existe en el sombreador de píxeles / fragmentos y descarta el fragmento actual del renderizado en backBuffer y en z-buffer.
if (texSample.a < 0.5)
discard;
La ventaja es que no necesita cambiar la representación de la segunda pasada, solo la representación de la profundidad de la luz. También he demostrado que funciona:
Si desea representar las sombras correctas para varios objetos transparentes, tendrá que usar texturas de profundidad múltiples, con información de profundidad y opacidad renderizada usando pelado de profundidad. Y para el humo, el cabello, etc. Los mapas de opacidad profunda o de opacidad de Fourier son la mejor solución (principalmente recomiendo mapas de opacidad de Fourier)
editar: me acabo de dar cuenta de que olvidé agregar créditos. Como siempre. El modelo de árbol es del proyecto loopix, que es genial si está buscando algunos modelos de vegetación de baja polivinilo, una textura y libres.
Necesita un sombreador personalizado para la generación del mapa de sombras, de modo que pueda generar un oclusor válido cuando la transparencia del píxel / fragmento sea mayor que el umbral especificado. Esto, el mapa de profundidad se generará por píxel y no por polígono.
fuente
La única forma en que puedo pensar en hacer esto es creando una textura de mapa de profundidad separada, renderizando los árboles en ella, generando una profundidad donde alfa! = 0, de lo contrario, generando profundidad = 1, luego combinando esta textura de mapa de sombras con la textura de mapa de sombras de la escena , que debería ser lo suficientemente simple; simplemente tome el menor de los dos valores y configúrelo en el mapa de profundidad final.
Sin embargo, esto no resuelve las órdenes de mezcla; Si genera una profundidad detrás de una textura alfa, se anulará cuando renderice el quad con la textura, por lo que para que este efecto funcione, tendrá que renderizar cada quad individualmente en la textura del mapa de profundidad ...
fuente