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
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.
Odpowiedzi:
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ę):
(col.r+col.g+col.b) / 3.0
prawdopodobnie jest wystarczająca, nawet jeśli nie tak działają oczy)floor(grayscale * TILE_COUNT)
)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
MMMMMMMMMMMMMMMM
sZaktualizowano: @Lokkij w czacie gamedev opublikował bardziej kompletny samouczek dla Unity: http://pentahelix.github.io/ASCII-Tutorial-Revisited/
źródło