Shadow Mapping e Quad trasparenti


10

La mappatura delle ombre utilizza il buffer di profondità per calcolare dove devono essere disegnate le ombre.

Il mio problema è che mi piacerebbe che alcuni quads semi trasparenti strutturati proiettassero ombre, ad esempio alberi con pannelli. Poiché il valore della profondità verrà impostato su tutto il quad e non solo sulle parti visibili, verrà proiettata un'ombra quadrupla, che non è ciò che desidero.

Come posso fare in modo che i miei quad trasparenti proiettino ombre corrette usando la mappatura delle ombre?

Risposte:


15

Il tuo problema risolverà il rendering con 1 bit alfa. Ciò significa che si specifica un po 'di alfa della trama di origine che non viene renderizzato (principalmente 0,5).

Devi scrivere il tuo shader per salvare la profondità dalla luce e usare le istruzioni discard. Il rigetto esiste anche in hlsl, glsl e in cg. Esiste solo nello shader pixel / frammento e scarta il frammento corrente dal rendering in backBuffer e in z-buffer.

if (texSample.a < 0.5)
   discard;

Il vantaggio è che non è necessario modificare il rendering di secondo passaggio, ma solo il rendering della profondità della luce. Inoltre ho dimostrato che funziona: 1 bit alfa

Se si desidera eseguire il rendering delle ombre corrette per più oggetti trasparenti, è necessario utilizzare più trame di profondità, con le informazioni di profondità e opacità rese utilizzando il peeling di profondità. E per fumo, capelli ecc. Opacità profonde o mappe di opacità di Fourier sono la soluzione migliore (raccomando principalmente mappe di opacità di Fourier)

modifica: ho appena realizzato che ho dimenticato di aggiungere crediti. Come sempre. Il modello dell'albero proviene dal progetto loopix, il che è fantastico se stai cercando un po 'di poli, una trama e modelli gratuiti di vegetazione.


6

Con la pipeline programmabile dovresti farlo come indicato da @notabene. Tuttavia è facile da fare anche con pipeline fissa senza scrivere shader. In OpenGL glAlphaFunc è ciò che desideri. Per esempio:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);

1
Neat. Odio la pipeline fissa. Quindi ammiro davvero tutti quelli che possono fare queste cose senza shader. +1 di sicuro.
Notabene,

@Notabene Non c'è assolutamente nulla di ammirevole nell'uso della tecnologia obsoleta.
Tara,

2

È necessario uno shader personalizzato per la generazione della mappa ombra, in modo da poter generare un occluder valido quando la trasparenza del pixel / frammento è maggiore del treshold specificato. Questo perché, la mappa di profondità verrà generata per pixel e non per poligono.


-1

L'unico modo in cui posso pensare di fare questo è creare una trama della mappa della profondità separata, renderizzare gli alberi in essa, emettere profondità dove alpha! = 0, altrimenti produrre la profondità = 1, quindi combinare questa trama della mappa d'ombra con la trama della mappa d'ombra della scena , che dovrebbe essere abbastanza semplice; prendi semplicemente il più piccolo dei due valori e impostalo sulla mappa di profondità finale.

Questo, tuttavia, non risolve gli ordini di fusione; se si genera una profondità dietro una trama alfa, questa verrà sovrascritta quando si esegue il rendering del quad con la trama su di essa, quindi affinché questo effetto funzioni dovrai renderizzare ogni quad singolarmente nella trama della mappa di profondità ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.