Come posso implementare il cast di ombre 2D tra i livelli?


10

Come posso implementare le ombre 2D che sono proiettate da oggetti in un livello diverso?

NON mi piace l'illuminazione dinamica nel noto tutorial di Catalin Zima :

inserisci qui la descrizione dell'immagine

Ma come le ombre delle pipe in questo video :

inserisci qui la descrizione dell'immagine

E come l'ombra della piattaforma e il personaggio di questo video :

inserisci qui la descrizione dell'immagine

Vorrei usare lo stesso tipo di illuminazione in una scena con molti strati e molte luci con colori diversi.

Potrei immaginare di farlo disegnando una copia nera del livello sugli strati dietro quel livello e regolandola in base ai fori negli strati su cui è proiettata l'ombra. Ma spero che ci sia un approccio meno costoso basato su pixel shader per questo.

Risposte:


1

Questo può essere fatto con il mascheramento. Esistono diversi modi per farlo.

Un modo sarebbe quello di avere un modo per rendere una versione shadow degli elementi in primo piano. Disegna lo sfondo. Quindi disegna gli elementi di primo piano, spostandoli leggermente in base al modo in cui vuoi spostare l'illuminazione, in modo tale da produrre solo colori neri. Quindi disegna normalmente il primo piano.

Un altro modo sarebbe quello di rendere il primo piano in un buffer, un po 'più di quanto si possa vedere. Quindi fai un passaggio "nero" e forse un passaggio sfocato. Ora esegui il rendering dell'output di questo set di passaggi e quindi della sezione visibile del buffer di primo piano.

Per supportare più luci con diverse angolazioni, puoi semplicemente eseguire il passaggio precedente più volte o accumularle tutte in un singolo buffer. La matematica varierà in base a ciò che stai cercando di ottenere, ma una prima ipotesi su ciò che sta accadendo in quel primo video è che prendono semplicemente la posizione della luce contro la posizione della telecamera (al centro dell'area visibile) e quindi usa quel vettore (ridimensionato) per determinare come compensare le ombre. Qualcosa di simile a:

draw background
for each light intersecting viewing bounds:
  offset = light.position - camera.position
  offset *= SCALE FACTOR (0.25 maybe)
  draw shadow foreground at offset
draw foreground

Le luci "più vicine" alla scena avranno un fattore di scala minore. Se vuoi più profondità, c'è un po 'di matematica da risolvere, semplici elementi geometrici.


Sì, questo è esattamente quello che mi è venuto in mente. Non sapevo che il termine corretto fosse mascherare. Ma speravo che ci potesse essere un algoritmo più simile a come funzionano i volumi delle ombre nello spazio 3D ..
Berry

Quando si proiettano ombre su superfici con buchi, è necessario proiettare l'ombra residente sul livello dietro quello. Inoltre, lavorare con la trasparenza diventerà un po 'complicato. Ho già pensato a tutte le soluzioni a questi problemi! Ma ho pensato che sarebbe diventato troppo costoso da applicare in tempo reale, soprattutto quando si ha a che fare con molti strati (20) e molte luci (50). Ecco perché speravo in un approccio diverso.
Berry,
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.