XNA Aggiunta di crateri (tramite GPU) con un effetto "Burn"


11

Attualmente sto lavorando su un clone 2D "Worms" in XNA, e una delle caratteristiche è il terreno "deformabile" (ad es. Quando un razzo colpisce il terreno, c'è un'esplosione e una parte del terreno scompare).

Come sto attualmente facendo questo è usando una trama che ha un valore di rosso progressivamente più alto mentre si avvicina al centro. Scorro ogni pixel di quella trama "Deforma" e se il pixel corrente si sovrappone a un pixel del terreno e ha un valore rosso abbastanza alto, modifico l'array di colori che rappresenta il terreno in trasparente. Se il pixel corrente NON ha un valore Rosso abbastanza alto, annerisco il colore del terreno (diventa più nero quanto più il valore del Rosso si avvicina alla soglia). Alla fine di questa operazione uso SetData per aggiornare la trama del mio terreno.

Mi rendo conto che questo non è un buon modo per farlo, non solo perché ho letto delle bancarelle della pipeline e simili, ma anche perché può diventare piuttosto lento se vengono aggiunti molti crateri contemporaneamente. Voglio rifare la mia generazione del cratere sulla GPU invece usando il "ping-pong" dei target di rendering tra essere il bersaglio e la trama da modificare. Non è questo il problema, so come farlo. il problema è che non so come mantenere il mio effetto di masterizzazione usando questo metodo.

Ecco come appare l'effetto burn in questo momento:

Effetto Burn

Qualcuno ha idea di come creerei un effetto di bruciatura simile (oscurando i bordi attorno al cratere formato)? Non ho familiarità con Shader, ma se lo richiede sarei davvero grato se qualcuno mi avesse guidato su come farlo. Se ci fossero altri modi sarebbe fantastico.


Risposte:


7

Un modo in cui potresti farlo è simile a quello che hai fatto. Hanno una trama "Danno" e la trama di sfondo reale, ma invece di copiare i dati ogni volta, mantieni i due come due trame separate.

Quando viene fatta un'esplosione, traccia un cerchio sulla trama Danno che ha un bordo leggermente trasparente. Questa sarà l'area "brucia".

Ogni volta che disegni il terreno, dai alla GPU entrambe le trame e fai sì che il tuo shader moltiplichi il colore (.rgb) dei pixel di sfondo per 1 - il valore alfa della trama del danno. Sbarazzati dei pixel completamente neri (alfa a 0, oppure puoi moltiplicarlo anche in alfa (.rgba invece di .rgb) a seconda se vuoi aree bruciate traslucide) e voilà!

Dubito che questa sia la soluzione migliore , ma è abbastanza simile a ciò che hai fatto prima che potrebbe facilitare il trasferimento. Probabilmente potresti anche cavartela passando con una serie di Vector3 (x, y, raggio) e facendo un po 'di matematica nello shader in base a quei punti di esplosione, ma non sono sicuro dell'efficacia di tale.

Spero che questo ti aiuti!


Grazie! Questo è anche un bel modo di farlo, e simile a quello che sto facendo ora, come hai detto. Non so nulla di HLSL ma sicuramente lo esaminerò. Un altro modo in cui mi è stato detto che potevo fare è annerirlo mentre mi avvicino al bordo del cratere, ma ci proverò anche in questo modo.
Benixo,
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.