¿Cómo renderizo mi juego 3D en arte ASCII?


19

Estoy tratando de crear un huevo de Pascua para un juego en 3D en Unity3D. Quiero renderizar mi juego momentáneamente en el arte ASCII.

Mi primera idea es crear un sombreador para hacer eso, pero no estoy seguro de si es la forma correcta.


con libAA o libcaca ( Link1 - Link2 resp.)
v.oddou

Respuestas:


20

No conozco ninguna solución plug and play para ello, pero aquí hay un algoritmo que funciona en el sombreador de píxeles con solo una textura como activos adicionales .

El activo requerido es una textura pequeña con una sola fila de cierto número de mosaicos, donde el más a la izquierda es el más oscuro y el más claro a la derecha.

Lo que sucede entonces es (por cuadro):

  • Tome el búfer del que desea crear una versión ASCII y reduzca su tamaño según el tamaño del mosaico (por lo tanto, si tiene mosaicos de 8x8, la imagen se reducirá 8 en ambas dimensiones).
  • Cree un nuevo destino de representación del búfer de tamaño completo original.
  • Use un sombreador de píxeles con lo siguiente:
    • Una entrada de muestra para el búfer (con muestreo establecido en el vecino más cercano) y una entrada de muestra para los mosaicos.
    • Uniformes para el tamaño de mosaico, cantidad de mosaicos y resolución de salida final
  • El sombreador de píxeles debería entonces:
    • Obtenga el valor de escala de grises del búfer reducido ( (col.r+col.g+col.b) / 3.0probablemente sea suficiente, aunque no es así como funcionan los ojos)
    • Use esta información para obtener desde qué mosaico desea renderizar ( floor(grayscale * TILE_COUNT))
    • Calcule las coordenadas X / Y del píxel de la salida y tome a esos módulos el tamaño de mosaico (tileX / tileY).
    • Devuelva como color el valor muestreado del búfer de mosaico en vec2( whichTile * TILE_WIDTH + tileX, tileY ) / vec2( TILE_WIDTH * TILE_COUNT, TILE_HEIGHT )

La página vinculada tiene varias imágenes de ejemplos, una cosa que consideraría agregar sería un poco de ruido al valor de escala de grises calculado, por lo que no es un gran bloque de MMMMMMMMMMMMMMMMs

Actualizado: @Lokkij en la sala de chat de gamedev publicó un tutorial más completo para Unity: http://pentahelix.github.io/ASCII-Tutorial-Revisited/


Solución simple que podría funcionar bastante bien (+1). Ahora estoy pensando en implementar este efecto yo mismo.
Paul Manta

2
@Sata En referencia al comentario de Kevin de que "[esto] no es exactamente cómo funcionan los ojos", aquí hay una descripción de varias formas de convertir una imagen en color a escala de grises: johndcook.com/blog/2009/08/24/…
Paul Manta

1
Puede ampliar esto para incluir parámetros adicionales como la detección de bordes, para seleccionar caracteres en función de su forma, además de la densidad / brillo.
DMGregory

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.