Aset yang diperlukan adalah tekstur kecil dengan satu baris dari beberapa ubin, di mana yang paling kiri adalah yang paling gelap dan paling kanan paling terang.
Apa yang terjadi kemudian adalah (per frame):
Ambil buffer yang ingin Anda buat versi ASCII dan turunkan dengan ukuran ubin (jadi jika Anda memiliki 8x8 ubin gambar akan diperkecil oleh 8 di kedua dimensi).
Buat target render baru dari buffer berukuran penuh asli.
Gunakan pixel shader dengan yang berikut ini:
Input sampler untuk buffer (dengan set sampling ditetapkan ke tetangga terdekat), dan input sampler untuk ubin.
Seragam untuk ukuran ubin, jumlah ubin dan resolusi keluaran akhir
Maka pixel shader harus:
Dapatkan nilai skala abu-abu dari buffer downscaled ( (col.r+col.g+col.b) / 3.0mungkin cukup, meskipun itu tidak cukup bagaimana mata bekerja)
Gunakan informasi ini untuk mendapatkan ubin yang ingin Anda render dari ( floor(grayscale * TILE_COUNT))
Hitung koordinat piksel X / Y dari output dan ambil modul itu dengan ukuran ubin (tileX / tileY).
Kembali sebagai warna, nilai sampel dari buffer ubin di vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )
Halaman yang ditautkan memiliki beberapa gambar contoh, satu hal yang saya pertimbangkan untuk menambahkan akan sedikit kebisingan untuk nilai skala abu-abu yang dihitung sehingga bukan satu blok besar MMMMMMMMMMMMMMMMs
Solusi sederhana yang bisa bekerja dengan baik (+1). Sekarang saya berpikir tentang menerapkan efek ini sendiri.
Paul Manta
2
@Sata Mengacu pada komentar Kevin bahwa "[ini] tidak cukup bagaimana mata bekerja", berikut ini adalah deskripsi beberapa cara untuk mengubah gambar berwarna menjadi skala abu-abu: johndcook.com/blog/2009/08/24/…
Paul Manta
1
Anda dapat memperluas ini untuk memasukkan parameter tambahan seperti deteksi tepi, untuk memilih karakter berdasarkan bentuknya selain kepadatan / kecerahan.
Jawaban:
Saya tidak tahu ada solusi plug and play untuk itu, tapi di sini ada algoritma yang bekerja di pixel shader hanya dengan tekstur sebagai aset tambahan .
Aset yang diperlukan adalah tekstur kecil dengan satu baris dari beberapa ubin, di mana yang paling kiri adalah yang paling gelap dan paling kanan paling terang.
Apa yang terjadi kemudian adalah (per frame):
(col.r+col.g+col.b) / 3.0
mungkin cukup, meskipun itu tidak cukup bagaimana mata bekerja)floor(grayscale * TILE_COUNT)
)vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )
Halaman yang ditautkan memiliki beberapa gambar contoh, satu hal yang saya pertimbangkan untuk menambahkan akan sedikit kebisingan untuk nilai skala abu-abu yang dihitung sehingga bukan satu blok besar
MMMMMMMMMMMMMMMM
sDiperbarui: @Lokkij di chatroom gamedev memposting tutorial yang lebih lengkap untuk Persatuan: http://pentahelix.github.io/ASCII-Tutorial-Revisited/
sumber