Mapeo de sombras y quads transparentes

10

El mapeo de sombras usa el búfer de profundidad para calcular dónde se deben dibujar las sombras.

Mi problema es que me gustaría que algunos quads con textura semitransparente arrojen sombras, por ejemplo, árboles con carteles. Como el valor de profundidad se establecerá en todo el quad y no solo en las partes visibles, proyectará una sombra cuádruple, que no es lo que quiero.

¿Cómo puedo hacer que mis quads transparentes proyecten sombras correctas usando el mapeo de sombras?

CiscoIPPhone
fuente

Respuestas:

15

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

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.

Notabene
fuente
6

Con la canalización programable, debe hacerlo como lo instruyó @notabene. Sin embargo, también es fácil hacerlo con una tubería fija sin escribir ningún sombreador. En OpenGL glAlphaFunc es lo que quieres. Por ejemplo:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);
msell
fuente
1
Ordenado. Odio la tubería fija. Así que realmente admiro a todos los que pueden hacer esto sin sombreadores. +1 seguro.
Notabene
@Notabene No hay absolutamente nada admirable sobre el uso de tecnología obsoleta.
Tara
2

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.

r2d2rigo
fuente
-1

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

medicinas
fuente