Wie rendere ich mein 3D-Spiel in ASCII-Kunst?

19

Ich versuche, ein Osterei für ein 3D-Spiel in Unity3D zu erstellen. Ich möchte mein Spiel momentan in ASCII-Grafik rendern.

Meine erste Idee ist, einen Shader zu erstellen, aber ich bin mir nicht sicher, ob es der richtige Weg ist.

Sata
quelle
mit libAA oder libCACA ( link1 - link2 bzw.)
v.oddou

Antworten:

20

Ich kenne keine Plug-and-Play-Lösung dafür, aber hier ist ein Algorithmus, der im Pixel-Shader nur mit einer Textur als zusätzlichen Bestandteilen arbeitet .

Das erforderliche Asset ist eine kleine Textur mit einer einzelnen Reihe aus einer Reihe von Kacheln, wobei die am weitesten links die dunkelste und die am weitesten rechts die hellste ist.

Was dann passiert ist (pro Frame):

  • Nehmen Sie den Puffer, von dem Sie eine ASCII-Version erstellen möchten, und verkleinern Sie ihn um die Kachelgröße (wenn Sie also 8x8-Kacheln haben, wird das Bild in beiden Dimensionen um 8 verkleinert).
  • Erstellen Sie ein neues Rendering-Ziel des ursprünglichen Puffers in voller Größe.
  • Verwenden Sie einen Pixel-Shader mit folgenden Eigenschaften:
    • Ein Sampler-Eingang für den Puffer (wobei das Sampling auf den nächsten Nachbarn eingestellt ist) und ein Sampler-Eingang für die Kacheln.
    • Uniformen für die Kachelgröße, die Kachelanzahl und die endgültige Ausgabeauflösung
  • Der Pixel Shader sollte dann:
    • Holen Sie sich den Graustufenwert aus dem verkleinerten Puffer ( (col.r+col.g+col.b) / 3.0reicht wahrscheinlich aus, auch wenn das nicht ganz so ist, wie Augen funktionieren)
    • Verwenden Sie diese Informationen, um zu ermitteln, von welcher Kachel Sie rendern möchten ( floor(grayscale * TILE_COUNT))
    • Berechnen Sie die Pixel-X / Y-Koordinaten der Ausgabe und nehmen Sie für diese Module die Kachelgröße (tileX / tileY).
    • Geben Sie als Farbe den Wert zurück, der aus dem Kachelpuffer bei abgetastet wurde vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )

Die verlinkte Seite enthält mehrere Bilder mit Beispielen. Eine Sache, die ich als Addition betrachten würde, wäre ein leichtes Rauschen des berechneten Graustufenwerts, sodass es kein großer Block von MMMMMMMMMMMMMMMMs ist

Aktualisiert: @Lokkij hat im Chatroom von gamedev ein vollständigeres Tutorial für Unity veröffentlicht: http://pentahelix.github.io/ASCII-Tutorial-Revisited/

Elva
quelle
Einfache Lösung, die ziemlich gut funktionieren könnte (+1). Jetzt denke ich darüber nach, diesen Effekt selbst umzusetzen.
Paul Manta
2
@Sata In Bezug auf Kevins Kommentar, dass "[dies] nicht ganz so funktioniert wie Augen", folgt eine Beschreibung mehrerer Möglichkeiten, ein Farbbild in Graustufen umzuwandeln
Paul Manta
1
Sie können dies erweitern, um zusätzliche Parameter wie die Kantenerkennung einzuschließen und zusätzlich zu Dichte / Helligkeit Zeichen anhand ihrer Form auszuwählen.
DMGregory
Außerdem gab es einen Artikel über ähnliche Aktionen in XNA .
XNargaHuntress