L'atout requis est une petite texture avec une seule rangée d'un certain nombre de tuiles, où la plus à gauche est la plus foncée et la droite la plus claire.
Ce qui se passe alors est (par image):
Prenez le tampon dont vous voulez créer une version ASCII et réduisez-le en fonction de la taille des carreaux (donc si vous avez des carreaux 8x8, l'image sera réduite de 8 dans les deux dimensions).
Créez une nouvelle cible de rendu de la mémoire tampon d'origine.
Utilisez un pixel shader avec les éléments suivants:
Une entrée d'échantillonneur pour le tampon (avec échantillonnage réglé sur le plus proche voisin) et une entrée d'échantillonneur pour les tuiles.
Uniformes pour la taille des tuiles, la quantité de tuiles et la résolution de sortie finale
Le pixel shader doit alors:
Obtenez la valeur de l'échelle de gris à partir du tampon à échelle réduite ( (col.r+col.g+col.b) / 3.0est probablement suffisant, même si ce n'est pas tout à fait le fonctionnement des yeux)
Utilisez ces informations pour obtenir la mosaïque à partir de laquelle vous souhaitez effectuer le rendu ( floor(grayscale * TILE_COUNT))
Calculez les coordonnées pixel X / Y de la sortie et prenez la taille de tuile de ces modules (tileX / tileY).
Renvoie en couleur la valeur échantillonnée à partir du tampon de tuiles à vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )
La page liée a plusieurs images d'exemples, une chose que j'envisagerais d'ajouter serait un peu de bruit à la valeur calculée en niveaux de gris donc ce n'est pas un gros bloc de MMMMMMMMMMMMMMMMs
Solution simple qui pourrait très bien fonctionner (+1). Maintenant, je pense à mettre en œuvre cet effet moi-même.
Paul Manta
2
@Sata En référence au commentaire de Kevin selon lequel "[ce] n'est pas tout à fait le fonctionnement des yeux", voici une description de plusieurs façons de convertir une image colorée en niveaux de gris: johndcook.com/blog/2009/08/24/…
Paul Manta
1
Vous pouvez l'étendre pour inclure des paramètres supplémentaires comme la détection des contours, pour sélectionner des caractères en fonction de leur forme en plus de la densité / luminosité.
Réponses:
Je ne connais aucune solution plug-and-play pour cela, mais voici un algorithme qui fonctionne dans le pixel shader avec juste une texture comme atout supplémentaire .
L'atout requis est une petite texture avec une seule rangée d'un certain nombre de tuiles, où la plus à gauche est la plus foncée et la droite la plus claire.
Ce qui se passe alors est (par image):
(col.r+col.g+col.b) / 3.0
est probablement suffisant, même si ce n'est pas tout à fait le fonctionnement des yeux)floor(grayscale * TILE_COUNT)
)vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )
La page liée a plusieurs images d'exemples, une chose que j'envisagerais d'ajouter serait un peu de bruit à la valeur calculée en niveaux de gris donc ce n'est pas un gros bloc de
MMMMMMMMMMMMMMMM
sMise à jour: @Lokkij dans le salon de discussion gamedev a publié un didacticiel plus complet pour Unity: http://pentahelix.github.io/ASCII-Tutorial-Revisited/
la source