Jak renderować moją grę 3D w grafice ASCII?

19

Próbuję stworzyć pisankę do gry 3D w Unity3D. Chcę na chwilę renderować moją grę w sztuce ASCII.

Moim pierwszym pomysłem jest stworzenie shadera, aby to zrobić, ale nie jestem pewien, czy jest to właściwy sposób.

Sata
źródło
z libAA lub libCACA ( link1 - odpowiednio link2 )
v.oddou

Odpowiedzi:

20

Nie znam żadnych rozwiązań typu plug and play, ale oto algorytm, który działa w module cieniującym piksele z teksturą jako dodatkowym atutem .

Wymagany zasób to niewielka tekstura z jednym rzędem pewnej liczby płytek, przy czym skrajnie lewy jest najciemniejszy, a prawy najjaśniejszy.

To, co się wtedy dzieje, to (na klatkę):

  • Weź bufor, dla którego chcesz utworzyć wersję ASCII, i zmniejsz go o rozmiar kafelka (więc jeśli masz kafelki 8x8, obraz zostanie przeskalowany o 8 w obu wymiarach).
  • Utwórz nowy cel renderowania oryginalnego pełnowymiarowego bufora.
  • Użyj modułu cieniującego piksel z następującymi elementami:
    • Wejście próbnika dla bufora (z próbkowaniem ustawionym na najbliższego sąsiada) i wejście próbnika dla płytek.
    • Jednolite dla rozmiaru kafelka, ilości kafelków i końcowej rozdzielczości wyjściowej
  • Moduł cieniujący pikseli powinien wtedy:
    • Uzyskaj wartość skali szarości z przeskalowanego bufora ( (col.r+col.g+col.b) / 3.0prawdopodobnie jest wystarczająca, nawet jeśli nie tak działają oczy)
    • Skorzystaj z tych informacji, aby dowiedzieć się, z którego kafelka chcesz renderować ( floor(grayscale * TILE_COUNT))
    • Obliczyć piksele X / Y współrzędne wyjściowe i wziąć te moduł rozmiar płytki (tileX / tileY).
    • Zwraca jako kolor wartość próbkowaną z bufora kafelków o wartości vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )

Strona, do której prowadzi link, zawiera kilka zdjęć przykładów. Jedną rzeczą, którą chciałbym dodać, byłby nieco szumu w obliczonej wartości w skali szarości, więc nie jest to jeden duży blok MMMMMMMMMMMMMMMMs

Zaktualizowano: @Lokkij w czacie gamedev opublikował bardziej kompletny samouczek dla Unity: http://pentahelix.github.io/ASCII-Tutorial-Revisited/

Elva
źródło
Proste rozwiązanie, które może działać całkiem dobrze (+1). Teraz zastanawiam się nad tym, aby sam ten efekt zrealizować.
Paul Manta
2
@Sata W nawiązaniu do komentarza Kevina, że ​​„[to] nie działa tak jak oczy”, oto opis wielu sposobów konwersji kolorowego obrazu na skalę
Paul Manta
1
Możesz to rozwinąć, aby uwzględnić dodatkowe parametry, takie jak wykrywanie krawędzi, aby wybierać znaki na podstawie ich kształtu oprócz gęstości / jasności.
DMGregory
Dodatkowo był artykuł o robieniu czegoś podobnego w XNA .
XNargaHuntress