asciify
2026 · Herramienta en producción
Vi el vídeo de Acerola explicando su shader ASCII y quise pasar mis fotos por él. No se podía: el shader vive dentro de ReShade y espera un juego renderizando en directo, no un JPEG. Así que lo porté a Go, en CPU, sin dependencias, y le puse una web delante.
Lo interesante llegó con las fotos. El shader supone un frame de juego bien iluminado, y sobre una foto normal casi todos los píxeles caen en dos o tres de sus diez bandas de luminancia: se ven dos o tres glifos y el resto de la escala no aparece. Y en modo color tiñe cada glifo con el color exacto de su celda sobre negro, así que hasta una foto luminosa sale como motas oscuras. Dos opciones nuevas, apagadas por defecto para seguir siendo fiel al shader, lo arreglan: glifos a todo brillo sobre un lavado del color de la celda, y una ecualización de la luminancia para repartir los diez glifos.
Es un juguete, pero está montado como un servicio: la API en Cloud Run con clave, la web en otro Cloud Run con un proxy que guarda esa clave, y una galería de fotos elegidas mirando renders a tamaño real, porque a ocho píxeles por glifo la única forma de saber qué queda bien es mirarlo.
Por partes
Portar el shader
AcerolaFX es un paquete de shaders para ReShade: el efecto ASCII es una cadena de pases HLSL pensada para correr sobre un juego en marcha, no para una foto. Lo reescribí en Go sobre la CPU, con la librería estándar y nada más: diferencia de gaussianas para los bordes, cuantización de la luminancia en diez bandas y los dos atlas de glifos originales embebidos en el binario. La misma cadena sirve a una CLI, a una app de terminal y a la API, y la misma configuración produce el mismo PNG byte a byte por las tres vías.
Servirlo por una API
Un endpoint que recibe la imagen en base64 y la configuración en JSON, y devuelve el PNG. Corre en Cloud Run con una clave: el servidor guarda solo su hash y compara en tiempo constante, como el agregador del micropodcast. Otro endpoint publica lo que el motor sabe hacer, las fuentes, los valores por defecto y los límites, para que un frontend monte sus controles sin conocerlos de antemano.
La web
Una página donde soltar una foto y mover los controles: el render sigue a cada cambio con un pequeño retardo, y el último gana. El navegador nunca ve la clave; la añade un proxy en el propio servidor de la web. Y una galería de doce fotos con la configuración que las deja bien, para empezar desde un resultado en vez de desde los defaults.