Come implementare falsi effetti di distorsione 3D come per un gioco a scorrimento laterale 2D?


14

Non sono certo dei termini corretti su cui cercare o anche da dove cominciare, anche se immagino che sia una sorta di effetto post elaborazione.

Ho visto giochi come I Wanna Be The Boshy e You Must To Win the Game che riescono a modificare la prospettiva dei giochi 2D per dare loro una sorta di effetto 3D (vedi immagini sotto). Boshy in pratica fa sembrare che tu sia all'interno di una torre (cilindro) mentre Devi vincere il gioco distorce l'immagine in modo che sembri che stai giocando su un vecchio monitor CRT, in particolare l'aspetto leggermente arrotondato.

  • C'è un termine per questo effetto?
  • Qual è il modo standard per attuare questo effetto (terminologia)?
  • Come potrei fare per implementare un tale effetto in un motore / framework di alto livello come Unity o XNA / Monogame da una vista di 20.000 piedi? (codice dettagliato accettato felicemente ma non necessario - mi rendo conto che i dettagli esatti dell'implementazione potrebbero variare, ma i dettagli di alto livello su ciò che deve essere fatto sarebbero molto apprezzati)

Voglio essere il Boshy Voglio essere il Boshy

Devi vincere il gioco inserisci qui la descrizione dell'immagine


Si. Sono sempre stato curioso di sapere il termine esatto per la tecnica. Il meglio che mi viene in mente è "vecchio effetto schermo TV"
Tofu_Craving_Redish_BlueDragon

Esattamente! E questo funziona solo per quest'ultimo esempio
SpartanDonut,

Risposte:


7

Questo può essere implementato come un tipo di effetto post-elaborazione. (Quando si utilizza Unity / XNA / Dx / OGL / ...)

Metodo di geometria

Inizia creando una mesh che assomigli all'effetto di distorsione che stai cercando di ottenere. (ad esempio modellare un mezzo cilindro (o cono, sfera, cubo, ...), assicurarsi di impostare le coordinate della trama). Rendi il tuo gioco 2D come al solito, ma trasforma il risultato finale in una trama. Quindi, esegui il rendering della geometria della distorsione con la trama appena creata. È possibile utilizzare il mondo / vista / proiezione o modificare le coordinate geometriche / di trama effettive per controllare l'intensità della distorsione. (l'immagine 1 mostra il normale gioco 2D, l'immagine 2 mostra la stessa trama proiettata su una sfera)

Esempio di gioco Esempio proiettato su una sfera (usando il frullatore)

Metodo di distorsione

Gli strumenti di elaborazione delle immagini offrono spesso effetti di distorsione che potrebbero emulare la proiezione (un po 'come le illusioni ottiche). Ad esempio, l'immagine 3 è stata generata utilizzando il filtro di rigonfiamento di Paint.Net

Distorsione del rigonfiamento.

(Puoi trovare un'implementazione (OpenGL ES 2.0) di questo effetto di distorsione dal progetto GPUImage - vedi GPUImageBulgeDistortionFilter)

A seconda dell'implementazione, entrambi i metodi potrebbero essere più veloci o fornire una corrispondenza migliore con il risultato desiderato. Poiché entrambe le implementazioni sono abbastanza semplici, puoi provare a implementarle entrambe e vedere quale funziona meglio per te.


Risposta fantastica!
Tholle,

1
Entrambi richiedono l'elaborazione della stessa quantità di immagine. La proiezione non sarà mai più veloce di non fare nulla e l'elaborazione delle immagini costa allo stesso modo. - Il metodo "Distortion" è più veloce perché stai saltando la trasformazione del vertice e la rasterizzazione, inoltre stai dando al guidatore più libertà per iterare i pixel, dove l'approccio poligonale è più specifico su quale ordine disegnare. Infine, i poligoni contenere meno informazioni sull'effetto desiderato, ricorrere a una soluzione generica che sottolinea l'hardware del filtro delle trame e produce un'approssimazione anziché il filtro reale.
MickLH,

@MickLH: I vertici per tale proiezione post-elaborazione possono essere calcolati offline o sotto carico, producendo uno shader di vertice pass-through molto economico. Per un filtro di rigonfiamento, è necessario eseguire il rendering e la rasterizzazione di un quad a schermo intero (tranne se SpartanDonut ha accesso ad esempio agli shader di calcolo) e per ogni pixel l'offset deve essere calcolato anziché interpolato. Pertanto, credo (a seconda degli strumenti disponibili e dell'implementazione) entrambi i metodi potrebbero essere altrettanto veloci. Ho aggiornato la mia risposta, grazie per il tuo contributo.
Miklas,
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.