ASCII Compositor Node Setup
I recently finished a 3D animated short made in Blender, set on a future Earth where semi-sentient machines rebuild ecosystems after humanity is gone. The core idea: with no humans left to see it, the only view of the world is the machine's view - and a machine doesn't see an image; it samples data and keeps only what it needs. So instead of rendering a normal beauty image, I rebuilt the world as compressed ASCII data, where every character carries functional meaning about what the machine detected.
The whole encoding system lives in Blender's compositor. Here's the full breakdown.
1. Render passes
The scene outputs the usual passes - depth, normal, position, diffuse, emission, AO — plus denoising passes. Everything downstream reads from this raw data rather than the beauty render.
2. PreASCII prep + depth mattes
All passes feed into a group that cleans them with denoise nodes and splits the Z-depth pass into three mattes - close, middle, and far. This lets me encode foreground and background at different densities later.
3. Pixelate
The image is downsampled into a grid, driven by a resolution divisor. Each block becomes one character cell - this sets the "resolution" of the ASCII.
4. Luminance banding
Each pixel cell's brightness is read and run through a ladder of Greater Than / Less Than comparators. Each pair isolates one brightness band — "brighter than X but darker than Y" — building a full tonal ramp from dark to light.
5. Character assignment
Each band is mapped to a character. The glyphs themselves are fed in as image inputs (5 per node), so I can swap in any custom character set — or solid colour blocks instead of characters. Different scene elements get their own sets, so the encoding carries functional meaning.
6. Multilayer EXR export
Every encoded layer and matte is written into one Multilayer EXR, so all the data stays intact and editable for the final composite.
7. Final composite
I bring the EXR back in, grade it with RGB curves, and build the final image from the separate layers.
Happy to answer questions about the node setup or the depth-matte logic. I'm planning to package this as a shareable node group down the line so others can use it - I'll post an update when it's ready.
















