Come posso rendere il mio gioco 3D in ASCII art?


19

Sto cercando di creare un uovo di Pasqua per un gioco 3D in Unity3D. Voglio rendere il mio gioco momentaneamente nell'arte ASCII.

La mia prima idea è quella di creare uno shader per farlo, ma non sono sicuro che sia il modo giusto.


con libAA o libCACA ( link1 - link2 resp.)
v.oddou

Risposte:


20

Non conosco soluzioni plug and play per questo, ma ecco un algoritmo che funziona nel pixel shader con solo una trama come risorse extra .

L'asset richiesto è una piccola trama con una singola riga di un numero di tessere, dove la più a sinistra è la più scura e la più a destra la più leggera.

Quello che succede allora è (per frame):

  • Prendi il buffer di cui vuoi creare una versione ASCII e ridimensionalo in base alla dimensione della piastrella (quindi se hai 8x8 tessere l'immagine verrà ridimensionata di 8 in entrambe le dimensioni).
  • Creare una nuova destinazione di rendering del buffer di dimensioni originali originale.
  • Usa un pixel shader con il seguente:
    • Un input campionatore per il buffer (con campionamento impostato sul vicino più vicino) e un input campionatore per i riquadri.
    • Uniformi per la dimensione delle piastrelle, la quantità di piastrelle e la risoluzione finale di output
  • Il pixel shader dovrebbe quindi:
    • Ottieni il valore della scala dei grigi dal buffer ridimensionato ( (col.r+col.g+col.b) / 3.0probabilmente è sufficiente, anche se non è esattamente come funzionano gli occhi)
    • Usa queste informazioni per ottenere da quale riquadro vuoi renderizzare ( floor(grayscale * TILE_COUNT))
    • Calcola le coordinate pixel X / Y dell'output e prendi quelle dimensioni del riquadro (tileX / tileY).
    • Restituisce come colore il valore campionato dal buffer delle piastrelle in vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )

La pagina collegata ha diverse immagini di esempi, una cosa che prenderei in considerazione l'aggiunta sarebbe un po 'di rumore al valore di scala di grigi calcolato quindi non è un grande blocco di MMMMMMMMMMMMMMMMs

Aggiornato: @Lokkij nella chatroom di gamedev ha pubblicato un tutorial più completo per Unity: http://pentahelix.github.io/ASCII-Tutorial-Revisited/


Soluzione semplice che potrebbe funzionare abbastanza bene (+1). Ora sto pensando di implementare questo effetto da solo.
Paul Manta,

2
@Sata In riferimento al commento di Kevin che "[questo] non è proprio come funzionano gli occhi", ecco una descrizione di diversi modi per convertire un'immagine colorata in scala di grigi: johndcook.com/blog/2009/08/24/…
Paul Manta,

1
È possibile espandere questo per includere parametri aggiuntivi come il rilevamento dei bordi, per selezionare i caratteri in base alla loro forma oltre alla densità / luminosità.
DMGregory

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.