Comment rendre mon jeu 3D en art ASCII?

19

J'essaie de créer un œuf de Pâques pour un jeu 3D dans Unity3D. Je veux rendre mon jeu momentanément dans l'art ASCII.

Ma première idée est de créer un shader pour cela, mais je ne sais pas si c'est la bonne façon.

Sata
la source
avec libaa ou libcaca ( Link1 - link2 resp.)
v.oddou

Réponses:

20

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):

  • 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

Mise à jour: @Lokkij dans le salon de discussion gamedev a publié un didacticiel plus complet pour Unity: http://pentahelix.github.io/ASCII-Tutorial-Revisited/

Elva
la source
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é.
DMGregory